Status for Dolphin Central

Recent events

2017-07-28T04:32:39.624855	{'what': '...DolphinWX relies on the order of the event IDs', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:31:47.456095	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:47.453437	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/gcdsp-ida' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:46.951963	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:46.470699	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:46.468372	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/hwtests' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:45.964426	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:45.460172	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:45.457993	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/www' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:44.971715	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:44.441792	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:44.439570	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/sadm' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:43.919185	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:43.439640	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:43.437819	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/redmine' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:42.931350	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:42.410906	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:42.408695	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/fifoci' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:41.892922	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:41.365027	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:41.362736	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/codesearch-ui' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:40.862639	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:40.336898	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:40.334532	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/dolphin' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:39.813859	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}

Recent 'build_status' events

2017-07-28T04:19:55.459701	{'service': 'pr-win-dbg-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/345', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-win-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:17:49.438328	{'service': 'pr-win-dbg-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/345', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-win-dbg-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:17:48.946421	{'service': 'pr-win-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/347', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-win-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:17:08.951964	{'service': 'pr-deb-dbg-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/346', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-deb-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:16:41.082219	{'service': 'pr-android', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/349', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-android', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:16:28.734095	{'service': 'pr-osx-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/345', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-osx-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:16:09.156562	{'service': 'pr-freebsd-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/347', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-freebsd-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:59.297399	{'service': 'pr-deb-dbg-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/346', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-deb-dbg-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:58.816220	{'service': 'pr-deb-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/346', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-deb-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:41.130309	{'service': 'pr-android', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/349', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-android', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:40.475824	{'service': 'pr-ubu-x64', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/347', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder pr-ubu-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:23.811166	{'service': 'pr-ubu-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/347', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-ubu-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:23.242673	{'service': 'lint', 'pr': 5836, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/345', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Build succeeded on builder lint', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:22.707684	{'service': 'pr-win-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/347', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-win-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:22.257699	{'service': 'pr-freebsd-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/347', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-freebsd-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:21.639108	{'service': 'pr-deb-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/346', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-deb-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:21.030279	{'service': 'lint', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/345', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder lint', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:20.436201	{'service': 'pr-osx-x64', 'pr': 5836, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/345', 'source': 'buildbot', 'shortrev': '2f9322', 'description': 'Auto build in progress on builder pr-osx-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-28T04:15:17.464992	{'service': 'default', 'pr': 5836, 'success': True, 'url': '', 'source': 'prbuilder', 'shortrev': '2f9322', 'description': 'Very basic checks passed, handed off to Buildbot.', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'build_status'}
2017-07-27T21:10:13.120876	{'service': 'default', 'pr': 5794, 'success': False, 'url': '', 'source': 'prbuilder', 'shortrev': '81fe4d', 'description': 'PR cannot be merged, please rebase.', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '81fe4d97271f377f8cd23f222ef660bce2edb190', 'type': 'build_status'}
2017-07-27T20:48:07.516283	{'service': 'pr-win-dbg-x64', 'pr': 5835, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/344', 'source': 'buildbot', 'shortrev': '2ef80d', 'description': 'Build succeeded on builder pr-win-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'build_status'}
2017-07-27T20:45:51.761021	{'service': 'pr-win-dbg-x64', 'pr': 5835, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/344', 'source': 'buildbot', 'shortrev': '2ef80d', 'description': 'Auto build in progress on builder pr-win-dbg-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'build_status'}
2017-07-27T20:45:51.123219	{'service': 'pr-win-x64', 'pr': 5835, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/346', 'source': 'buildbot', 'shortrev': '2ef80d', 'description': 'Build succeeded on builder pr-win-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'build_status'}
2017-07-27T20:45:24.125377	{'service': 'pr-deb-dbg-x64', 'pr': 5835, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/345', 'source': 'buildbot', 'shortrev': '2ef80d', 'description': 'Build succeeded on builder pr-deb-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'build_status'}
2017-07-27T20:44:48.283294	{'service': 'pr-android', 'pr': 5835, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/348', 'source': 'buildbot', 'shortrev': '2ef80d', 'description': 'Build succeeded on builder pr-android', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'build_status'}

Recent 'gh_commit_comment' events

2017-07-20T05:32:19.512592	{'author': 'leoetlino', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/db1c534b3ecddf23ad57b03c80b74de55466b062#commitcomment-23195967', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': 'db1c534b3ecddf23ad57b03c80b74de55466b062'}

Recent 'gh_issue_comment' events

2017-07-28T04:23:19.638033	{'action': 'created', 'url': 'https://github.com/dolphin-emu/sadm/pull/87#issuecomment-318555699', 'id': 87, 'source': 'ghhookparser', 'author': 'ligfx', 'body': "Yeah, that's what I had assumed too! I'm guessing that that's not possible / useful information in some more complicated cases (commits with multiple parents?).", 'safe_author': True, 'repo': 'dolphin-emu/sadm', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/sadm', 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87', 'labels_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87', 'milestone': None, 'locked': False, 'id': 246169985, 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/comments', 'assignees': [], 'created_at': '2017-07-27T21:09:18Z', 'body': 'Makes sure the baserev exists locally, in an attempt to fix the `invalid symmetric difference expression` errors. GitHub\'s "baserev" property is the current base branch head, which isn\'t guaranteed to exist in the PR branch (e.g. if it hasn\'t been rebased)!', 'events_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 87, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-28T04:23:18Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/sadm/pull/87.diff', 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87', 'patch_url': 'https://github.com/dolphin-emu/sadm/pull/87.patch', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87'}, 'labels': [], 'title': 'buildbot: fetch base rev before linting against it'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87', 'created_at': '2017-07-28T04:23:18Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'updated_at': '2017-07-28T04:23:18Z', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/comments/318555699', 'body': "Yeah, that's what I had assumed too! I'm guessing that that's not possible / useful information in some more complicated cases (commits with multiple parents?).", 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87#issuecomment-318555699', 'id': 318555699}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/sadm/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/sadm/releases{/id}', 'created_at': '2013-07-19T22:07:05Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/sadm/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/sadm/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/sadm.git', 'html_url': 'https://github.com/dolphin-emu/sadm', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/sadm/hooks', 'homepage': None, 'watchers_count': 12, 'svn_url': 'https://github.com/dolphin-emu/sadm', 'description': 'Scripts and configurations for the Dolphin Emulator infrastructure', 'full_name': 'dolphin-emu/sadm', 'branches_url': 'https://api.github.com/repos/dolphin-emu/sadm/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/sadm/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/sadm.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/sadm/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/sadm/{archive_format}{/ref}', 'name': 'sadm', 'pushed_at': '2017-07-27T21:10:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/sadm/assignees{/user}', 'updated_at': '2017-06-29T20:19:22Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/sadm/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 16, 'private': False, 'forks_count': 24, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/sadm/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/sadm/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/sadm/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/sadm', 'languages_url': 'https://api.github.com/repos/dolphin-emu/sadm/languages', 'id': 11538142, 'merges_url': 'https://api.github.com/repos/dolphin-emu/sadm/merges', 'clone_url': 'https://github.com/dolphin-emu/sadm.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/sadm/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/sadm/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/sadm/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/sadm/contents/{+path}', 'language': 'Python', 'has_pages': False, 'size': 383, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/trees{/sha}', 'open_issues': 16, 'stargazers_count': 12, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/sadm/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/sadm/notifications{?since,all,participating}', 'watchers': 12, 'forks': 24, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/events{/number}', 'has_issues': True}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'buildbot: fetch base rev before linting against it'}
2017-07-27T21:11:54.390636	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5835#issuecomment-318487800', 'id': 5835, 'source': 'ghhookparser', 'author': 'ligfx', 'body': 'Investigation resulted in dolphin-emu/sadm#87.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5835', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5835/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5835', 'milestone': None, 'locked': False, 'id': 246163056, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5835/comments', 'assignees': [], 'created_at': '2017-07-27T20:42:23Z', 'body': '', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5835/events', 'closed_at': '2017-07-27T21:11:32Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 5835, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-27T21:11:53Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5835.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5835', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5835.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5835'}, 'labels': [], 'title': '[CI TEST] lint problem, not rebased on master'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5835', 'created_at': '2017-07-27T21:11:53Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T21:11:53Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318487800', 'body': 'Investigation resulted in dolphin-emu/sadm#87.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5835#issuecomment-318487800', 'id': 318487800}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': '[CI TEST] lint problem, not rebased on master'}
2017-07-27T21:04:21.319099	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318486070', 'id': 5810, 'source': 'ghhookparser', 'author': 'spycrab', 'body': '> What do you mean?\r\n\r\nNot relevant anymore. Also updated my response.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'milestone': None, 'locked': False, 'id': 244864365, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/comments', 'assignees': [], 'created_at': '2017-07-22T18:48:28Z', 'body': 'TODO:\r\n- [x] Use INIs for configuration again\r\n- [x] Implement NetPlay Check in shutdown\r\n- [x] Implement the rest of the features\r\n- ? *Move ``GetUniqueIdentifier()`` and ``GetUniqueID()`` logic into a common function* (maybe?)\r\n\r\n*All Features are implemented, they might be horribly broken though...*\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'number': 5810, 'assignee': None, 'comments': 11, 'updated_at': '2017-07-27T21:04:20Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5810'}, 'labels': [], 'title': 'Qt: Implement Netplay'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'created_at': '2017-07-27T21:04:20Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T21:04:20Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318486070', 'body': '> What do you mean?\r\n\r\nNot relevant anymore. Also updated my response.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318486070', 'id': 318486070}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T20:42:24Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 151, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 151, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Netplay'}
2017-07-27T21:04:14.545663	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318161746', 'id': 5810, 'source': 'ghhookparser', 'author': 'spycrab', 'body': 'I took the liberty of structuring this a bit to make it more readable.\r\n### Done\r\n\r\n> Trying to connect to NetPlay causes a segfault\r\n\r\nI think I fixed that one shortly before you posted your review\r\n> NetPlayDialog::UpdateGUI: Rather than using a timer, aren\'t we guaranteed to have Update called whenever any of this information changes?\r\n\r\nDone.\r\n\r\n> It\'s weird now to have two different singletons, Settings and QtNetPlay (and Settings isn\'t entirely just settings, see NANDRefresh). Maybe this is a good time to rename Settings, and then we can combine any global NetPlay stuff into that? I\'ve been thinking of throwing it into a DolphinApplication class, since QApplications already have an instance() method and have guaranteed lifetime semantics (i.e. we create a destroy it in Main.cpp).\r\n\r\nDone.\r\n### Questionable\r\n\r\n> Why does it take forever to close the main NetPlay window? Sometimes it closes immediately, other times it takes seconds (and freezes the UI while doing so).\r\n\r\nI\'m guessing that\'s due to ``QtNetPlay::Quit()`` being time-consuming, but I\'m not 100% sure.\r\n\r\n> NetPlayDialog::OnStart: Should this "copy all relevant settings" logic be somewhere common? I don\'t know enough about NetPlay to know how important this logic is.\r\n\r\nI\'m not entirely sure... it does have some parameters that are GUI dependent.\r\n\r\n>  NetPlayDialog: does this need to be a static instance? Can\'t it be owned by MainWindow?\r\n\r\nDone.\r\n\r\n### Going to change\r\n\r\n> GameListModel is owned by GameList, but stored and passed around in places that aren\'t guaranteed to be within GameList\'s life time. (Besides, a widget should be focussed on user interaction, not mediating access to an internal model). The model should be instantiated someplace higher up (MainWindow? Settings?) and passed in to GameList.\r\n\r\nGood idea, going on my TODO list.\r\n\r\n\r\n\r\n', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'changes': {'body': {'from': 'I took the liberty of structuring this a bit to make it more readable.\r\n### Done\r\n\r\n> Trying to connect to NetPlay causes a segfault\r\n\r\nI think I fixed that one shortly before you posted your review\r\n> NetPlayDialog::UpdateGUI: Rather than using a timer, aren\'t we guaranteed to have Update called whenever any of this information changes?\r\n\r\nDone.\r\n### Questionable\r\n\r\n> Why does it take forever to close the main NetPlay window? Sometimes it closes immediately, other times it takes seconds (and freezes the UI while doing so).\r\n\r\nI\'m guessing that\'s due to ``QtNetPlay::Quit()`` being time-consuming, but I\'m not 100% sure.\r\n\r\n\r\n> NetPlayDialog::OnStart: Should this "copy all relevant settings" logic be somewhere common? I don\'t know enough about NetPlay to know how important this logic is.\r\n\r\nI\'m not entirely sure... it does have some parameters that are GUI dependent.\r\n\r\n### Going to change\r\n\r\n>  NetPlayDialog: does this need to be a static instance? Can\'t it be owned by MainWindow?\r\n\r\nNope, it really doesn\'t need to. But I hadn\'t noticed that until you pointed it out. May also fix quite a lot of segfault issues since the Dialog is currently parentless.\r\n\r\n\r\n> GameListModel is owned by GameList, but stored and passed around in places that aren\'t guaranteed to be within GameList\'s life time. (Besides, a widget should be focussed on user interaction, not mediating access to an internal model). The model should be instantiated someplace higher up (MainWindow? Settings?) and passed in to GameList.\r\n\r\nGood idea, going on my TODO list.\r\n\r\n\r\n\r\n> It\'s weird now to have two different singletons, Settings and QtNetPlay (and Settings isn\'t entirely just settings, see NANDRefresh). Maybe this is a good time to rename Settings, and then we can combine any global NetPlay stuff into that? I\'ve been thinking of throwing it into a DolphinApplication class, since QApplications already have an instance() method and have guaranteed lifetime semantics (i.e. we create a destroy it in Main.cpp).\r\n\r\nI would prefer to move it to the MainWindow, because that\'s where all NetPlay widgets will probably reside in. How should I go about passing those to  ``Settings`` (or whatever we decide to rename it to).\r\n\r\n'}}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'created_at': '2017-07-26T19:46:51Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T21:04:13Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318161746', 'body': 'I took the liberty of structuring this a bit to make it more readable.\r\n### Done\r\n\r\n> Trying to connect to NetPlay causes a segfault\r\n\r\nI think I fixed that one shortly before you posted your review\r\n> NetPlayDialog::UpdateGUI: Rather than using a timer, aren\'t we guaranteed to have Update called whenever any of this information changes?\r\n\r\nDone.\r\n\r\n> It\'s weird now to have two different singletons, Settings and QtNetPlay (and Settings isn\'t entirely just settings, see NANDRefresh). Maybe this is a good time to rename Settings, and then we can combine any global NetPlay stuff into that? I\'ve been thinking of throwing it into a DolphinApplication class, since QApplications already have an instance() method and have guaranteed lifetime semantics (i.e. we create a destroy it in Main.cpp).\r\n\r\nDone.\r\n### Questionable\r\n\r\n> Why does it take forever to close the main NetPlay window? Sometimes it closes immediately, other times it takes seconds (and freezes the UI while doing so).\r\n\r\nI\'m guessing that\'s due to ``QtNetPlay::Quit()`` being time-consuming, but I\'m not 100% sure.\r\n\r\n> NetPlayDialog::OnStart: Should this "copy all relevant settings" logic be somewhere common? I don\'t know enough about NetPlay to know how important this logic is.\r\n\r\nI\'m not entirely sure... it does have some parameters that are GUI dependent.\r\n\r\n>  NetPlayDialog: does this need to be a static instance? Can\'t it be owned by MainWindow?\r\n\r\nDone.\r\n\r\n### Going to change\r\n\r\n> GameListModel is owned by GameList, but stored and passed around in places that aren\'t guaranteed to be within GameList\'s life time. (Besides, a widget should be focussed on user interaction, not mediating access to an internal model). The model should be instantiated someplace higher up (MainWindow? Settings?) and passed in to GameList.\r\n\r\nGood idea, going on my TODO list.\r\n\r\n\r\n\r\n', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318161746', 'id': 318161746}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T20:42:24Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 151, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 151, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'milestone': None, 'locked': False, 'id': 244864365, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/comments', 'assignees': [], 'created_at': '2017-07-22T18:48:28Z', 'body': 'TODO:\r\n- [x] Use INIs for configuration again\r\n- [x] Implement NetPlay Check in shutdown\r\n- [x] Implement the rest of the features\r\n- ? *Move ``GetUniqueIdentifier()`` and ``GetUniqueID()`` logic into a common function* (maybe?)\r\n\r\n*All Features are implemented, they might be horribly broken though...*\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'number': 5810, 'assignee': None, 'comments': 11, 'updated_at': '2017-07-27T21:04:13Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5810'}, 'labels': [], 'title': 'Qt: Implement Netplay'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Netplay'}
2017-07-27T20:20:24.447378	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318475164', 'id': 5702, 'source': 'ghhookparser', 'author': 'DaRkL3AD3R', 'body': "Congrats on per-pixel lighting support! Despite the very minor and temporary stuttering, I'm still going to stick with Vulkan and Hybrid. My GPU is comfortably sitting in 2D clocks while using 5xIR. Stuttering is limited to Metroid Prime, as the worst offender for shader compilation stutter, and is only an issue very briefly on the first run. It isn't long before the game runs smooth without a hitch.\r\n\r\nOther games that were never really that much of an issue with shader stutter, are now flawless, even on Vulkan and Nvidia. This is a monumental day in Dolphin's history. Round of applause to you guys.", 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/DaRkL3AD3R/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/29787293?v=4', 'url': 'https://api.github.com/users/DaRkL3AD3R', 'gravatar_id': '', 'html_url': 'https://github.com/DaRkL3AD3R', 'id': 29787293, 'repos_url': 'https://api.github.com/users/DaRkL3AD3R/repos', 'events_url': 'https://api.github.com/users/DaRkL3AD3R/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/DaRkL3AD3R/subscriptions', 'starred_url': 'https://api.github.com/users/DaRkL3AD3R/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/DaRkL3AD3R/following{/other_user}', 'login': 'DaRkL3AD3R', 'received_events_url': 'https://api.github.com/users/DaRkL3AD3R/received_events', 'followers_url': 'https://api.github.com/users/DaRkL3AD3R/followers', 'organizations_url': 'https://api.github.com/users/DaRkL3AD3R/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 79, 'updated_at': '2017-07-27T20:20:23Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T20:20:23Z', 'user': {'gists_url': 'https://api.github.com/users/DaRkL3AD3R/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/29787293?v=4', 'url': 'https://api.github.com/users/DaRkL3AD3R', 'gravatar_id': '', 'html_url': 'https://github.com/DaRkL3AD3R', 'id': 29787293, 'repos_url': 'https://api.github.com/users/DaRkL3AD3R/repos', 'events_url': 'https://api.github.com/users/DaRkL3AD3R/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/DaRkL3AD3R/subscriptions', 'starred_url': 'https://api.github.com/users/DaRkL3AD3R/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/DaRkL3AD3R/following{/other_user}', 'login': 'DaRkL3AD3R', 'received_events_url': 'https://api.github.com/users/DaRkL3AD3R/received_events', 'followers_url': 'https://api.github.com/users/DaRkL3AD3R/followers', 'organizations_url': 'https://api.github.com/users/DaRkL3AD3R/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T20:20:23Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318475164', 'body': "Congrats on per-pixel lighting support! Despite the very minor and temporary stuttering, I'm still going to stick with Vulkan and Hybrid. My GPU is comfortably sitting in 2D clocks while using 5xIR. Stuttering is limited to Metroid Prime, as the worst offender for shader compilation stutter, and is only an issue very briefly on the first run. It isn't long before the game runs smooth without a hitch.\r\n\r\nOther games that were never really that much of an issue with shader stutter, are now flawless, even on Vulkan and Nvidia. This is a monumental day in Dolphin's history. Round of applause to you guys.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318475164', 'id': 318475164}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T19:00:34Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T18:41:41.240296	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5770#issuecomment-318450749', 'id': 5770, 'source': 'ghhookparser', 'author': 'MerryMage', 'body': 'LGTM.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/MerryMage/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/8682882?v=4', 'url': 'https://api.github.com/users/MerryMage', 'gravatar_id': '', 'html_url': 'https://github.com/MerryMage', 'id': 8682882, 'repos_url': 'https://api.github.com/users/MerryMage/repos', 'events_url': 'https://api.github.com/users/MerryMage/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/MerryMage/subscriptions', 'starred_url': 'https://api.github.com/users/MerryMage/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/MerryMage/following{/other_user}', 'login': 'MerryMage', 'received_events_url': 'https://api.github.com/users/MerryMage/received_events', 'followers_url': 'https://api.github.com/users/MerryMage/followers', 'organizations_url': 'https://api.github.com/users/MerryMage/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5770', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5770/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5770', 'milestone': None, 'locked': False, 'id': 241566538, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5770/comments', 'assignees': [], 'created_at': '2017-07-09T23:01:42Z', 'body': "Logical follow-up to #5764. Lets you control log configuration from the command line, which is cool.\r\n\r\nThe layered config code seems pretty easy to work with, though I'm not sure if I put stuff in the right places?", 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5770/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 5770, 'assignee': None, 'comments': 1, 'updated_at': '2017-07-27T18:41:40Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5770.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5770', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5770.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5770'}, 'labels': [], 'title': 'LogManager: use layered config'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5770', 'created_at': '2017-07-27T18:41:40Z', 'user': {'gists_url': 'https://api.github.com/users/MerryMage/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/8682882?v=4', 'url': 'https://api.github.com/users/MerryMage', 'gravatar_id': '', 'html_url': 'https://github.com/MerryMage', 'id': 8682882, 'repos_url': 'https://api.github.com/users/MerryMage/repos', 'events_url': 'https://api.github.com/users/MerryMage/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/MerryMage/subscriptions', 'starred_url': 'https://api.github.com/users/MerryMage/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/MerryMage/following{/other_user}', 'login': 'MerryMage', 'received_events_url': 'https://api.github.com/users/MerryMage/received_events', 'followers_url': 'https://api.github.com/users/MerryMage/followers', 'organizations_url': 'https://api.github.com/users/MerryMage/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T18:41:40Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318450749', 'body': 'LGTM.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5770#issuecomment-318450749', 'id': 318450749}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T18:19:33Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'LogManager: use layered config'}
2017-07-27T18:13:52.403316	{'action': 'deleted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5804#issuecomment-318443069', 'id': 5804, 'source': 'ghhookparser', 'author': 'spycrab', 'body': '@dolphin-emu-bot rebuild', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'deleted', 'sender': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804', 'milestone': None, 'locked': False, 'id': 244607162, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804/comments', 'assignees': [], 'created_at': '2017-07-21T09:01:03Z', 'body': '![](https://puu.sh/wPdwV/ca12b903a4.png)\r\nCurrent settings menu is on the left, menu with my additional settings on the right.\r\nI ported over the volume slider for the wiimote speaker and the checkbox toggle for enabling the rumble feature on wiimotes.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/grimpunch/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/1707054?v=4', 'url': 'https://api.github.com/users/grimpunch', 'gravatar_id': '', 'html_url': 'https://github.com/grimpunch', 'id': 1707054, 'repos_url': 'https://api.github.com/users/grimpunch/repos', 'events_url': 'https://api.github.com/users/grimpunch/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/grimpunch/subscriptions', 'starred_url': 'https://api.github.com/users/grimpunch/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/grimpunch/following{/other_user}', 'login': 'grimpunch', 'received_events_url': 'https://api.github.com/users/grimpunch/received_events', 'followers_url': 'https://api.github.com/users/grimpunch/followers', 'organizations_url': 'https://api.github.com/users/grimpunch/orgs', 'type': 'User'}, 'number': 5804, 'assignee': None, 'comments': 8, 'updated_at': '2017-07-27T18:13:37Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5804.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5804.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5804'}, 'labels': [], 'title': 'Qt: Implement Wii settings pane'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804', 'created_at': '2017-07-27T18:13:36Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T18:13:36Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318443069', 'body': '@dolphin-emu-bot rebuild', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5804#issuecomment-318443069', 'id': 318443069}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T17:59:45Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Wii settings pane'}
2017-07-27T18:13:38.073117	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5804#issuecomment-318443069', 'id': 5804, 'source': 'ghhookparser', 'author': 'spycrab', 'body': '@dolphin-emu-bot rebuild', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804', 'milestone': None, 'locked': False, 'id': 244607162, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804/comments', 'assignees': [], 'created_at': '2017-07-21T09:01:03Z', 'body': '![](https://puu.sh/wPdwV/ca12b903a4.png)\r\nCurrent settings menu is on the left, menu with my additional settings on the right.\r\nI ported over the volume slider for the wiimote speaker and the checkbox toggle for enabling the rumble feature on wiimotes.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/grimpunch/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/1707054?v=4', 'url': 'https://api.github.com/users/grimpunch', 'gravatar_id': '', 'html_url': 'https://github.com/grimpunch', 'id': 1707054, 'repos_url': 'https://api.github.com/users/grimpunch/repos', 'events_url': 'https://api.github.com/users/grimpunch/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/grimpunch/subscriptions', 'starred_url': 'https://api.github.com/users/grimpunch/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/grimpunch/following{/other_user}', 'login': 'grimpunch', 'received_events_url': 'https://api.github.com/users/grimpunch/received_events', 'followers_url': 'https://api.github.com/users/grimpunch/followers', 'organizations_url': 'https://api.github.com/users/grimpunch/orgs', 'type': 'User'}, 'number': 5804, 'assignee': None, 'comments': 7, 'updated_at': '2017-07-27T18:13:37Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5804.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5804.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5804'}, 'labels': [], 'title': 'Qt: Implement Wii settings pane'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5804', 'created_at': '2017-07-27T18:13:36Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T18:13:36Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318443069', 'body': '@dolphin-emu-bot rebuild', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5804#issuecomment-318443069', 'id': 318443069}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T17:59:45Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Wii settings pane'}
2017-07-27T16:59:22.746374	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318423353', 'id': 5702, 'source': 'ghhookparser', 'author': 'JMC47', 'body': "I don't know what the default settings are, but I'm pretty sure it can work.  @stenzek?", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 78, 'updated_at': '2017-07-27T16:59:21Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T16:59:21Z', 'user': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T16:59:21Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318423353', 'body': "I don't know what the default settings are, but I'm pretty sure it can work.  @stenzek?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318423353', 'id': 318423353}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T15:01:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T16:45:23.477783	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318419352', 'id': 5702, 'source': 'ghhookparser', 'author': 'Biofreak1987', 'body': "@JMC47 I guess Hybrid OpenGL isn't flawless for NVIDIA Cards (GTX 980)? I'm getting stutter in Metroid Prime 1 with OpenGL while in D3D it's all smooth. Tested it with the latest build.", 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/Biofreak1987/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/4711816?v=4', 'url': 'https://api.github.com/users/Biofreak1987', 'gravatar_id': '', 'html_url': 'https://github.com/Biofreak1987', 'id': 4711816, 'repos_url': 'https://api.github.com/users/Biofreak1987/repos', 'events_url': 'https://api.github.com/users/Biofreak1987/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Biofreak1987/subscriptions', 'starred_url': 'https://api.github.com/users/Biofreak1987/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Biofreak1987/following{/other_user}', 'login': 'Biofreak1987', 'received_events_url': 'https://api.github.com/users/Biofreak1987/received_events', 'followers_url': 'https://api.github.com/users/Biofreak1987/followers', 'organizations_url': 'https://api.github.com/users/Biofreak1987/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 77, 'updated_at': '2017-07-27T16:45:22Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T16:45:22Z', 'user': {'gists_url': 'https://api.github.com/users/Biofreak1987/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/4711816?v=4', 'url': 'https://api.github.com/users/Biofreak1987', 'gravatar_id': '', 'html_url': 'https://github.com/Biofreak1987', 'id': 4711816, 'repos_url': 'https://api.github.com/users/Biofreak1987/repos', 'events_url': 'https://api.github.com/users/Biofreak1987/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Biofreak1987/subscriptions', 'starred_url': 'https://api.github.com/users/Biofreak1987/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Biofreak1987/following{/other_user}', 'login': 'Biofreak1987', 'received_events_url': 'https://api.github.com/users/Biofreak1987/received_events', 'followers_url': 'https://api.github.com/users/Biofreak1987/followers', 'organizations_url': 'https://api.github.com/users/Biofreak1987/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T16:45:22Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318419352', 'body': "@JMC47 I guess Hybrid OpenGL isn't flawless for NVIDIA Cards (GTX 980)? I'm getting stutter in Metroid Prime 1 with OpenGL while in D3D it's all smooth. Tested it with the latest build.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318419352', 'id': 318419352}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T15:01:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T16:32:00.069575	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318415748', 'id': 5702, 'source': 'ghhookparser', 'author': 'tamodolo', 'body': "Thank you @JMC47 ! I'll give a try to hybrid mode as soon as I have some time.", 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/tamodolo/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/9446795?v=4', 'url': 'https://api.github.com/users/tamodolo', 'gravatar_id': '', 'html_url': 'https://github.com/tamodolo', 'id': 9446795, 'repos_url': 'https://api.github.com/users/tamodolo/repos', 'events_url': 'https://api.github.com/users/tamodolo/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/tamodolo/subscriptions', 'starred_url': 'https://api.github.com/users/tamodolo/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/tamodolo/following{/other_user}', 'login': 'tamodolo', 'received_events_url': 'https://api.github.com/users/tamodolo/received_events', 'followers_url': 'https://api.github.com/users/tamodolo/followers', 'organizations_url': 'https://api.github.com/users/tamodolo/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 76, 'updated_at': '2017-07-27T16:31:59Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T16:31:59Z', 'user': {'gists_url': 'https://api.github.com/users/tamodolo/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/9446795?v=4', 'url': 'https://api.github.com/users/tamodolo', 'gravatar_id': '', 'html_url': 'https://github.com/tamodolo', 'id': 9446795, 'repos_url': 'https://api.github.com/users/tamodolo/repos', 'events_url': 'https://api.github.com/users/tamodolo/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/tamodolo/subscriptions', 'starred_url': 'https://api.github.com/users/tamodolo/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/tamodolo/following{/other_user}', 'login': 'tamodolo', 'received_events_url': 'https://api.github.com/users/tamodolo/received_events', 'followers_url': 'https://api.github.com/users/tamodolo/followers', 'organizations_url': 'https://api.github.com/users/tamodolo/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T16:31:59Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318415748', 'body': "Thank you @JMC47 ! I'll give a try to hybrid mode as soon as I have some time.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318415748', 'id': 318415748}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T15:01:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T16:08:07.735127	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318409128', 'id': 5702, 'source': 'ghhookparser', 'author': 'JMC47', 'body': '@tamodolo try using Hybrid Ubershaders, should give you the performance you want without losing the smoothness.  In the latest ubershader builds, both D3D and OpenGL should be flawless in Hybrid.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 75, 'updated_at': '2017-07-27T16:08:06Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T16:08:06Z', 'user': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T16:08:06Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318409128', 'body': '@tamodolo try using Hybrid Ubershaders, should give you the performance you want without losing the smoothness.  In the latest ubershader builds, both D3D and OpenGL should be flawless in Hybrid.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318409128', 'id': 318409128}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T15:01:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T16:04:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T15:58:21.891111	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318406197', 'id': 5702, 'source': 'ghhookparser', 'author': 'tamodolo', 'body': "Just tested with Xenoblade and this is trully an amazing work! Dolphin finaly achieve perfect smoth gameplay! Congratulations for those involved in this magnificent effort!\r\n\r\nSaddly for now the requirements for exclusive mode is very heavy. A gtx 1080 can maintain 1080p but do suffer in 1440p. 4K isn't possible for now. So I'll be looking foward to what will come to this in the future! :D", 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/tamodolo/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/9446795?v=4', 'url': 'https://api.github.com/users/tamodolo', 'gravatar_id': '', 'html_url': 'https://github.com/tamodolo', 'id': 9446795, 'repos_url': 'https://api.github.com/users/tamodolo/repos', 'events_url': 'https://api.github.com/users/tamodolo/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/tamodolo/subscriptions', 'starred_url': 'https://api.github.com/users/tamodolo/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/tamodolo/following{/other_user}', 'login': 'tamodolo', 'received_events_url': 'https://api.github.com/users/tamodolo/received_events', 'followers_url': 'https://api.github.com/users/tamodolo/followers', 'organizations_url': 'https://api.github.com/users/tamodolo/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 74, 'updated_at': '2017-07-27T15:58:21Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T15:58:20Z', 'user': {'gists_url': 'https://api.github.com/users/tamodolo/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/9446795?v=4', 'url': 'https://api.github.com/users/tamodolo', 'gravatar_id': '', 'html_url': 'https://github.com/tamodolo', 'id': 9446795, 'repos_url': 'https://api.github.com/users/tamodolo/repos', 'events_url': 'https://api.github.com/users/tamodolo/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/tamodolo/subscriptions', 'starred_url': 'https://api.github.com/users/tamodolo/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/tamodolo/following{/other_user}', 'login': 'tamodolo', 'received_events_url': 'https://api.github.com/users/tamodolo/received_events', 'followers_url': 'https://api.github.com/users/tamodolo/followers', 'organizations_url': 'https://api.github.com/users/tamodolo/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T15:58:20Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318406197', 'body': "Just tested with Xenoblade and this is trully an amazing work! Dolphin finaly achieve perfect smoth gameplay! Congratulations for those involved in this magnificent effort!\r\n\r\nSaddly for now the requirements for exclusive mode is very heavy. A gtx 1080 can maintain 1080p but do suffer in 1440p. 4K isn't possible for now. So I'll be looking foward to what will come to this in the future! :D", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318406197', 'id': 318406197}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T15:01:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T09:53:42Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T15:02:16.904525	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318389168', 'id': 5702, 'source': 'ghhookparser', 'author': 'theboy181', 'body': 'Can someone confirm that using Dual Core option is worse with exclusive, than single core? I was getting stutter ( hickups ) in the menus, boosts at start, and lap completion until I set the option to single core.\r\n\r\nIs dual core flawed with UBER SHADERS? Latest build is amazing (with single core option)', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/theboy181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9299743?v=4', 'url': 'https://api.github.com/users/theboy181', 'gravatar_id': '', 'html_url': 'https://github.com/theboy181', 'id': 9299743, 'repos_url': 'https://api.github.com/users/theboy181/repos', 'events_url': 'https://api.github.com/users/theboy181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/theboy181/subscriptions', 'starred_url': 'https://api.github.com/users/theboy181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/theboy181/following{/other_user}', 'login': 'theboy181', 'received_events_url': 'https://api.github.com/users/theboy181/received_events', 'followers_url': 'https://api.github.com/users/theboy181/followers', 'organizations_url': 'https://api.github.com/users/theboy181/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 74, 'updated_at': '2017-07-27T15:02:15Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-27T15:02:15Z', 'user': {'gists_url': 'https://api.github.com/users/theboy181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9299743?v=4', 'url': 'https://api.github.com/users/theboy181', 'gravatar_id': '', 'html_url': 'https://github.com/theboy181', 'id': 9299743, 'repos_url': 'https://api.github.com/users/theboy181/repos', 'events_url': 'https://api.github.com/users/theboy181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/theboy181/subscriptions', 'starred_url': 'https://api.github.com/users/theboy181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/theboy181/following{/other_user}', 'login': 'theboy181', 'received_events_url': 'https://api.github.com/users/theboy181/received_events', 'followers_url': 'https://api.github.com/users/theboy181/followers', 'organizations_url': 'https://api.github.com/users/theboy181/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T15:02:15Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318389168', 'body': 'Can someone confirm that using Dual Core option is worse with exclusive, than single core? I was getting stutter ( hickups ) in the menus, boosts at start, and lap completion until I set the option to single core.\r\n\r\nIs dual core flawed with UBER SHADERS? Latest build is amazing (with single core option)', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-318389168', 'id': 318389168}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T15:01:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T09:53:42Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-27T14:23:04.535554	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5834#issuecomment-318377242', 'id': 5834, 'source': 'ghhookparser', 'author': 'BigheadSMZ', 'body': 'I fully converted the Xenoblade pack to BC7 (including using my method to create custom mipmaps) and everything seems to work perfect. I immediately noticed a significant increase in quality over DXT1/DXT5. Thanks a lot for this! ', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/BigheadSMZ/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/9309452?v=4', 'url': 'https://api.github.com/users/BigheadSMZ', 'gravatar_id': '', 'html_url': 'https://github.com/BigheadSMZ', 'id': 9309452, 'repos_url': 'https://api.github.com/users/BigheadSMZ/repos', 'events_url': 'https://api.github.com/users/BigheadSMZ/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/BigheadSMZ/subscriptions', 'starred_url': 'https://api.github.com/users/BigheadSMZ/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/BigheadSMZ/following{/other_user}', 'login': 'BigheadSMZ', 'received_events_url': 'https://api.github.com/users/BigheadSMZ/received_events', 'followers_url': 'https://api.github.com/users/BigheadSMZ/followers', 'organizations_url': 'https://api.github.com/users/BigheadSMZ/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5834', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5834/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5834', 'milestone': None, 'locked': False, 'id': 246017494, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5834/comments', 'assignees': [], 'created_at': '2017-07-27T12:02:45Z', 'body': 'Easy one to add. Feature was requested in this issue: https://bugs.dolphin-emu.org/issues/10409\r\nVery brief testing on my part seems to work fine.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5834/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5834, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-27T14:23:03Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5834.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5834', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5834.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5834'}, 'labels': [], 'title': 'Support loading BC7 (BPTC) textures from DDS files'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5834', 'created_at': '2017-07-27T14:23:03Z', 'user': {'gists_url': 'https://api.github.com/users/BigheadSMZ/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/9309452?v=4', 'url': 'https://api.github.com/users/BigheadSMZ', 'gravatar_id': '', 'html_url': 'https://github.com/BigheadSMZ', 'id': 9309452, 'repos_url': 'https://api.github.com/users/BigheadSMZ/repos', 'events_url': 'https://api.github.com/users/BigheadSMZ/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/BigheadSMZ/subscriptions', 'starred_url': 'https://api.github.com/users/BigheadSMZ/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/BigheadSMZ/following{/other_user}', 'login': 'BigheadSMZ', 'received_events_url': 'https://api.github.com/users/BigheadSMZ/received_events', 'followers_url': 'https://api.github.com/users/BigheadSMZ/followers', 'organizations_url': 'https://api.github.com/users/BigheadSMZ/orgs', 'type': 'User'}, 'updated_at': '2017-07-27T14:23:03Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318377242', 'body': 'I fully converted the Xenoblade pack to BC7 (including using my method to create custom mipmaps) and everything seems to work perfect. I immediately noticed a significant increase in quality over DXT1/DXT5. Thanks a lot for this! ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5834#issuecomment-318377242', 'id': 318377242}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T13:18:08Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T09:53:42Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344416, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Support loading BC7 (BPTC) textures from DDS files'}
2017-07-26T22:46:51.257020	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5829#issuecomment-318204810', 'id': 5829, 'source': 'ghhookparser', 'author': 'ligfx', 'body': '@spycrab @Starsam80 ', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5829', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5829/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5829', 'milestone': None, 'locked': False, 'id': 245601624, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5829/comments', 'assignees': [], 'created_at': '2017-07-26T04:15:22Z', 'body': 'This is the thing that pops up a message box when something goes wrong, or when you want to override a previously dumped file, etc.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5829/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 5829, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-26T22:46:50Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5829.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5829', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5829.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5829'}, 'labels': [], 'title': 'Qt: register MsgAlertHandler'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5829', 'created_at': '2017-07-26T22:46:50Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T22:46:50Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318204810', 'body': '@spycrab @Starsam80 ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5829#issuecomment-318204810', 'id': 318204810}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T20:33:44Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T19:42:20Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 154, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 154, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: register MsgAlertHandler'}
2017-07-26T22:46:28.581119	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318204737', 'id': 5810, 'source': 'ghhookparser', 'author': 'ligfx', 'body': "> I would prefer to move it to the MainWindow, because that's where all NetPlay widgets will probably reside in.\r\n\r\nOh yeah, if you can make something _not_ global, that's probably the better way to do it!\r\n\r\n> How should I go about passing those to Settings (or whatever we decide to rename it to).\r\n\r\nWhat do you mean?\r\n", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'milestone': None, 'locked': False, 'id': 244864365, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/comments', 'assignees': [], 'created_at': '2017-07-22T18:48:28Z', 'body': 'TODO:\r\n- [x] Use INIs for configuration again\r\n- [x] Implement NetPlay Check in shutdown\r\n- [x] Implement the rest of the features\r\n- ? *Move ``GetUniqueIdentifier()`` and ``GetUniqueID()`` logic into a common function* (maybe?)\r\n\r\n*All Features are implemented, they might be horribly broken though...*\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'number': 5810, 'assignee': None, 'comments': 10, 'updated_at': '2017-07-26T22:46:28Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5810'}, 'labels': [], 'title': 'Qt: Implement Netplay'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'created_at': '2017-07-26T22:46:28Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T22:46:28Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318204737', 'body': "> I would prefer to move it to the MainWindow, because that's where all NetPlay widgets will probably reside in.\r\n\r\nOh yeah, if you can make something _not_ global, that's probably the better way to do it!\r\n\r\n> How should I go about passing those to Settings (or whatever we decide to rename it to).\r\n\r\nWhat do you mean?\r\n", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318204737', 'id': 318204737}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T20:33:44Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T19:42:20Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 154, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 154, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Netplay'}
2017-07-26T19:46:52.138601	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318161746', 'id': 5810, 'source': 'ghhookparser', 'author': 'spycrab', 'body': 'I took the liberty of structuring this a bit to make it more readable.\r\n### Done\r\n\r\n> Trying to connect to NetPlay causes a segfault\r\n\r\nI think I fixed that one shortly before you posted your review\r\n> NetPlayDialog::UpdateGUI: Rather than using a timer, aren\'t we guaranteed to have Update called whenever any of this information changes?\r\n\r\nDone.\r\n### Questionable\r\n\r\n> Why does it take forever to close the main NetPlay window? Sometimes it closes immediately, other times it takes seconds (and freezes the UI while doing so).\r\n\r\nI\'m guessing that\'s due to ``QtNetPlay::Quit()`` being time-consuming, but I\'m not 100% sure.\r\n\r\n\r\n> NetPlayDialog::OnStart: Should this "copy all relevant settings" logic be somewhere common? I don\'t know enough about NetPlay to know how important this logic is.\r\n\r\nI\'m not entirely sure... it does have some parameters that are GUI dependent.\r\n\r\n### Going to change\r\n\r\n>  NetPlayDialog: does this need to be a static instance? Can\'t it be owned by MainWindow?\r\n\r\nNope, it really doesn\'t need to. But I hadn\'t noticed that until you pointed it out. May also fix quite a lot of segfault issues since the Dialog is currently parentless.\r\n\r\n\r\n> GameListModel is owned by GameList, but stored and passed around in places that aren\'t guaranteed to be within GameList\'s life time. (Besides, a widget should be focussed on user interaction, not mediating access to an internal model). The model should be instantiated someplace higher up (MainWindow? Settings?) and passed in to GameList.\r\n\r\nGood idea, going on my TODO list.\r\n\r\n\r\n\r\n> It\'s weird now to have two different singletons, Settings and QtNetPlay (and Settings isn\'t entirely just settings, see NANDRefresh). Maybe this is a good time to rename Settings, and then we can combine any global NetPlay stuff into that? I\'ve been thinking of throwing it into a DolphinApplication class, since QApplications already have an instance() method and have guaranteed lifetime semantics (i.e. we create a destroy it in Main.cpp).\r\n\r\nI would prefer to move it to the MainWindow, because that\'s where all NetPlay widgets will probably reside in. How should I go about passing those to  ``Settings`` (or whatever we decide to rename it to).\r\n\r\n', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'milestone': None, 'locked': False, 'id': 244864365, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/comments', 'assignees': [], 'created_at': '2017-07-22T18:48:28Z', 'body': 'TODO:\r\n- [x] Use INIs for configuration again\r\n- [x] Implement NetPlay Check in shutdown\r\n- [x] Implement the rest of the features\r\n- ? *Move ``GetUniqueIdentifier()`` and ``GetUniqueID()`` logic into a common function* (maybe?)\r\n\r\n*All Features are implemented, they might be horribly broken though...*\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'number': 5810, 'assignee': None, 'comments': 9, 'updated_at': '2017-07-26T19:46:51Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5810'}, 'labels': [], 'title': 'Qt: Implement Netplay'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'created_at': '2017-07-26T19:46:51Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T19:46:51Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318161746', 'body': 'I took the liberty of structuring this a bit to make it more readable.\r\n### Done\r\n\r\n> Trying to connect to NetPlay causes a segfault\r\n\r\nI think I fixed that one shortly before you posted your review\r\n> NetPlayDialog::UpdateGUI: Rather than using a timer, aren\'t we guaranteed to have Update called whenever any of this information changes?\r\n\r\nDone.\r\n### Questionable\r\n\r\n> Why does it take forever to close the main NetPlay window? Sometimes it closes immediately, other times it takes seconds (and freezes the UI while doing so).\r\n\r\nI\'m guessing that\'s due to ``QtNetPlay::Quit()`` being time-consuming, but I\'m not 100% sure.\r\n\r\n\r\n> NetPlayDialog::OnStart: Should this "copy all relevant settings" logic be somewhere common? I don\'t know enough about NetPlay to know how important this logic is.\r\n\r\nI\'m not entirely sure... it does have some parameters that are GUI dependent.\r\n\r\n### Going to change\r\n\r\n>  NetPlayDialog: does this need to be a static instance? Can\'t it be owned by MainWindow?\r\n\r\nNope, it really doesn\'t need to. But I hadn\'t noticed that until you pointed it out. May also fix quite a lot of segfault issues since the Dialog is currently parentless.\r\n\r\n\r\n> GameListModel is owned by GameList, but stored and passed around in places that aren\'t guaranteed to be within GameList\'s life time. (Besides, a widget should be focussed on user interaction, not mediating access to an internal model). The model should be instantiated someplace higher up (MainWindow? Settings?) and passed in to GameList.\r\n\r\nGood idea, going on my TODO list.\r\n\r\n\r\n\r\n> It\'s weird now to have two different singletons, Settings and QtNetPlay (and Settings isn\'t entirely just settings, see NANDRefresh). Maybe this is a good time to rename Settings, and then we can combine any global NetPlay stuff into that? I\'ve been thinking of throwing it into a DolphinApplication class, since QApplications already have an instance() method and have guaranteed lifetime semantics (i.e. we create a destroy it in Main.cpp).\r\n\r\nI would prefer to move it to the MainWindow, because that\'s where all NetPlay widgets will probably reside in. How should I go about passing those to  ``Settings`` (or whatever we decide to rename it to).\r\n\r\n', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-318161746', 'id': 318161746}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3478, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T19:35:17Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T19:42:20Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3478, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3478, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Netplay'}
2017-07-26T13:03:33.453023	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-317906806', 'id': 5702, 'source': 'ghhookparser', 'author': 'ZexaronS', 'body': '@JonnyH Wouldn\'t it be a lot easier for the whole project to be a bit less hungry for going as much compatability as possible ... lot\'s of cases I\'ve seen this urge to support +10 year old HW, it\'s nice for culture and retro, but for a serious run? - Like running dolphin on some 15 year old PC might be interesting news article, but would anyone seriously bother with that? I\'d rather have a separate project of something that\'s not meant to be seriously used, but just for the kicks, like: \r\n\r\n> oh look I made this thingy for amiga or windows 3.1, but in order to play actual practial version you\'ll need to have DX12 level Hardware\r\n\r\nFor example, there\'s a new project to enhance the engine for Generals ZeroHour called #Thyme (freenode channel also) and while I have big respect for the original author who is also devoting his time into creating the core which takes deep C++ skills, he\'s also targeting something like OGL 3.2, which isn\'t that bad now that I looked at it more but still it\'s ... from 2009 and DX9 level, compatability wise that\'s great, but if I\'m doing something in 2017, and when I\'m done with it til it\'s practical and call it 1.0 ver, it\'ll be 2 year later, and then you would want to do something you couldn\'t do ever before, have a ton of units/draw calls that won\'t hurt perf much, but you still can\'t do that because you support a lot of old compatability stuff, so imo I would just skip OGL and put my effort into Vulkan, after that demoes there would be more people WOWed and they could chime in to get an OGL port going, but it seems that people always go tend to go the "babysitter" way for some reason.\r\n\r\nI\'m not against compatability, I\'m just the other way around, building it for myself first, and then sharing it, in a lesser fashion or so, which is perfectly fair, the people who don\'t put any work or effort into something should be the ones further down the waiting line.\r\n\r\nBut, just my opinion, it\'s a little rant which you can ignore, but I\'m not upset or anything, just saying.', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/ZexaronS/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/20824154?v=4', 'url': 'https://api.github.com/users/ZexaronS', 'gravatar_id': '', 'html_url': 'https://github.com/ZexaronS', 'id': 20824154, 'repos_url': 'https://api.github.com/users/ZexaronS/repos', 'events_url': 'https://api.github.com/users/ZexaronS/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ZexaronS/subscriptions', 'starred_url': 'https://api.github.com/users/ZexaronS/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ZexaronS/following{/other_user}', 'login': 'ZexaronS', 'received_events_url': 'https://api.github.com/users/ZexaronS/received_events', 'followers_url': 'https://api.github.com/users/ZexaronS/followers', 'organizations_url': 'https://api.github.com/users/ZexaronS/orgs', 'type': 'User'}, 'changes': {'body': {'from': '@JonnyH Wouldn\'t it be a lot easier for the whole project to be a bit less hungry for going as much compatability as possible ... lot\'s of cases I\'ve seen this urge to support +10 year old HW, it\'s nice for culture and retro, but for a serious run? - Like running dolphin on some 15 year old PC might be interesting news article, but would anyone seriously bother with that? I\'d rather have a separate project of something that\'s not meant to be seriously used, but just for the kicks, like: \r\n\r\n> oh look I made this thingy for amiga or windows 3.1, but in order to play actual practial version you\'ll need to have DX12 level Hardware\r\n\r\nFor example, there\'s a new project to enhance the engine for Generals ZeroHour called #Thyme (freenode channel also) and while I have big respect for the original author who is also devoting his time into creating the core which takes , he\'s also targeting something like OGL 3.2, which isn\'t that bad now that I looked at it more but still it\'s ... from 2009 and DX9 level, compatability wise that\'s great, but if I\'m doing something in 2017, and when I\'m done with it til it\'s practical and call it 1.0 ver, it\'ll be 2 year later, and then you would want to do something you couldn\'t do ever before, have a ton of units/draw calls that won\'t hurt perf much, but you still can\'t do that because you support a lot of old stuff, so imo I would just skip OGL and put my effort into Vulkan, after that demoes there would be more people WOWed and they could chime in to get an OGL port going, but it seems that people always go tend to go the "babysitter" way for some reason.\r\n\r\nI\'m not against compatability, I\'m just the other way around, building it for myself first, and then sharing it, in a lesser fashion or so, which is perfectly fair, the people who don\'t put any work or effort into something should be the ones further down the waiting line.\r\n\r\nBut, just my opinion, it\'s a little rant which you can ignore, but I\'m not upset or anything, just saying.'}}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-25T23:57:37Z', 'user': {'gists_url': 'https://api.github.com/users/ZexaronS/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/20824154?v=4', 'url': 'https://api.github.com/users/ZexaronS', 'gravatar_id': '', 'html_url': 'https://github.com/ZexaronS', 'id': 20824154, 'repos_url': 'https://api.github.com/users/ZexaronS/repos', 'events_url': 'https://api.github.com/users/ZexaronS/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ZexaronS/subscriptions', 'starred_url': 'https://api.github.com/users/ZexaronS/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ZexaronS/following{/other_user}', 'login': 'ZexaronS', 'received_events_url': 'https://api.github.com/users/ZexaronS/received_events', 'followers_url': 'https://api.github.com/users/ZexaronS/followers', 'organizations_url': 'https://api.github.com/users/ZexaronS/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T13:03:32Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/317906806', 'body': '@JonnyH Wouldn\'t it be a lot easier for the whole project to be a bit less hungry for going as much compatability as possible ... lot\'s of cases I\'ve seen this urge to support +10 year old HW, it\'s nice for culture and retro, but for a serious run? - Like running dolphin on some 15 year old PC might be interesting news article, but would anyone seriously bother with that? I\'d rather have a separate project of something that\'s not meant to be seriously used, but just for the kicks, like: \r\n\r\n> oh look I made this thingy for amiga or windows 3.1, but in order to play actual practial version you\'ll need to have DX12 level Hardware\r\n\r\nFor example, there\'s a new project to enhance the engine for Generals ZeroHour called #Thyme (freenode channel also) and while I have big respect for the original author who is also devoting his time into creating the core which takes deep C++ skills, he\'s also targeting something like OGL 3.2, which isn\'t that bad now that I looked at it more but still it\'s ... from 2009 and DX9 level, compatability wise that\'s great, but if I\'m doing something in 2017, and when I\'m done with it til it\'s practical and call it 1.0 ver, it\'ll be 2 year later, and then you would want to do something you couldn\'t do ever before, have a ton of units/draw calls that won\'t hurt perf much, but you still can\'t do that because you support a lot of old compatability stuff, so imo I would just skip OGL and put my effort into Vulkan, after that demoes there would be more people WOWed and they could chime in to get an OGL port going, but it seems that people always go tend to go the "babysitter" way for some reason.\r\n\r\nI\'m not against compatability, I\'m just the other way around, building it for myself first, and then sharing it, in a lesser fashion or so, which is perfectly fair, the people who don\'t put any work or effort into something should be the ones further down the waiting line.\r\n\r\nBut, just my opinion, it\'s a little rant which you can ignore, but I\'m not upset or anything, just saying.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-317906806', 'id': 317906806}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T09:15:44Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 73, 'updated_at': '2017-07-26T13:03:32Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}
2017-07-26T11:09:10.339800	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-318022579', 'id': 5807, 'source': 'ghhookparser', 'author': 'leoetlino', 'body': '@mimimi085181  `Wiimote::Connect` locks the mutex itself, so we need to unlock before calling it to avoid a deadlock.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'changes': {'body': {'from': '@mimimi `Wiimote::Connect` locks the mutex itself, so we need to unlock before calling it to avoid a deadlock.'}}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'created_at': '2017-07-26T11:08:23Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T11:09:09Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318022579', 'body': '@mimimi085181  `Wiimote::Connect` locks the mutex itself, so we need to unlock before calling it to avoid a deadlock.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-318022579', 'id': 318022579}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T09:15:44Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'milestone': None, 'locked': False, 'id': 244849415, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/comments', 'assignees': [], 'created_at': '2017-07-22T14:10:08Z', 'body': 'There\'s no good reason for the Wiimote connect code to be part of the Host interface, and have that called from both the UI code and the core. And then hack around it by having "force connect" events whenever Host_ConnectWiimote is called from the core...\r\n\r\nThis also makes Wiimote connections unnecessarily undeterministic and complicated, since calling Host_ConnectWiimote queues a connection on the host thread, which then has to call PauseAndLock. This is true even when Host_ConnectWiimote is called from the CPU thread.\r\n\r\nThis PR gets rid of that nonsense and replaces Host_ConnectWiimote with Wiimote::Connect, that does the actual connection/disconnection and should always be called from the CPU thread.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 5807, 'assignee': None, 'comments': 8, 'updated_at': '2017-07-26T11:09:09Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5807'}, 'labels': [], 'title': 'Move the Wiimote connect code out of Host'}}, 'type': 'gh_issue_comment', 'title': 'Move the Wiimote connect code out of Host'}
2017-07-26T11:08:24.165410	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-318022579', 'id': 5807, 'source': 'ghhookparser', 'author': 'leoetlino', 'body': '@mimimi `Wiimote::Connect` locks the mutex itself, so we need to unlock before calling it to avoid a deadlock.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'milestone': None, 'locked': False, 'id': 244849415, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/comments', 'assignees': [], 'created_at': '2017-07-22T14:10:08Z', 'body': 'There\'s no good reason for the Wiimote connect code to be part of the Host interface, and have that called from both the UI code and the core. And then hack around it by having "force connect" events whenever Host_ConnectWiimote is called from the core...\r\n\r\nThis also makes Wiimote connections unnecessarily undeterministic and complicated, since calling Host_ConnectWiimote queues a connection on the host thread, which then has to call PauseAndLock. This is true even when Host_ConnectWiimote is called from the CPU thread.\r\n\r\nThis PR gets rid of that nonsense and replaces Host_ConnectWiimote with Wiimote::Connect, that does the actual connection/disconnection and should always be called from the CPU thread.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 5807, 'assignee': None, 'comments': 7, 'updated_at': '2017-07-26T11:08:23Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5807'}, 'labels': [], 'title': 'Move the Wiimote connect code out of Host'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'created_at': '2017-07-26T11:08:23Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T11:08:23Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/318022579', 'body': '@mimimi `Wiimote::Connect` locks the mutex itself, so we need to unlock before calling it to avoid a deadlock.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-318022579', 'id': 318022579}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T09:15:44Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Move the Wiimote connect code out of Host'}
2017-07-26T08:08:45.089910	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-317981027', 'id': 5807, 'source': 'ghhookparser', 'author': 'JMC47', 'body': 'I was able to connect and disconnect a Real Wii Remote without it crashing.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'milestone': None, 'locked': False, 'id': 244849415, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/comments', 'assignees': [], 'created_at': '2017-07-22T14:10:08Z', 'body': 'There\'s no good reason for the Wiimote connect code to be part of the Host interface, and have that called from both the UI code and the core. And then hack around it by having "force connect" events whenever Host_ConnectWiimote is called from the core...\r\n\r\nThis also makes Wiimote connections unnecessarily undeterministic and complicated, since calling Host_ConnectWiimote queues a connection on the host thread, which then has to call PauseAndLock. This is true even when Host_ConnectWiimote is called from the CPU thread.\r\n\r\nThis PR gets rid of that nonsense and replaces Host_ConnectWiimote with Wiimote::Connect, that does the actual connection/disconnection and should always be called from the CPU thread.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 5807, 'assignee': None, 'comments': 6, 'updated_at': '2017-07-26T08:08:44Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5807'}, 'labels': [], 'title': 'Move the Wiimote connect code out of Host'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'created_at': '2017-07-26T08:08:44Z', 'user': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T08:08:44Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/317981027', 'body': 'I was able to connect and disconnect a Real Wii Remote without it crashing.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-317981027', 'id': 317981027}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T06:04:32Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Move the Wiimote connect code out of Host'}
2017-07-26T07:13:04.916436	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-317968912', 'id': 5810, 'source': 'ghhookparser', 'author': 'mimimi085181', 'body': "I can't test it, because it instant crashes after selecting qt from the nag screen:\r\nProblem signature:\r\n  Problem Event Name:\tAPPCRASH\r\n  Application Name:\tDolphinQt2 pr-5810.exe\r\n  Application Version:\t0.0.0.0\r\n  Application Timestamp:\t59784418\r\n  Fault Module Name:\tQt5Widgets.dll\r\n  Fault Module Version:\t5.9.0.0\r\n  Fault Module Timestamp:\t5928572b\r\n  Exception Code:\tc0000005\r\n  Exception Offset:\t000000000004b516\r\n  OS Version:\t6.1.7601.2.1.0.256.48\r\n  Locale ID:\t1031\r\n  Additional Information 1:\t7d33\r\n  Additional Information 2:\t7d336869c75c3c42b37b58551342880e\r\n  Additional Information 3:\te79c\r\n  Additional Information 4:\te79c5e4f99cd1f2f61da4311d417390a", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'milestone': None, 'locked': False, 'id': 244864365, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/comments', 'assignees': [], 'created_at': '2017-07-22T18:48:28Z', 'body': 'TODO:\r\n- [x] Use INIs for configuration again\r\n- [x] Implement NetPlay Check in shutdown\r\n- [x] Implement the rest of the features\r\n- ? *Move ``GetUniqueIdentifier()`` and ``GetUniqueID()`` logic into a common function* (maybe?)\r\n\r\n*All Features are implemented, they might be horribly broken though...*\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'number': 5810, 'assignee': None, 'comments': 8, 'updated_at': '2017-07-26T07:13:03Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5810.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5810'}, 'labels': [], 'title': 'Qt: Implement Netplay'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5810', 'created_at': '2017-07-26T07:13:03Z', 'user': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T07:13:03Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/317968912', 'body': "I can't test it, because it instant crashes after selecting qt from the nag screen:\r\nProblem signature:\r\n  Problem Event Name:\tAPPCRASH\r\n  Application Name:\tDolphinQt2 pr-5810.exe\r\n  Application Version:\t0.0.0.0\r\n  Application Timestamp:\t59784418\r\n  Fault Module Name:\tQt5Widgets.dll\r\n  Fault Module Version:\t5.9.0.0\r\n  Fault Module Timestamp:\t5928572b\r\n  Exception Code:\tc0000005\r\n  Exception Offset:\t000000000004b516\r\n  OS Version:\t6.1.7601.2.1.0.256.48\r\n  Locale ID:\t1031\r\n  Additional Information 1:\t7d33\r\n  Additional Information 2:\t7d336869c75c3c42b37b58551342880e\r\n  Additional Information 3:\te79c\r\n  Additional Information 4:\te79c5e4f99cd1f2f61da4311d417390a", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5810#issuecomment-317968912', 'id': 317968912}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T06:04:32Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: Implement Netplay'}
2017-07-26T07:00:28.163380	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-317966539', 'id': 5807, 'source': 'ghhookparser', 'author': 'mimimi085181', 'body': 'So i finally got around to testing this, and everything seems to still work, emulated wiimotes, real wiimotes(using a Dolphinbar) and passthrough mode. Tested with the disconnect in the home screen and es_launch titles(MP3 in MPT).\r\n\r\nCan\'t say anything about the code though, couldn\'t spot any problems, but i don\'t understand the code, so... Well, there\'s one thing that i don\'t understand, why did you move "g_wiimotes_mutex.unlock();" and does that impact anything?\r\n\r\nReminder for reviewers, https://github.com/dolphin-emu/dolphin/pull/4949 is blocked until this pr is merged, because it doesn\'t work without it.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'milestone': None, 'locked': False, 'id': 244849415, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/comments', 'assignees': [], 'created_at': '2017-07-22T14:10:08Z', 'body': 'There\'s no good reason for the Wiimote connect code to be part of the Host interface, and have that called from both the UI code and the core. And then hack around it by having "force connect" events whenever Host_ConnectWiimote is called from the core...\r\n\r\nThis also makes Wiimote connections unnecessarily undeterministic and complicated, since calling Host_ConnectWiimote queues a connection on the host thread, which then has to call PauseAndLock. This is true even when Host_ConnectWiimote is called from the CPU thread.\r\n\r\nThis PR gets rid of that nonsense and replaces Host_ConnectWiimote with Wiimote::Connect, that does the actual connection/disconnection and should always be called from the CPU thread.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 5807, 'assignee': None, 'comments': 5, 'updated_at': '2017-07-26T07:00:27Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5807.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5807'}, 'labels': [], 'title': 'Move the Wiimote connect code out of Host'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5807', 'created_at': '2017-07-26T07:00:27Z', 'user': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T07:00:27Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/317966539', 'body': 'So i finally got around to testing this, and everything seems to still work, emulated wiimotes, real wiimotes(using a Dolphinbar) and passthrough mode. Tested with the disconnect in the home screen and es_launch titles(MP3 in MPT).\r\n\r\nCan\'t say anything about the code though, couldn\'t spot any problems, but i don\'t understand the code, so... Well, there\'s one thing that i don\'t understand, why did you move "g_wiimotes_mutex.unlock();" and does that impact anything?\r\n\r\nReminder for reviewers, https://github.com/dolphin-emu/dolphin/pull/4949 is blocked until this pr is merged, because it doesn\'t work without it.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5807#issuecomment-317966539', 'id': 317966539}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T06:04:32Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Move the Wiimote connect code out of Host'}
2017-07-26T06:10:35.034827	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-317957719', 'id': 5702, 'source': 'ghhookparser', 'author': 'JMC47', 'body': "We can't control variant generation on vulkan\n\nOn Wed, Jul 26, 2017, 1:50 AM DaRkL3AD3R <notifications@github.com> wrote:\n\n> 0 stuttering under D3D11. Guess Vulkan just can't keep up?\n>\n> —\n> You are receiving this because you were mentioned.\n> Reply to this email directly, view it on GitHub\n> <https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-317954557>,\n> or mute the thread\n> <https://github.com/notifications/unsubscribe-auth/AGSuQZMWvs_HDwDI4179RcmAWmDo15Vvks5sRtOhgaJpZM4OGKqC>\n> .\n>\n", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'milestone': None, 'locked': False, 'id': 238742308, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'comments': 72, 'updated_at': '2017-07-26T06:10:33Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'labels': [], 'title': 'Ubershaders 2.0'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'created_at': '2017-07-26T06:10:32Z', 'user': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'updated_at': '2017-07-26T06:10:32Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/317957719', 'body': "We can't control variant generation on vulkan\n\nOn Wed, Jul 26, 2017, 1:50 AM DaRkL3AD3R <notifications@github.com> wrote:\n\n> 0 stuttering under D3D11. Guess Vulkan just can't keep up?\n>\n> —\n> You are receiving this because you were mentioned.\n> Reply to this email directly, view it on GitHub\n> <https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-317954557>,\n> or mute the thread\n> <https://github.com/notifications/unsubscribe-auth/AGSuQZMWvs_HDwDI4179RcmAWmDo15Vvks5sRtOhgaJpZM4OGKqC>\n> .\n>\n", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#issuecomment-317957719', 'id': 317957719}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3480, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-26T06:04:32Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-26T05:33:47Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 152, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344291, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 152, 'stargazers_count': 3480, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3480, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Ubershaders 2.0'}

Recent 'gh_pull_request' events

2017-07-28T04:20:04.098459	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5836', 'id': 5836, 'source': 'ghhookparser', 'head_ref_name': 'patch-1', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'gh_pull_request', 'title': 'LogManager: remove stand-alone semicolon'}
2017-07-28T04:15:16.347252	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'opened', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5836', 'id': 5836, 'source': 'ghhookparser', 'head_ref_name': 'patch-1', 'author': 'ligfx', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'type': 'gh_pull_request', 'title': 'LogManager: remove stand-alone semicolon'}
2017-07-27T21:11:33.400326	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5835', 'id': 5835, 'source': 'ghhookparser', 'head_ref_name': 'testlint', 'author': 'ligfx', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'gh_pull_request', 'title': '[CI TEST] lint problem, not rebased on master'}
2017-07-27T21:10:35.769756	{'base_sha': 'ca777b98b3877e529ca709d4c77dcdc9fe06a4a8', 'action': 'edited', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/sadm/pull/87', 'id': 87, 'source': 'ghhookparser', 'head_ref_name': 'lintfetch', 'author': 'ligfx', 'safe_author': True, 'repo': 'dolphin-emu/sadm', 'head_sha': 'c990886e4c87b595353f6f858f6f799e54fdbc8a', 'type': 'gh_pull_request', 'title': 'buildbot: fetch base rev before linting against it'}
2017-07-27T21:10:29.814273	{'base_sha': 'ca777b98b3877e529ca709d4c77dcdc9fe06a4a8', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/sadm/pull/87', 'id': 87, 'source': 'ghhookparser', 'head_ref_name': 'lintfetch', 'author': 'ligfx', 'safe_author': True, 'repo': 'dolphin-emu/sadm', 'head_sha': 'c990886e4c87b595353f6f858f6f799e54fdbc8a', 'type': 'gh_pull_request', 'title': 'buildbot: fetch base rev before linting against it'}
2017-07-27T21:10:11.938927	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5794', 'id': 5794, 'source': 'ghhookparser', 'head_ref_name': 'qt_menubar', 'author': 'spycrab', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '81fe4d97271f377f8cd23f222ef660bce2edb190', 'type': 'gh_pull_request', 'title': 'Qt: Overhaul menubar'}
2017-07-27T21:09:19.424136	{'base_sha': 'ca777b98b3877e529ca709d4c77dcdc9fe06a4a8', 'action': 'opened', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/sadm/pull/87', 'id': 87, 'source': 'ghhookparser', 'head_ref_name': 'lintfetch', 'author': 'ligfx', 'safe_author': True, 'repo': 'dolphin-emu/sadm', 'head_sha': 'b83fe32e581f7733ae1c53f761763f9f8a72bfb8', 'type': 'gh_pull_request', 'title': 'buildbot: fetch base rev before linting against it'}
2017-07-27T20:42:24.913426	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'opened', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5835', 'id': 5835, 'source': 'ghhookparser', 'head_ref_name': 'testlint', 'author': 'ligfx', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '2ef80d38f23d333b30667d94b4a343f603a53c1a', 'type': 'gh_pull_request', 'title': '[CI TEST] lint problem, not rebased on master'}
2017-07-27T20:25:28.814719	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'id': 5810, 'source': 'ghhookparser', 'head_ref_name': 'qt_netplay', 'author': 'spycrab', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '8f51d16eb49b770c7905452c88b889d09d2ae37a', 'type': 'gh_pull_request', 'title': 'Qt: Implement Netplay'}
2017-07-27T20:22:38.988360	{'base_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'id': 5810, 'source': 'ghhookparser', 'head_ref_name': 'qt_netplay', 'author': 'spycrab', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'c47d5282028533e1ea85c6a451268e4a6267a7a2', 'type': 'gh_pull_request', 'title': 'Qt: Implement Netplay'}
2017-07-27T19:00:37.618790	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5833', 'id': 5833, 'source': 'ghhookparser', 'head_ref_name': 'unused', 'author': 'Helios747', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '27924a1e2efa6d5e831fe5286126b7b20b2daa50', 'type': 'gh_pull_request', 'title': 'Qt/Config: Remove unused members'}
2017-07-27T18:58:58.949686	{'base_sha': 'dcb4386008ee28121c753bfa21ca8d732a90b944', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5770', 'id': 5770, 'source': 'ghhookparser', 'head_ref_name': 'lognewconfig', 'author': 'Helios747', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '28d6c61e34aeb478d73d440d1aa3faa48b765fa8', 'type': 'gh_pull_request', 'title': 'LogManager: use layered config'}
2017-07-27T18:19:34.036184	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'id': 5804, 'source': 'ghhookparser', 'head_ref_name': 'qt_additional_wiimote_settings', 'author': 'grimpunch', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'head_sha': '8034534b56f2df801effc0dfe84c93efe3bbc694', 'type': 'gh_pull_request', 'title': 'Qt: Implement Wii settings pane'}
2017-07-27T17:59:46.114265	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'id': 5804, 'source': 'ghhookparser', 'head_ref_name': 'qt_additional_wiimote_settings', 'author': 'grimpunch', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'bf1aa883706b44a4c54d229b23c113ff92775c6a', 'type': 'gh_pull_request', 'title': 'Qt: Implement Wii settings pane'}
2017-07-27T17:53:53.324644	{'base_sha': '8292d378ea0dc91eca501f417409a5199a46bd18', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'id': 5804, 'source': 'ghhookparser', 'head_ref_name': 'qt_additional_wiimote_settings', 'author': 'grimpunch', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'c9bcd3d1fa8b8647a88ad26b80b3f14266db252d', 'type': 'gh_pull_request', 'title': 'Qt: Implement Wii settings pane'}
2017-07-27T17:42:45.784990	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'id': 5810, 'source': 'ghhookparser', 'head_ref_name': 'qt_netplay', 'author': 'spycrab', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '8a839686a60f6c92b1a57d047c24452a047ceb1a', 'type': 'gh_pull_request', 'title': 'Qt: Implement Netplay'}
2017-07-27T17:36:03.449819	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5810', 'id': 5810, 'source': 'ghhookparser', 'head_ref_name': 'qt_netplay', 'author': 'spycrab', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'c45f0369d91a6834efb27f754b840adbc36d0827', 'type': 'gh_pull_request', 'title': 'Qt: Implement Netplay'}
2017-07-27T15:01:30.411279	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/4949', 'id': 4949, 'source': 'ghhookparser', 'head_ref_name': 'netplay-reconnect-on-button-press', 'author': 'mimimi085181', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '39c1c73d0b1c4384eb462efab7fa30ff19b98125', 'type': 'gh_pull_request', 'title': 'Wiimote Netplay: Sync button press for reconnect'}
2017-07-27T14:50:53.184880	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/4949', 'id': 4949, 'source': 'ghhookparser', 'head_ref_name': 'netplay-reconnect-on-button-press', 'author': 'mimimi085181', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'f73b5b026d901fc48c6f68ae5e1c2d9d13227b49', 'type': 'gh_pull_request', 'title': 'Wiimote Netplay: Sync button press for reconnect'}
2017-07-27T13:18:08.445384	{'base_sha': '8292d378ea0dc91eca501f417409a5199a46bd18', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5804', 'id': 5804, 'source': 'ghhookparser', 'head_ref_name': 'qt_additional_wiimote_settings', 'author': 'grimpunch', 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'head_sha': '876a6afe2849ce4e8ceb0d19dda89054417a6065', 'type': 'gh_pull_request', 'title': 'Qt: Implement Wii settings pane'}
2017-07-27T12:02:46.964080	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'opened', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5834', 'id': 5834, 'source': 'ghhookparser', 'head_ref_name': 'bc7', 'author': 'stenzek', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '4c2f5eba9d3e86b7fe6a10f70dbbe2ad76d0bf3c', 'type': 'gh_pull_request', 'title': 'Support loading BC7 (BPTC) textures from DDS files'}
2017-07-27T11:02:11.534811	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 5702, 'source': 'ghhookparser', 'head_ref_name': 'ubershaders', 'author': 'stenzek', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request', 'title': 'Ubershaders 2.0'}
2017-07-27T10:59:58.494693	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 5702, 'source': 'ghhookparser', 'head_ref_name': 'ubershaders', 'author': 'stenzek', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '96f1741cf8b7d743ad2ef099d9654a92971f30d2', 'type': 'gh_pull_request', 'title': 'Ubershaders 2.0'}
2017-07-27T09:29:16.931799	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5746', 'id': 5746, 'source': 'ghhookparser', 'head_ref_name': 'disc-updates', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '5093438a768e5cb11611df5bfc07ba73ad60129c', 'type': 'gh_pull_request', 'title': 'Add support for installing disc updates from the game list'}
2017-07-27T09:27:41.034096	{'base_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'action': 'opened', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5833', 'id': 5833, 'source': 'ghhookparser', 'head_ref_name': 'unused', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '27924a1e2efa6d5e831fe5286126b7b20b2daa50', 'type': 'gh_pull_request', 'title': 'Qt/Config: Remove unused members'}

Recent 'gh_pull_request_comment' events

2017-07-28T02:40:34.072766	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-28T02:40:26.872150	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-28T02:38:48.317217	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002036', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-28T02:15:07.753678	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130000019', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-28T02:14:23.996654	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129999957', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-28T02:08:40.686204	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129999548', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-27T16:14:44.759488	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129883537', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-27T15:58:21.720491	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129883537', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'type': 'gh_pull_request_comment'}
2017-07-27T07:04:06.795039	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5809#discussion_r129766989', 'id': 5809, 'source': 'ghhookparser', 'author': 'leoetlino', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '35c82d93e1d6e4770ec52660839dff580ec14a87', 'type': 'gh_pull_request_comment'}
2017-07-27T04:53:09.113941	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129753489', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:51:25.797329	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129753343', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:36:49.850459	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129752059', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:30:31.761907	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751631', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:27:34.757800	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751390', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:24:48.340996	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751167', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:23:27.582780	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751075', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:22:20.111852	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129750964', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'type': 'gh_pull_request_comment'}
2017-07-27T04:10:39.460604	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129750120', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'type': 'gh_pull_request_comment'}
2017-07-27T03:55:16.588921	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748900', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}
2017-07-27T03:54:44.405390	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748863', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}
2017-07-27T03:49:51.398552	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748448', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}
2017-07-27T03:48:24.397272	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748328', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}
2017-07-27T03:46:15.437251	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748144', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}
2017-07-27T03:45:00.001411	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748040', 'id': 5702, 'source': 'ghhookparser', 'author': 'stenzek', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}
2017-07-27T03:42:43.996860	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129747860', 'id': 5702, 'source': 'ghhookparser', 'author': 'iwubcode', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'type': 'gh_pull_request_comment'}

Recent 'gh_pull_request_review' events

2017-07-28T04:19:50.102957	{'pr_title': 'buildbot: fetch base rev before linting against it', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/sadm/pull/87#pullrequestreview-52841107', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'leoetlino', 'pr_id': 87, 'repo': 'dolphin-emu/sadm', 'type': 'gh_pull_request_review'}
2017-07-28T02:45:14.436515	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52833159', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-28T02:40:27.726397	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52832764', 'comments': [{'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -194,18 +194,21 @@ void VertexManagerBase::Flush()\n \n #if defined(_DEBUG) || defined(DEBUGFAST)\n   PRIM_LOG("frame%d:\\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d",\n-           g_ActiveConfig.iSaveTargetId, xfmem.numTexGen.numTexGens, xfmem.numChan.numColorChans,\n-           xfmem.dualTexTrans.enabled, bpmem.ztex2.op, (int)bpmem.blendmode.colorupdate,\n-           (int)bpmem.blendmode.alphaupdate, (int)bpmem.zmode.updateenable);\n+           g_ActiveConfig.iSaveTargetId, (int)xfmem.numTexGen.numTexGens,', 'created_at': '2017-07-28T02:40:26Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002156', 'position': 7, 'pull_request_review_id': 52832764, 'updated_at': '2017-07-28T02:40:26Z', 'id': 130002156, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 7, 'body': "Not a biggied but it'd be nice to have cleaned these up with c++ style casts", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002156'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/VertexManagerBase.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-28T02:38:48.312690	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52832628', 'comments': [{'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -0,0 +1,446 @@\n+// Copyright 2015 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/DriverDetails.h"\n+#include "VideoCommon/NativeVertexFormat.h"\n+#include "VideoCommon/UberShaderCommon.h"\n+#include "VideoCommon/VertexShaderGen.h"\n+#include "VideoCommon/VideoConfig.h"\n+#include "VideoCommon/XFMemory.h"\n+\n+namespace UberShader\n+{\n+VertexShaderUid GetVertexShaderUid()\n+{\n+  VertexShaderUid out;\n+  vertex_ubershader_uid_data* uid_data = out.GetUidData<vertex_ubershader_uid_data>();\n+  memset(uid_data, 0, sizeof(*uid_data));\n+  uid_data->num_texgens = xfmem.numTexGen.numTexGens;\n+  return out;\n+}\n+\n+static void GenVertexShaderTexGens(APIType ApiType, u32 numTexgen, ShaderCode& out);\n+\n+ShaderCode GenVertexShader(APIType ApiType, const ShaderHostConfig& host_config,\n+                           const vertex_ubershader_uid_data* uid_data)\n+{\n+  const bool msaa = host_config.msaa;\n+  const bool ssaa = host_config.ssaa;\n+  const bool per_pixel_lighting = host_config.per_pixel_lighting;\n+  const u32 numTexgen = uid_data->num_texgens;\n+  ShaderCode out;\n+\n+  out.Write("// Vertex UberShader\\n\\n");\n+  out.Write("%s", s_lighting_struct);\n+\n+  // uniforms\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+    out.Write("UBO_BINDING(std140, 2) uniform VSBlock {\\n");\n+  else\n+    out.Write("cbuffer VSBlock {\\n");\n+  out.Write(s_shader_uniforms);\n+  out.Write("};\\n");\n+\n+  out.Write("struct VS_OUTPUT {\\n");\n+  GenerateVSOutputMembers(out, ApiType, numTexgen, per_pixel_lighting, "");\n+  out.Write("};\\n\\n");\n+\n+  WriteUberShaderCommonHeader(out, ApiType, host_config);\n+  WriteLightingFunction(out);\n+\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+  {\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawpos;\\n", SHADER_POSITION_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in uint4 posmtx;\\n", SHADER_POSMTX_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm0;\\n", SHADER_NORM0_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm1;\\n", SHADER_NORM1_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm2;\\n", SHADER_NORM2_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawcolor0;\\n", SHADER_COLOR0_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawcolor1;\\n", SHADER_COLOR1_ATTRIB);\n+    for (int i = 0; i < 8; ++i)\n+      out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawtex%d;\\n", SHADER_TEXTURE0_ATTRIB + i, i);\n+\n+    // We need to always use output blocks for Vulkan, but geometry shaders are also optional.\n+    if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan)\n+    {\n+      out.Write("VARYING_LOCATION(0) out VertexData {\\n");\n+      GenerateVSOutputMembers(out, ApiType, numTexgen, per_pixel_lighting,\n+                              GetInterpolationQualifier(msaa, ssaa, true, false));\n+      out.Write("} vs;\\n");\n+    }\n+    else\n+    {\n+      // Let\'s set up attributes\n+      for (u32 i = 0; i < numTexgen; ++i)\n+        out.Write("%s out float3 tex%u;\\n", GetInterpolationQualifier(msaa, ssaa), i);\n+\n+      out.Write("%s out float4 clipPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      if (per_pixel_lighting)\n+      {\n+        out.Write("%s out float3 Normal;\\n", GetInterpolationQualifier(msaa, ssaa));\n+        out.Write("%s out float3 WorldPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      }\n+      out.Write("%s out float4 colors_0;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      out.Write("%s out float4 colors_1;\\n", GetInterpolationQualifier(msaa, ssaa));\n+    }\n+\n+    out.Write("void main()\\n{\\n");\n+  }\n+  else  // D3D\n+  {\n+    out.Write("VS_OUTPUT main(\\n");\n+\n+    // inputs\n+    out.Write("  float3 rawnorm0 : NORMAL0,\\n");\n+    out.Write("  float3 rawnorm1 : NORMAL1,\\n");\n+    out.Write("  float3 rawnorm2 : NORMAL2,\\n");\n+    out.Write("  float4 rawcolor0 : COLOR0,\\n");\n+    out.Write("  float4 rawcolor1 : COLOR1,\\n");\n+    for (int i = 0; i < 8; ++i)\n+      out.Write("  float3 rawtex%d : TEXCOORD%d,\\n", i, i);\n+    out.Write("  uint posmtx : BLENDINDICES,\\n");\n+    out.Write("  float4 rawpos : POSITION) {\\n");\n+  }\n+\n+  out.Write("VS_OUTPUT o;\\n"\n+            "\\n");\n+\n+  // Transforms\n+  out.Write("// Position matrix\\n"\n+            "float4 P0;\\n"\n+            "float4 P1;\\n"\n+            "float4 P2;\\n"\n+            "\\n"\n+            "// Normal matrix\\n"\n+            "float3 N0;\\n"\n+            "float3 N1;\\n"\n+            "float3 N2;\\n"\n+            "\\n"\n+            "if ((components & %uu) != 0u) {// VB_HAS_POSMTXIDX\\n",\n+            VB_HAS_POSMTXIDX);\n+  out.Write("  // Vertex format has a per-vertex matrix\\n"\n+            "  int posidx = int(posmtx.r);\\n"\n+            "  P0 = " I_TRANSFORMMATRICES "[posidx];\\n"\n+            "  P1 = " I_TRANSFORMMATRICES "[posidx+1];\\n"\n+            "  P2 = " I_TRANSFORMMATRICES "[posidx+2];\\n"\n+            "\\n"\n+            "  int normidx = posidx >= 32 ? (posidx - 32) : posidx;\\n"\n+            "  N0 = " I_NORMALMATRICES "[normidx].xyz;\\n"\n+            "  N1 = " I_NORMALMATRICES "[normidx+1].xyz;\\n"\n+            "  N2 = " I_NORMALMATRICES "[normidx+2].xyz;\\n"\n+            "} else {\\n"\n+            "  // One shared matrix\\n"\n+            "  P0 = " I_POSNORMALMATRIX "[0];\\n"\n+            "  P1 = " I_POSNORMALMATRIX "[1];\\n"\n+            "  P2 = " I_POSNORMALMATRIX "[2];\\n"\n+            "  N0 = " I_POSNORMALMATRIX "[3].xyz;\\n"\n+            "  N1 = " I_POSNORMALMATRIX "[4].xyz;\\n"\n+            "  N2 = " I_POSNORMALMATRIX "[5].xyz;\\n"\n+            "}\\n"\n+            "\\n"\n+            "float4 pos = float4(dot(P0, rawpos), dot(P1, rawpos), dot(P2, rawpos), 1.0);\\n"\n+            "o.pos = float4(dot(" I_PROJECTION "[0], pos), dot(" I_PROJECTION\n+            "[1], pos), dot(" I_PROJECTION "[2], pos), dot(" I_PROJECTION "[3], pos));\\n"\n+            "\\n"\n+            "// Only the first normal gets normalized (TODO: why?)\\n"\n+            "float3 _norm0 = float3(0.0, 0.0, 0.0);\\n"\n+            "if ((components & %uu) != 0u) // VB_HAS_NRM0\\n",\n+            VB_HAS_NRM0);\n+  out.Write(\n+      "  _norm0 = normalize(float3(dot(N0, rawnorm0), dot(N1, rawnorm0), dot(N2, rawnorm0)));\\n"\n+      "\\n"\n+      "float3 _norm1 = float3(0.0, 0.0, 0.0);\\n"\n+      "if ((components & %uu) != 0u) // VB_HAS_NRM1\\n",\n+      VB_HAS_NRM1);\n+  out.Write("  _norm1 = float3(dot(N0, rawnorm1), dot(N1, rawnorm1), dot(N2, rawnorm1));\\n"\n+            "\\n"\n+            "float3 _norm2 = float3(0.0, 0.0, 0.0);\\n"\n+            "if ((components & %uu) != 0u) // VB_HAS_NRM2\\n",\n+            VB_HAS_NRM2);\n+  out.Write("  _norm2 = float3(dot(N0, rawnorm2), dot(N1, rawnorm2), dot(N2, rawnorm2));\\n"\n+            "\\n");\n+\n+  // Hardware Lighting\n+  WriteVertexLighting(out, ApiType, "pos.xyz", "_norm0", "rawcolor0", "rawcolor1", "o.colors_0",\n+                      "o.colors_1");\n+\n+  // Texture Coordinates\n+  if (numTexgen > 0)\n+    GenVertexShaderTexGens(ApiType, numTexgen, out);\n+\n+  // clipPos/w needs to be done in pixel shader, not here\n+  out.Write("o.clipPos = o.pos;\\n");\n+\n+  if (per_pixel_lighting)\n+  {\n+    out.Write("o.Normal = _norm0;\\n");\n+    out.Write("o.WorldPos = pos.xyz;\\n");\n+    out.Write("if ((components & %uu) != 0u) // VB_HAS_COL0\\n", VB_HAS_COL0);\n+    out.Write("  o.colors_0 = rawcolor0;\\n");\n+    out.Write("if ((components & %uu) != 0u) // VB_HAS_COL1\\n", VB_HAS_COL1);\n+    out.Write("  o.colors_1 = rawcolor1;\\n");\n+  }\n+\n+  // If we can disable the incorrect depth clipping planes using depth clamping, then we can do\n+  // our own depth clipping and calculate the depth range before the perspective divide if\n+  // necessary.\n+  if (host_config.backend_depth_clamp)\n+  {\n+    // Since we\'re adjusting z for the depth range before the perspective divide, we have to do our\n+    // own clipping. We want to clip so that -w <= z <= 0, which matches the console -1..0 range.\n+    // We adjust our depth value for clipping purposes to match the perspective projection in the\n+    // software backend, which is a hack to fix Sonic Adventure and Unleashed games.\n+    out.Write("float clipDepth = o.pos.z * (1.0 - 1e-7);\\n");\n+    out.Write("o.clipDist0 = clipDepth + o.pos.w;\\n");  // Near: z < -w\n+    out.Write("o.clipDist1 = -clipDepth;\\n");           // Far: z > 0\n+  }\n+\n+  // Write the true depth value. If the game uses depth textures, then the pixel shader will\n+  // override it with the correct values if not then early z culling will improve speed.\n+  // There are two different ways to do this, when the depth range is oversized, we process\n+  // the depth range in the vertex shader, if not we let the host driver handle it.\n+  //\n+  // Adjust z for the depth range. We\'re using an equation which incorperates a depth inversion,\n+  // so we can map the console -1..0 range to the 0..1 range used in the depth buffer.\n+  // We have to handle the depth range in the vertex shader instead of after the perspective\n+  // divide, because some games will use a depth range larger than what is allowed by the\n+  // graphics API. These large depth ranges will still be clipped to the 0..1 range, so these\n+  // games effectively add a depth bias to the values written to the depth buffer.\n+  out.Write("o.pos.z = o.pos.w * " I_PIXELCENTERCORRECTION ".w - "\n+            "o.pos.z * " I_PIXELCENTERCORRECTION ".z;\\n");\n+\n+  if (!host_config.backend_clip_control)\n+  {\n+    // If the graphics API doesn\'t support a depth range of 0..1, then we need to map z to\n+    // the -1..1 range. Unfortunately we have to use a substraction, which is a lossy floating-point\n+    // operation that can introduce a round-trip error.\n+    out.Write("o.pos.z = o.pos.z * 2.0 - o.pos.w;\\n");\n+  }\n+\n+  // Correct for negative viewports by mirroring all vertices. We need to negate the height here,\n+  // since the viewport height is already negated by the render backend.\n+  out.Write("o.pos.xy *= sign(" I_PIXELCENTERCORRECTION ".xy * float2(1.0, -1.0));\\n");\n+\n+  // The console GPU places the pixel center at 7/12 in screen space unless\n+  // antialiasing is enabled, while D3D and OpenGL place it at 0.5. This results\n+  // in some primitives being placed one pixel too far to the bottom-right,\n+  // which in turn can be critical if it happens for clear quads.\n+  // Hence, we compensate for this pixel center difference so that primitives\n+  // get rasterized correctly.\n+  out.Write("o.pos.xy = o.pos.xy - o.pos.w * " I_PIXELCENTERCORRECTION ".xy;\\n");', 'created_at': '2017-07-28T02:38:46Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002036', 'position': 232, 'pull_request_review_id': 52832628, 'updated_at': '2017-07-28T02:38:46Z', 'id': 130002036, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 232, 'body': 'Should we include the vertex rounding in uber-shaders?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002036', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002036'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002036'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/UberShaderVertex.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-28T02:15:07.748864	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52830483', 'comments': [{'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -0,0 +1,1109 @@\n+// Copyright 2015 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/BPMemory.h"\n+#include "VideoCommon/DriverDetails.h"\n+#include "VideoCommon/NativeVertexFormat.h"\n+#include "VideoCommon/UberShaderCommon.h"\n+#include "VideoCommon/XFMemory.h"\n+\n+namespace UberShader\n+{\n+PixelShaderUid GetPixelShaderUid()\n+{\n+  PixelShaderUid out;\n+  pixel_ubershader_uid_data* uid_data = out.GetUidData<pixel_ubershader_uid_data>();\n+  memset(uid_data, 0, sizeof(*uid_data));\n+  uid_data->num_texgens = xfmem.numTexGen.numTexGens;\n+  uid_data->early_depth =\n+      bpmem.UseEarlyDepthTest() &&\n+      (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED) &&\n+      !(bpmem.zmode.testenable && bpmem.genMode.zfreeze);\n+  uid_data->per_pixel_depth =\n+      (bpmem.ztex2.op != ZTEXTURE_DISABLE && bpmem.UseLateDepthTest()) ||\n+      (!g_ActiveConfig.bFastDepthCalc && bpmem.zmode.testenable && !uid_data->early_depth) ||\n+      (bpmem.zmode.testenable && bpmem.genMode.zfreeze);\n+  return out;\n+}\n+\n+ShaderCode GenPixelShader(APIType ApiType, const ShaderHostConfig& host_config,\n+                          const pixel_ubershader_uid_data* uid_data)\n+{\n+  const bool per_pixel_lighting = host_config.per_pixel_lighting;\n+  const bool msaa = host_config.msaa;\n+  const bool ssaa = host_config.ssaa;\n+  const bool stereo = host_config.stereo;\n+  const bool use_dual_source = host_config.backend_dual_source_blend;\n+  const bool early_depth = uid_data->early_depth != 0;\n+  const bool per_pixel_depth = uid_data->per_pixel_depth != 0;\n+  const bool bounding_box =\n+      host_config.bounding_box && g_ActiveConfig.BBoxUseFragmentShaderImplementation();\n+  const u32 numTexgen = uid_data->num_texgens;\n+  ShaderCode out;\n+\n+  out.Write("// Pixel UberShader for %u texgens%s%s\\n", numTexgen,\n+            early_depth ? ", early-depth" : "", per_pixel_depth ? ", per-pixel depth" : "");\n+  WritePixelShaderCommonHeader(out, ApiType, numTexgen, per_pixel_lighting, bounding_box);\n+  WriteUberShaderCommonHeader(out, ApiType, host_config);\n+  if (per_pixel_lighting)\n+    WriteLightingFunction(out);\n+\n+  // Shader inputs/outputs in GLSL (HLSL is in main).\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+  {\n+    if (use_dual_source)\n+    {\n+      if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_FRAGMENT_SHADER_INDEX_DECORATION))\n+      {\n+        out.Write("FRAGMENT_OUTPUT_LOCATION(0) out vec4 ocol0;\\n");\n+        out.Write("FRAGMENT_OUTPUT_LOCATION(1) out vec4 ocol1;\\n");\n+      }\n+      else\n+      {\n+        out.Write("FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 0) out vec4 ocol0;\\n");\n+        out.Write("FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 1) out vec4 ocol1;\\n");\n+      }\n+    }\n+    else\n+    {\n+      out.Write("FRAGMENT_OUTPUT_LOCATION(0) out vec4 ocol0;\\n");\n+    }\n+\n+    if (per_pixel_depth)\n+      out.Write("#define depth gl_FragDepth\\n");\n+\n+    if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan)\n+    {\n+      out.Write("VARYING_LOCATION(0) in VertexData {\\n");\n+      GenerateVSOutputMembers(out, ApiType, numTexgen, per_pixel_lighting,\n+                              GetInterpolationQualifier(msaa, ssaa));\n+\n+      if (stereo)\n+        out.Write("  flat int layer;\\n");\n+\n+      out.Write("};\\n\\n");\n+    }\n+    else\n+    {\n+      out.Write("%s in float4 colors_0;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      out.Write("%s in float4 colors_1;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      // compute window position if needed because binding semantic WPOS is not widely supported\n+      // Let\'s set up attributes\n+      for (u32 i = 0; i < numTexgen; ++i)\n+        out.Write("%s in float3 tex%d;\\n", GetInterpolationQualifier(msaa, ssaa), i);\n+      out.Write("%s in float4 clipPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      if (per_pixel_lighting)\n+      {\n+        out.Write("%s in float3 Normal;\\n", GetInterpolationQualifier(msaa, ssaa));\n+        out.Write("%s in float3 WorldPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      }\n+    }\n+  }\n+\n+  // Uniform index -> texture coordinates\n+  if (numTexgen > 0)\n+  {\n+    if (ApiType != APIType::D3D)\n+    {\n+      out.Write("float3 selectTexCoord(uint index) {\\n");\n+    }\n+    else\n+    {\n+      out.Write("float3 selectTexCoord(uint index");\n+      for (u32 i = 0; i < numTexgen; i++)\n+        out.Write(", float3 tex%u", i);\n+      out.Write(") {\\n");\n+    }\n+\n+    out.Write("  switch (index) {\\n");\n+    for (u32 i = 0; i < numTexgen; i++)\n+    {\n+      out.Write("  case %uu:\\n"\n+                "    return tex%u;\\n",\n+                i, i);\n+    }\n+    out.Write("  default:\\n"\n+              "    return float3(0.0, 0.0, 0.0);\\n"\n+              "  }\\n"\n+              "}\\n\\n");\n+  }\n+\n+  // =====================\n+  //   Texture Sampling\n+  // =====================\n+\n+  if (host_config.backend_dynamic_sampler_indexing)\n+  {\n+    // Doesn\'t look like directx supports this. Oh well the code path is here just incase it\n+    // supports this in the future.\n+    out.Write("int4 sampleTexture(uint sampler_num, float2 uv) {\\n");\n+    if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+      out.Write("  return iround(texture(samp[sampler_num], float3(uv, 0.0)) * 255.0);\\n");\n+    else if (ApiType == APIType::D3D)\n+      out.Write("  return iround(Tex[sampler_num].Sample(samp[sampler_num], float3(uv, 0.0)) * "\n+                "255.0);\\n");\n+    out.Write("}\\n\\n");\n+  }\n+  else\n+  {\n+    out.Write("int4 sampleTexture(uint sampler_num, float2 uv) {\\n"\n+              "  // This is messy, but DirectX, OpenGl 3.3 and Opengl ES 3.0 doesn\'t support "\n+              "dynamic indexing of the sampler array\\n"\n+              "  // With any luck the shader compiler will optimise this if the hardware supports "\n+              "dynamic indexing.\\n"\n+              "  switch(sampler_num) {\\n");\n+    for (int i = 0; i < 8; i++)\n+    {\n+      if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+        out.Write("  case %du: return iround(texture(samp[%d], float3(uv, 0.0)) * 255.0);\\n", i, i);\n+      else if (ApiType == APIType::D3D)\n+        out.Write("  case %du: return iround(Tex[%d].Sample(samp[%d], float3(uv, 0.0)) * 255.0);\\n",\n+                  i, i, i);\n+    }\n+    out.Write("  }\\n"\n+              "}\\n\\n");\n+  }\n+\n+  // ======================\n+  //   Arbatary Swizzling\n+  // ======================\n+\n+  out.Write("int4 Swizzle(uint s, int4 color) {\\n"\n+            "  // AKA: Color Channel Swapping\\n"\n+            "\\n"\n+            "  int4 ret;\\n");\n+  out.Write("  ret.r = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u)", TevKSel().swap1).c_str());\n+  out.Write("  ret.g = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u)", TevKSel().swap2).c_str());\n+  out.Write("  ret.b = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u + 1u)", TevKSel().swap1).c_str());\n+  out.Write("  ret.a = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u + 1u)", TevKSel().swap2).c_str());\n+  out.Write("  return ret;\\n"\n+            "}\\n\\n");\n+\n+  // ======================\n+  //   Indirect Wrappping\n+  // ======================\n+  out.Write("int Wrap(int coord, uint mode) {\\n"\n+            "  if (mode == 0u) // ITW_OFF\\n"\n+            "    return coord;\\n"\n+            "  else if (mode < 6u) // ITW_256 to ITW_16\\n"\n+            "    return coord & (0xfffe >> mode);\\n"\n+            "  else // ITW_0\\n"\n+            "    return 0;\\n"\n+            "}\\n\\n");\n+\n+  // ======================\n+  //    Indirect Lookup\n+  // ======================\n+  auto LookupIndirectTexture = [&out](const char* out_var_name, const char* in_index_name) {\n+    out.Write(\n+        "{\\n"\n+        "  uint iref = bpmem_iref(%s);\\n"\n+        "  if ( iref != 0u)\\n"\n+        "  {\\n"\n+        "    uint texcoord = bitfieldExtract(iref, 0, 3);\\n"\n+        "    uint texmap = bitfieldExtract(iref, 8, 3);\\n"\n+        "    float3 uv = getTexCoord(texcoord);\\n"\n+        "    int2 fixedPoint_uv = int2((uv.z == 0.0 ? uv.xy : (uv.xy / uv.z)) * " I_TEXDIMS\n+        "[texcoord].zw);\\n"\n+        "\\n"\n+        "    if ((%s & 1u) == 0u)\\n"\n+        "      fixedPoint_uv = fixedPoint_uv >> " I_INDTEXSCALE "[%s >> 1].xy;\\n"\n+        "    else\\n"\n+        "      fixedPoint_uv = fixedPoint_uv >> " I_INDTEXSCALE "[%s >> 1].zw;\\n"\n+        "\\n"\n+        "    %s = sampleTexture(texmap, float2(fixedPoint_uv) * " I_TEXDIMS "[texmap].xy).abg;\\n"\n+        "  }\\n"\n+        "  else\\n"\n+        "  {\\n"\n+        "    %s = int3(0, 0, 0);\\n"\n+        "  }\\n"\n+        "}\\n",\n+        in_index_name, in_index_name, in_index_name, in_index_name, out_var_name, out_var_name);\n+  };\n+\n+  // ======================\n+  //   TEV\'s Special Lerp\n+  // ======================\n+  auto WriteTevLerp = [&out](const char* components) {\n+    out.Write("// TEV\'s Linear Interpolate, plus bias, add/subtract and scale\\n"\n+              "int%s tevLerp%s(int%s A, int%s B, int%s C, int%s D, uint bias, bool op, bool alpha, "\n+              "uint shift) {\\n"\n+              " // Scale C from 0..255 to 0..256\\n"\n+              "  C += C >> 7;\\n"\n+              "\\n"\n+              " // Add bias to D\\n"\n+              "  if (bias == 1u) D += 128;\\n"\n+              "  else if (bias == 2u) D -= 128;\\n"\n+              "\\n"\n+              "  int%s lerp = (A << 8) + (B - A)*C;\\n"\n+              "  if (shift != 3u) {\\n"\n+              "    lerp = lerp << shift;\\n"\n+              "    D = D << shift;\\n"\n+              "  }\\n"\n+              "\\n"\n+              "  if ((shift == 3u) == alpha)\\n"\n+              "    lerp = lerp + (op ? 127 : 128);\\n"\n+              "\\n"\n+              "  int%s result = lerp >> 8;\\n"\n+              "\\n"\n+              "  // Add/Subtract D\\n"\n+              "  if(op) // Subtract\\n"\n+              "    result = D - result;\\n"\n+              "  else // Add\\n"\n+              "    result = D + result;\\n"\n+              "\\n"\n+              "  // Most of the Shift was moved inside the lerp for improved percision\\n"\n+              "  // But we still do the divide by 2 here\\n"\n+              "  if (shift == 3u)\\n"\n+              "    result = result >> 1;\\n"\n+              "  return result;\\n"\n+              "}\\n\\n",\n+              components, components, components, components, components, components, components,\n+              components);\n+  };\n+  WriteTevLerp("");   // int\n+  WriteTevLerp("3");  // int3\n+\n+  // =======================\n+  //   TEV\'s Color Compare\n+  // =======================\n+\n+  out.Write(\n+      "// Implements operations 0-5 of tev\'s compare mode,\\n"\n+      "// which are common to both color and alpha channels\\n"\n+      "bool tevCompare(uint op, int3 color_A, int3 color_B) {\\n"\n+      "  switch (op) {\\n"\n+      "  case 0u: // TEVCMP_R8_GT\\n"\n+      "    return (color_A.r > color_B.r);\\n"\n+      "  case 1u: // TEVCMP_R8_EQ\\n"\n+      "    return (color_A.r == color_B.r);\\n"\n+      "  case 2u: // TEVCMP_GR16_GT\\n"\n+      "    int A_16 = (color_A.r | (color_A.g << 8));\\n"\n+      "    int B_16 = (color_B.r | (color_B.g << 8));\\n"\n+      "    return A_16 > B_16;\\n"\n+      "  case 3u: // TEVCMP_GR16_EQ\\n"\n+      "    return (color_A.r == color_B.r && color_A.g == color_B.g);\\n"\n+      "  case 4u: // TEVCMP_BGR24_GT\\n"\n+      "    int A_24 = (color_A.r | (color_A.g << 8) | (color_A.b << 16));\\n"\n+      "    int B_24 = (color_B.r | (color_B.g << 8) | (color_B.b << 16));\\n"\n+      "    return A_24 > B_24;\\n"\n+      "  case 5u: // TEVCMP_BGR24_EQ\\n"\n+      "    return (color_A.r == color_B.r && color_A.g == color_B.g && color_A.b == color_B.b);\\n"\n+      "  default:\\n"\n+      "    return false;\\n"\n+      "  }\\n"\n+      "}\\n\\n");\n+\n+  // =================\n+  //   Alpha Compare\n+  // =================\n+\n+  out.Write("// Helper function for Alpha Test\\n"\n+            "bool alphaCompare(int a, int b, uint compare) {\\n"\n+            "  switch (compare) {\\n"\n+            "  case 0u: // NEVER\\n"\n+            "    return false;\\n"\n+            "  case 1u: // LESS\\n"\n+            "    return a < b;\\n"\n+            "  case 2u: // EQUAL\\n"\n+            "    return a == b;\\n"\n+            "  case 3u: // LEQUAL\\n"\n+            "    return a <= b;\\n"\n+            "  case 4u: // GREATER\\n"\n+            "    return a > b;\\n"\n+            "  case 5u: // NEQUAL;\\n"\n+            "    return a != b;\\n"\n+            "  case 6u: // GEQUAL\\n"\n+            "    return a >= b;\\n"\n+            "  case 7u: // ALWAYS\\n"\n+            "    return true;\\n"\n+            "  }\\n"\n+            "}\\n\\n");\n+\n+  // =================\n+  //   Input Selects\n+  // =================\n+\n+  out.Write("struct State {\\n"\n+            "  int4 Reg[4];\\n"\n+            "  int4 TexColor;\\n"\n+            "  int AlphaBump;\\n"\n+            "};\\n"\n+            "struct StageState {\\n"\n+            "  uint stage;\\n"\n+            "  uint order;\\n"\n+            "  uint cc;\\n"\n+            "  uint ac;\\n");\n+\n+  out.Write("};\\n"\n+            "\\n"\n+            "int4 getRasColor(State s, StageState ss, float4 colors_0, float4 colors_1);\\n"\n+            "int4 getKonstColor(State s, StageState ss);\\n"\n+            "\\n"\n+            "int3 selectColorInput(State s, StageState ss, float4 colors_0, float4 colors_1, uint "\n+            "index) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev.rgb\\n"\n+            "    return s.Reg[0].rgb;\\n"\n+            "  case 1u: // prev.aaa\\n"\n+            "    return s.Reg[0].aaa;\\n"\n+            "  case 2u: // c0.rgb\\n"\n+            "    return s.Reg[1].rgb;\\n"\n+            "  case 3u: // c0.aaa\\n"\n+            "    return s.Reg[1].aaa;\\n"\n+            "  case 4u: // c1.rgb\\n"\n+            "    return s.Reg[2].rgb;\\n"\n+            "  case 5u: // c1.aaa\\n"\n+            "    return s.Reg[2].aaa;\\n"\n+            "  case 6u: // c2.rgb\\n"\n+            "    return s.Reg[3].rgb;\\n"\n+            "  case 7u: // c2.aaa\\n"\n+            "    return s.Reg[3].aaa;\\n"\n+            "  case 8u:\\n"\n+            "    return s.TexColor.rgb;\\n"\n+            "  case 9u:\\n"\n+            "    return s.TexColor.aaa;\\n"\n+            "  case 10u:\\n"\n+            "    return getRasColor(s, ss, colors_0, colors_1).rgb;\\n"\n+            "  case 11u:\\n"\n+            "    return getRasColor(s, ss, colors_0, colors_1).aaa;\\n"\n+            "  case 12u: // One\\n"\n+            "    return int3(255, 255, 255);\\n"\n+            "  case 13u: // Half\\n"\n+            "    return int3(128, 128, 128);\\n"\n+            "  case 14u:\\n"\n+            "    return getKonstColor(s, ss).rgb;\\n"\n+            "  case 15u: // Zero\\n"\n+            "    return int3(0, 0, 0);\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "int selectAlphaInput(State s, StageState ss, float4 colors_0, float4 colors_1, uint "\n+            "index) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev.a\\n"\n+            "    return s.Reg[0].a;\\n"\n+            "  case 1u: // c0.a\\n"\n+            "    return s.Reg[1].a;\\n"\n+            "  case 2u: // c1.a\\n"\n+            "    return s.Reg[2].a;\\n"\n+            "  case 3u: // c2.a\\n"\n+            "    return s.Reg[3].a;\\n"\n+            "  case 4u:\\n"\n+            "    return s.TexColor.a;\\n"\n+            "  case 5u:\\n"\n+            "    return getRasColor(s, ss, colors_0, colors_1).a;\\n"\n+            "  case 6u:\\n"\n+            "    return getKonstColor(s, ss).a;\\n"\n+            "  case 7u: // Zero\\n"\n+            "    return 0;\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "int4 getTevReg(in State s, uint index) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev\\n"\n+            "    return s.Reg[0];\\n"\n+            "  case 1u: // c0\\n"\n+            "    return s.Reg[1];\\n"\n+            "  case 2u: // c1\\n"\n+            "    return s.Reg[2];\\n"\n+            "  case 3u: // c2\\n"\n+            "    return s.Reg[3];\\n"\n+            "  default: // prev\\n"\n+            "    return s.Reg[0];\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "void setRegColor(inout State s, uint index, int3 color) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev\\n"\n+            "    s.Reg[0].rgb = color;\\n"\n+            "    break;\\n"\n+            "  case 1u: // c0\\n"\n+            "    s.Reg[1].rgb = color;\\n"\n+            "    break;\\n"\n+            "  case 2u: // c1\\n"\n+            "    s.Reg[2].rgb = color;\\n"\n+            "    break;\\n"\n+            "  case 3u: // c2\\n"\n+            "    s.Reg[3].rgb = color;\\n"\n+            "    break;\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "void setRegAlpha(inout State s, uint index, int alpha) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev\\n"\n+            "    s.Reg[0].a = alpha;\\n"\n+            "    break;\\n"\n+            "  case 1u: // c0\\n"\n+            "    s.Reg[1].a = alpha;\\n"\n+            "    break;\\n"\n+            "  case 2u: // c1\\n"\n+            "    s.Reg[2].a = alpha;\\n"\n+            "    break;\\n"\n+            "  case 3u: // c2\\n"\n+            "    s.Reg[3].a = alpha;\\n"\n+            "    break;\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n");\n+\n+  // Since the texture coodinate variables aren\'t global, we need to pass\n+  // them to the select function in D3D.\n+  if (numTexgen > 0)\n+  {\n+    if (ApiType != APIType::D3D)\n+    {\n+      out.Write("#define getTexCoord(index) selectTexCoord((index))\\n\\n");\n+    }\n+    else\n+    {\n+      out.Write("#define getTexCoord(index) selectTexCoord((index)");\n+      for (u32 i = 0; i < numTexgen; i++)\n+        out.Write(", tex%u", i);\n+      out.Write(")\\n\\n");\n+    }\n+  }\n+\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+  {\n+    if (early_depth && host_config.backend_early_z)\n+      out.Write("FORCE_EARLY_Z;\\n");\n+\n+    out.Write("void main()\\n{\\n");\n+    out.Write("  float4 rawpos = gl_FragCoord;\\n");\n+  }\n+  else  // D3D\n+  {\n+    if (early_depth && host_config.backend_early_z)\n+      out.Write("[earlydepthstencil]\\n");\n+\n+    out.Write("void main(\\n"\n+              "  out float4 ocol0 : SV_Target0,\\n"\n+              "  out float4 ocol1 : SV_Target1,\\n"\n+              "  %s\\n",\n+              per_pixel_depth ? "\\n  out float depth : SV_Depth," : "");\n+    out.Write("  in float4 rawpos : SV_Position,\\n");\n+\n+    out.Write("  in %s float4 colors_0 : COLOR0,\\n", GetInterpolationQualifier(msaa, ssaa));\n+    out.Write("  in %s float4 colors_1 : COLOR1", GetInterpolationQualifier(msaa, ssaa));\n+\n+    // compute window position if needed because binding semantic WPOS is not widely supported\n+    for (u32 i = 0; i < numTexgen; ++i)\n+      out.Write(",\\n  in %s float3 tex%u : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa), i,\n+                i);\n+    out.Write("\\n,\\n  in %s float4 clipPos : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa),\n+              numTexgen);\n+    if (per_pixel_lighting)\n+    {\n+      out.Write(",\\n  in %s float3 Normal : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa),\n+                numTexgen + 1);\n+      out.Write(",\\n  in %s float3 WorldPos : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa),\n+                numTexgen + 2);\n+    }\n+    out.Write(",\\n  in float clipDist0 : SV_ClipDistance0\\n");\n+    out.Write(",\\n  in float clipDist1 : SV_ClipDistance1\\n");\n+    if (stereo)\n+      out.Write(",\\n  in uint layer : SV_RenderTargetArrayIndex\\n");\n+    out.Write("\\n        ) {\\n");\n+  }\n+\n+  out.Write("  int3 tevcoord = int3(0, 0, 0);\\n"\n+            "  State s;\\n"\n+            "  s.TexColor = int4(0, 0, 0, 0);\\n"\n+            "  s.AlphaBump = 0;\\n"\n+            "\\n");\n+  for (int i = 0; i < 4; i++)\n+    out.Write("  s.Reg[%d] = " I_COLORS "[%d];\\n", i, i);\n+\n+  if (numTexgen != 0)\n+  {\n+    //     // TODO: Skip preload on Nvidia and other GPUs which can\'t handle dynamic indexed arrays?\n+    //     out.Write(\n+    //         "  // Pre-sample indirect textures\\n"\n+    //         "  int3 indtex[4];\\n"\n+    //         "  for(uint i = 0u; i < 4u; i++)\\n");\n+    //     LookupIndirectTexture("indtex[i]", "i");\n+  }\n+\n+  const char* color_input_prefix = "";\n+  if (per_pixel_lighting)\n+  {\n+    out.Write("  float4 lit_colors_0 = colors_0;\\n");\n+    out.Write("  float4 lit_colors_1 = colors_1;\\n");\n+    out.Write("  float3 lit_normal = normalize(Normal.xyz);\\n");\n+    out.Write("  float3 lit_pos = WorldPos.xyz;\\n");\n+    WriteVertexLighting(out, ApiType, "lit_pos", "lit_normal", "colors_0", "colors_1",\n+                        "lit_colors_0", "lit_colors_1");\n+    color_input_prefix = "lit_";\n+  }\n+\n+  out.Write("  uint num_stages = %s;\\n\\n",\n+            BitfieldExtract("bpmem_genmode", bpmem.genMode.numtevstages).c_str());\n+\n+  out.Write("  // Main tev loop\\n");\n+  if (ApiType == APIType::D3D)\n+  {\n+    // Tell DirectX we don\'t want this loop unrolled (it crashes if it tries to)\n+    out.Write("  [loop]\\n");\n+  }\n+\n+  out.Write("  for(uint stage = 0u; stage <= num_stages; stage++)\\n"\n+            "  {\\n"\n+            "    StageState ss;\\n"\n+            "    ss.stage = stage;\\n"\n+            "    ss.cc = bpmem_combiners(stage).x;\\n"\n+            "    ss.ac = bpmem_combiners(stage).y;\\n"\n+            "    ss.order = bpmem_tevorder(stage>>1);\\n"\n+            "    if ((stage & 1u) == 1u)\\n"\n+            "      ss.order = ss.order >> %d;\\n\\n",\n+            int(TwoTevStageOrders().enable1.StartBit() - TwoTevStageOrders().enable0.StartBit()));\n+\n+  // Disable texturing when there are no texgens (for now)\n+  if (numTexgen != 0)\n+  {\n+    out.Write("    uint tex_coord = %s;\\n",\n+              BitfieldExtract("ss.order", TwoTevStageOrders().texcoord0).c_str());\n+    out.Write("    float3 uv = getTexCoord(tex_coord);\\n"\n+              "    int2 fixedPoint_uv = int2((uv.z == 0.0 ? uv.xy : (uv.xy / uv.z)) * " I_TEXDIMS\n+              "[tex_coord].zw);\\n"\n+              "\\n"\n+              "    bool texture_enabled = (ss.order & %du) != 0u;\\n",\n+              1 << TwoTevStageOrders().enable0.StartBit());\n+    out.Write("\\n"\n+              "    // Indirect textures\\n"\n+              "    uint tevind = bpmem_tevind(stage);\\n"\n+              "    if (tevind != 0u)\\n"\n+              "    {\\n"\n+              "      uint bs = %s;\\n",\n+              BitfieldExtract("tevind", TevStageIndirect().bs).c_str());\n+    out.Write("      uint fmt = %s;\\n", BitfieldExtract("tevind", TevStageIndirect().fmt).c_str());\n+    out.Write("      uint bias = %s;\\n",\n+              BitfieldExtract("tevind", TevStageIndirect().bias).c_str());\n+    out.Write("      uint bt = %s;\\n", BitfieldExtract("tevind", TevStageIndirect().bt).c_str());\n+    out.Write("      uint mid = %s;\\n", BitfieldExtract("tevind", TevStageIndirect().mid).c_str());\n+    out.Write("\\n");\n+    out.Write("      int3 indcoord;\\n");\n+    LookupIndirectTexture("indcoord", "bt");\n+    // out.Write("      int3 indcoord = indtex[bt];\\n");', 'created_at': '2017-07-28T02:15:06Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130000019', 'position': 596, 'pull_request_review_id': 52830483, 'updated_at': '2017-07-28T02:15:06Z', 'id': 130000019, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 596, 'body': 'Should this be removed?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130000019', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130000019'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130000019'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/UberShaderPixel.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-28T02:14:23.991384	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52830410', 'comments': [{'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -0,0 +1,1109 @@\n+// Copyright 2015 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/BPMemory.h"\n+#include "VideoCommon/DriverDetails.h"\n+#include "VideoCommon/NativeVertexFormat.h"\n+#include "VideoCommon/UberShaderCommon.h"\n+#include "VideoCommon/XFMemory.h"\n+\n+namespace UberShader\n+{\n+PixelShaderUid GetPixelShaderUid()\n+{\n+  PixelShaderUid out;\n+  pixel_ubershader_uid_data* uid_data = out.GetUidData<pixel_ubershader_uid_data>();\n+  memset(uid_data, 0, sizeof(*uid_data));\n+  uid_data->num_texgens = xfmem.numTexGen.numTexGens;\n+  uid_data->early_depth =\n+      bpmem.UseEarlyDepthTest() &&\n+      (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED) &&\n+      !(bpmem.zmode.testenable && bpmem.genMode.zfreeze);\n+  uid_data->per_pixel_depth =\n+      (bpmem.ztex2.op != ZTEXTURE_DISABLE && bpmem.UseLateDepthTest()) ||\n+      (!g_ActiveConfig.bFastDepthCalc && bpmem.zmode.testenable && !uid_data->early_depth) ||\n+      (bpmem.zmode.testenable && bpmem.genMode.zfreeze);\n+  return out;\n+}\n+\n+ShaderCode GenPixelShader(APIType ApiType, const ShaderHostConfig& host_config,\n+                          const pixel_ubershader_uid_data* uid_data)\n+{\n+  const bool per_pixel_lighting = host_config.per_pixel_lighting;\n+  const bool msaa = host_config.msaa;\n+  const bool ssaa = host_config.ssaa;\n+  const bool stereo = host_config.stereo;\n+  const bool use_dual_source = host_config.backend_dual_source_blend;\n+  const bool early_depth = uid_data->early_depth != 0;\n+  const bool per_pixel_depth = uid_data->per_pixel_depth != 0;\n+  const bool bounding_box =\n+      host_config.bounding_box && g_ActiveConfig.BBoxUseFragmentShaderImplementation();\n+  const u32 numTexgen = uid_data->num_texgens;\n+  ShaderCode out;\n+\n+  out.Write("// Pixel UberShader for %u texgens%s%s\\n", numTexgen,\n+            early_depth ? ", early-depth" : "", per_pixel_depth ? ", per-pixel depth" : "");\n+  WritePixelShaderCommonHeader(out, ApiType, numTexgen, per_pixel_lighting, bounding_box);\n+  WriteUberShaderCommonHeader(out, ApiType, host_config);\n+  if (per_pixel_lighting)\n+    WriteLightingFunction(out);\n+\n+  // Shader inputs/outputs in GLSL (HLSL is in main).\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+  {\n+    if (use_dual_source)\n+    {\n+      if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_FRAGMENT_SHADER_INDEX_DECORATION))\n+      {\n+        out.Write("FRAGMENT_OUTPUT_LOCATION(0) out vec4 ocol0;\\n");\n+        out.Write("FRAGMENT_OUTPUT_LOCATION(1) out vec4 ocol1;\\n");\n+      }\n+      else\n+      {\n+        out.Write("FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 0) out vec4 ocol0;\\n");\n+        out.Write("FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 1) out vec4 ocol1;\\n");\n+      }\n+    }\n+    else\n+    {\n+      out.Write("FRAGMENT_OUTPUT_LOCATION(0) out vec4 ocol0;\\n");\n+    }\n+\n+    if (per_pixel_depth)\n+      out.Write("#define depth gl_FragDepth\\n");\n+\n+    if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan)\n+    {\n+      out.Write("VARYING_LOCATION(0) in VertexData {\\n");\n+      GenerateVSOutputMembers(out, ApiType, numTexgen, per_pixel_lighting,\n+                              GetInterpolationQualifier(msaa, ssaa));\n+\n+      if (stereo)\n+        out.Write("  flat int layer;\\n");\n+\n+      out.Write("};\\n\\n");\n+    }\n+    else\n+    {\n+      out.Write("%s in float4 colors_0;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      out.Write("%s in float4 colors_1;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      // compute window position if needed because binding semantic WPOS is not widely supported\n+      // Let\'s set up attributes\n+      for (u32 i = 0; i < numTexgen; ++i)\n+        out.Write("%s in float3 tex%d;\\n", GetInterpolationQualifier(msaa, ssaa), i);\n+      out.Write("%s in float4 clipPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      if (per_pixel_lighting)\n+      {\n+        out.Write("%s in float3 Normal;\\n", GetInterpolationQualifier(msaa, ssaa));\n+        out.Write("%s in float3 WorldPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      }\n+    }\n+  }\n+\n+  // Uniform index -> texture coordinates\n+  if (numTexgen > 0)\n+  {\n+    if (ApiType != APIType::D3D)\n+    {\n+      out.Write("float3 selectTexCoord(uint index) {\\n");\n+    }\n+    else\n+    {\n+      out.Write("float3 selectTexCoord(uint index");\n+      for (u32 i = 0; i < numTexgen; i++)\n+        out.Write(", float3 tex%u", i);\n+      out.Write(") {\\n");\n+    }\n+\n+    out.Write("  switch (index) {\\n");\n+    for (u32 i = 0; i < numTexgen; i++)\n+    {\n+      out.Write("  case %uu:\\n"\n+                "    return tex%u;\\n",\n+                i, i);\n+    }\n+    out.Write("  default:\\n"\n+              "    return float3(0.0, 0.0, 0.0);\\n"\n+              "  }\\n"\n+              "}\\n\\n");\n+  }\n+\n+  // =====================\n+  //   Texture Sampling\n+  // =====================\n+\n+  if (host_config.backend_dynamic_sampler_indexing)\n+  {\n+    // Doesn\'t look like directx supports this. Oh well the code path is here just incase it\n+    // supports this in the future.\n+    out.Write("int4 sampleTexture(uint sampler_num, float2 uv) {\\n");\n+    if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+      out.Write("  return iround(texture(samp[sampler_num], float3(uv, 0.0)) * 255.0);\\n");\n+    else if (ApiType == APIType::D3D)\n+      out.Write("  return iround(Tex[sampler_num].Sample(samp[sampler_num], float3(uv, 0.0)) * "\n+                "255.0);\\n");\n+    out.Write("}\\n\\n");\n+  }\n+  else\n+  {\n+    out.Write("int4 sampleTexture(uint sampler_num, float2 uv) {\\n"\n+              "  // This is messy, but DirectX, OpenGl 3.3 and Opengl ES 3.0 doesn\'t support "\n+              "dynamic indexing of the sampler array\\n"\n+              "  // With any luck the shader compiler will optimise this if the hardware supports "\n+              "dynamic indexing.\\n"\n+              "  switch(sampler_num) {\\n");\n+    for (int i = 0; i < 8; i++)\n+    {\n+      if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+        out.Write("  case %du: return iround(texture(samp[%d], float3(uv, 0.0)) * 255.0);\\n", i, i);\n+      else if (ApiType == APIType::D3D)\n+        out.Write("  case %du: return iround(Tex[%d].Sample(samp[%d], float3(uv, 0.0)) * 255.0);\\n",\n+                  i, i, i);\n+    }\n+    out.Write("  }\\n"\n+              "}\\n\\n");\n+  }\n+\n+  // ======================\n+  //   Arbatary Swizzling\n+  // ======================\n+\n+  out.Write("int4 Swizzle(uint s, int4 color) {\\n"\n+            "  // AKA: Color Channel Swapping\\n"\n+            "\\n"\n+            "  int4 ret;\\n");\n+  out.Write("  ret.r = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u)", TevKSel().swap1).c_str());\n+  out.Write("  ret.g = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u)", TevKSel().swap2).c_str());\n+  out.Write("  ret.b = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u + 1u)", TevKSel().swap1).c_str());\n+  out.Write("  ret.a = color[%s];\\n",\n+            BitfieldExtract("bpmem_tevksel(s * 2u + 1u)", TevKSel().swap2).c_str());\n+  out.Write("  return ret;\\n"\n+            "}\\n\\n");\n+\n+  // ======================\n+  //   Indirect Wrappping\n+  // ======================\n+  out.Write("int Wrap(int coord, uint mode) {\\n"\n+            "  if (mode == 0u) // ITW_OFF\\n"\n+            "    return coord;\\n"\n+            "  else if (mode < 6u) // ITW_256 to ITW_16\\n"\n+            "    return coord & (0xfffe >> mode);\\n"\n+            "  else // ITW_0\\n"\n+            "    return 0;\\n"\n+            "}\\n\\n");\n+\n+  // ======================\n+  //    Indirect Lookup\n+  // ======================\n+  auto LookupIndirectTexture = [&out](const char* out_var_name, const char* in_index_name) {\n+    out.Write(\n+        "{\\n"\n+        "  uint iref = bpmem_iref(%s);\\n"\n+        "  if ( iref != 0u)\\n"\n+        "  {\\n"\n+        "    uint texcoord = bitfieldExtract(iref, 0, 3);\\n"\n+        "    uint texmap = bitfieldExtract(iref, 8, 3);\\n"\n+        "    float3 uv = getTexCoord(texcoord);\\n"\n+        "    int2 fixedPoint_uv = int2((uv.z == 0.0 ? uv.xy : (uv.xy / uv.z)) * " I_TEXDIMS\n+        "[texcoord].zw);\\n"\n+        "\\n"\n+        "    if ((%s & 1u) == 0u)\\n"\n+        "      fixedPoint_uv = fixedPoint_uv >> " I_INDTEXSCALE "[%s >> 1].xy;\\n"\n+        "    else\\n"\n+        "      fixedPoint_uv = fixedPoint_uv >> " I_INDTEXSCALE "[%s >> 1].zw;\\n"\n+        "\\n"\n+        "    %s = sampleTexture(texmap, float2(fixedPoint_uv) * " I_TEXDIMS "[texmap].xy).abg;\\n"\n+        "  }\\n"\n+        "  else\\n"\n+        "  {\\n"\n+        "    %s = int3(0, 0, 0);\\n"\n+        "  }\\n"\n+        "}\\n",\n+        in_index_name, in_index_name, in_index_name, in_index_name, out_var_name, out_var_name);\n+  };\n+\n+  // ======================\n+  //   TEV\'s Special Lerp\n+  // ======================\n+  auto WriteTevLerp = [&out](const char* components) {\n+    out.Write("// TEV\'s Linear Interpolate, plus bias, add/subtract and scale\\n"\n+              "int%s tevLerp%s(int%s A, int%s B, int%s C, int%s D, uint bias, bool op, bool alpha, "\n+              "uint shift) {\\n"\n+              " // Scale C from 0..255 to 0..256\\n"\n+              "  C += C >> 7;\\n"\n+              "\\n"\n+              " // Add bias to D\\n"\n+              "  if (bias == 1u) D += 128;\\n"\n+              "  else if (bias == 2u) D -= 128;\\n"\n+              "\\n"\n+              "  int%s lerp = (A << 8) + (B - A)*C;\\n"\n+              "  if (shift != 3u) {\\n"\n+              "    lerp = lerp << shift;\\n"\n+              "    D = D << shift;\\n"\n+              "  }\\n"\n+              "\\n"\n+              "  if ((shift == 3u) == alpha)\\n"\n+              "    lerp = lerp + (op ? 127 : 128);\\n"\n+              "\\n"\n+              "  int%s result = lerp >> 8;\\n"\n+              "\\n"\n+              "  // Add/Subtract D\\n"\n+              "  if(op) // Subtract\\n"\n+              "    result = D - result;\\n"\n+              "  else // Add\\n"\n+              "    result = D + result;\\n"\n+              "\\n"\n+              "  // Most of the Shift was moved inside the lerp for improved percision\\n"\n+              "  // But we still do the divide by 2 here\\n"\n+              "  if (shift == 3u)\\n"\n+              "    result = result >> 1;\\n"\n+              "  return result;\\n"\n+              "}\\n\\n",\n+              components, components, components, components, components, components, components,\n+              components);\n+  };\n+  WriteTevLerp("");   // int\n+  WriteTevLerp("3");  // int3\n+\n+  // =======================\n+  //   TEV\'s Color Compare\n+  // =======================\n+\n+  out.Write(\n+      "// Implements operations 0-5 of tev\'s compare mode,\\n"\n+      "// which are common to both color and alpha channels\\n"\n+      "bool tevCompare(uint op, int3 color_A, int3 color_B) {\\n"\n+      "  switch (op) {\\n"\n+      "  case 0u: // TEVCMP_R8_GT\\n"\n+      "    return (color_A.r > color_B.r);\\n"\n+      "  case 1u: // TEVCMP_R8_EQ\\n"\n+      "    return (color_A.r == color_B.r);\\n"\n+      "  case 2u: // TEVCMP_GR16_GT\\n"\n+      "    int A_16 = (color_A.r | (color_A.g << 8));\\n"\n+      "    int B_16 = (color_B.r | (color_B.g << 8));\\n"\n+      "    return A_16 > B_16;\\n"\n+      "  case 3u: // TEVCMP_GR16_EQ\\n"\n+      "    return (color_A.r == color_B.r && color_A.g == color_B.g);\\n"\n+      "  case 4u: // TEVCMP_BGR24_GT\\n"\n+      "    int A_24 = (color_A.r | (color_A.g << 8) | (color_A.b << 16));\\n"\n+      "    int B_24 = (color_B.r | (color_B.g << 8) | (color_B.b << 16));\\n"\n+      "    return A_24 > B_24;\\n"\n+      "  case 5u: // TEVCMP_BGR24_EQ\\n"\n+      "    return (color_A.r == color_B.r && color_A.g == color_B.g && color_A.b == color_B.b);\\n"\n+      "  default:\\n"\n+      "    return false;\\n"\n+      "  }\\n"\n+      "}\\n\\n");\n+\n+  // =================\n+  //   Alpha Compare\n+  // =================\n+\n+  out.Write("// Helper function for Alpha Test\\n"\n+            "bool alphaCompare(int a, int b, uint compare) {\\n"\n+            "  switch (compare) {\\n"\n+            "  case 0u: // NEVER\\n"\n+            "    return false;\\n"\n+            "  case 1u: // LESS\\n"\n+            "    return a < b;\\n"\n+            "  case 2u: // EQUAL\\n"\n+            "    return a == b;\\n"\n+            "  case 3u: // LEQUAL\\n"\n+            "    return a <= b;\\n"\n+            "  case 4u: // GREATER\\n"\n+            "    return a > b;\\n"\n+            "  case 5u: // NEQUAL;\\n"\n+            "    return a != b;\\n"\n+            "  case 6u: // GEQUAL\\n"\n+            "    return a >= b;\\n"\n+            "  case 7u: // ALWAYS\\n"\n+            "    return true;\\n"\n+            "  }\\n"\n+            "}\\n\\n");\n+\n+  // =================\n+  //   Input Selects\n+  // =================\n+\n+  out.Write("struct State {\\n"\n+            "  int4 Reg[4];\\n"\n+            "  int4 TexColor;\\n"\n+            "  int AlphaBump;\\n"\n+            "};\\n"\n+            "struct StageState {\\n"\n+            "  uint stage;\\n"\n+            "  uint order;\\n"\n+            "  uint cc;\\n"\n+            "  uint ac;\\n");\n+\n+  out.Write("};\\n"\n+            "\\n"\n+            "int4 getRasColor(State s, StageState ss, float4 colors_0, float4 colors_1);\\n"\n+            "int4 getKonstColor(State s, StageState ss);\\n"\n+            "\\n"\n+            "int3 selectColorInput(State s, StageState ss, float4 colors_0, float4 colors_1, uint "\n+            "index) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev.rgb\\n"\n+            "    return s.Reg[0].rgb;\\n"\n+            "  case 1u: // prev.aaa\\n"\n+            "    return s.Reg[0].aaa;\\n"\n+            "  case 2u: // c0.rgb\\n"\n+            "    return s.Reg[1].rgb;\\n"\n+            "  case 3u: // c0.aaa\\n"\n+            "    return s.Reg[1].aaa;\\n"\n+            "  case 4u: // c1.rgb\\n"\n+            "    return s.Reg[2].rgb;\\n"\n+            "  case 5u: // c1.aaa\\n"\n+            "    return s.Reg[2].aaa;\\n"\n+            "  case 6u: // c2.rgb\\n"\n+            "    return s.Reg[3].rgb;\\n"\n+            "  case 7u: // c2.aaa\\n"\n+            "    return s.Reg[3].aaa;\\n"\n+            "  case 8u:\\n"\n+            "    return s.TexColor.rgb;\\n"\n+            "  case 9u:\\n"\n+            "    return s.TexColor.aaa;\\n"\n+            "  case 10u:\\n"\n+            "    return getRasColor(s, ss, colors_0, colors_1).rgb;\\n"\n+            "  case 11u:\\n"\n+            "    return getRasColor(s, ss, colors_0, colors_1).aaa;\\n"\n+            "  case 12u: // One\\n"\n+            "    return int3(255, 255, 255);\\n"\n+            "  case 13u: // Half\\n"\n+            "    return int3(128, 128, 128);\\n"\n+            "  case 14u:\\n"\n+            "    return getKonstColor(s, ss).rgb;\\n"\n+            "  case 15u: // Zero\\n"\n+            "    return int3(0, 0, 0);\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "int selectAlphaInput(State s, StageState ss, float4 colors_0, float4 colors_1, uint "\n+            "index) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev.a\\n"\n+            "    return s.Reg[0].a;\\n"\n+            "  case 1u: // c0.a\\n"\n+            "    return s.Reg[1].a;\\n"\n+            "  case 2u: // c1.a\\n"\n+            "    return s.Reg[2].a;\\n"\n+            "  case 3u: // c2.a\\n"\n+            "    return s.Reg[3].a;\\n"\n+            "  case 4u:\\n"\n+            "    return s.TexColor.a;\\n"\n+            "  case 5u:\\n"\n+            "    return getRasColor(s, ss, colors_0, colors_1).a;\\n"\n+            "  case 6u:\\n"\n+            "    return getKonstColor(s, ss).a;\\n"\n+            "  case 7u: // Zero\\n"\n+            "    return 0;\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "int4 getTevReg(in State s, uint index) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev\\n"\n+            "    return s.Reg[0];\\n"\n+            "  case 1u: // c0\\n"\n+            "    return s.Reg[1];\\n"\n+            "  case 2u: // c1\\n"\n+            "    return s.Reg[2];\\n"\n+            "  case 3u: // c2\\n"\n+            "    return s.Reg[3];\\n"\n+            "  default: // prev\\n"\n+            "    return s.Reg[0];\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "void setRegColor(inout State s, uint index, int3 color) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev\\n"\n+            "    s.Reg[0].rgb = color;\\n"\n+            "    break;\\n"\n+            "  case 1u: // c0\\n"\n+            "    s.Reg[1].rgb = color;\\n"\n+            "    break;\\n"\n+            "  case 2u: // c1\\n"\n+            "    s.Reg[2].rgb = color;\\n"\n+            "    break;\\n"\n+            "  case 3u: // c2\\n"\n+            "    s.Reg[3].rgb = color;\\n"\n+            "    break;\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n"\n+            "void setRegAlpha(inout State s, uint index, int alpha) {\\n"\n+            "  switch (index) {\\n"\n+            "  case 0u: // prev\\n"\n+            "    s.Reg[0].a = alpha;\\n"\n+            "    break;\\n"\n+            "  case 1u: // c0\\n"\n+            "    s.Reg[1].a = alpha;\\n"\n+            "    break;\\n"\n+            "  case 2u: // c1\\n"\n+            "    s.Reg[2].a = alpha;\\n"\n+            "    break;\\n"\n+            "  case 3u: // c2\\n"\n+            "    s.Reg[3].a = alpha;\\n"\n+            "    break;\\n"\n+            "  }\\n"\n+            "}\\n"\n+            "\\n");\n+\n+  // Since the texture coodinate variables aren\'t global, we need to pass\n+  // them to the select function in D3D.\n+  if (numTexgen > 0)\n+  {\n+    if (ApiType != APIType::D3D)\n+    {\n+      out.Write("#define getTexCoord(index) selectTexCoord((index))\\n\\n");\n+    }\n+    else\n+    {\n+      out.Write("#define getTexCoord(index) selectTexCoord((index)");\n+      for (u32 i = 0; i < numTexgen; i++)\n+        out.Write(", tex%u", i);\n+      out.Write(")\\n\\n");\n+    }\n+  }\n+\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+  {\n+    if (early_depth && host_config.backend_early_z)\n+      out.Write("FORCE_EARLY_Z;\\n");\n+\n+    out.Write("void main()\\n{\\n");\n+    out.Write("  float4 rawpos = gl_FragCoord;\\n");\n+  }\n+  else  // D3D\n+  {\n+    if (early_depth && host_config.backend_early_z)\n+      out.Write("[earlydepthstencil]\\n");\n+\n+    out.Write("void main(\\n"\n+              "  out float4 ocol0 : SV_Target0,\\n"\n+              "  out float4 ocol1 : SV_Target1,\\n"\n+              "  %s\\n",\n+              per_pixel_depth ? "\\n  out float depth : SV_Depth," : "");\n+    out.Write("  in float4 rawpos : SV_Position,\\n");\n+\n+    out.Write("  in %s float4 colors_0 : COLOR0,\\n", GetInterpolationQualifier(msaa, ssaa));\n+    out.Write("  in %s float4 colors_1 : COLOR1", GetInterpolationQualifier(msaa, ssaa));\n+\n+    // compute window position if needed because binding semantic WPOS is not widely supported\n+    for (u32 i = 0; i < numTexgen; ++i)\n+      out.Write(",\\n  in %s float3 tex%u : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa), i,\n+                i);\n+    out.Write("\\n,\\n  in %s float4 clipPos : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa),\n+              numTexgen);\n+    if (per_pixel_lighting)\n+    {\n+      out.Write(",\\n  in %s float3 Normal : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa),\n+                numTexgen + 1);\n+      out.Write(",\\n  in %s float3 WorldPos : TEXCOORD%u", GetInterpolationQualifier(msaa, ssaa),\n+                numTexgen + 2);\n+    }\n+    out.Write(",\\n  in float clipDist0 : SV_ClipDistance0\\n");\n+    out.Write(",\\n  in float clipDist1 : SV_ClipDistance1\\n");\n+    if (stereo)\n+      out.Write(",\\n  in uint layer : SV_RenderTargetArrayIndex\\n");\n+    out.Write("\\n        ) {\\n");\n+  }\n+\n+  out.Write("  int3 tevcoord = int3(0, 0, 0);\\n"\n+            "  State s;\\n"\n+            "  s.TexColor = int4(0, 0, 0, 0);\\n"\n+            "  s.AlphaBump = 0;\\n"\n+            "\\n");\n+  for (int i = 0; i < 4; i++)\n+    out.Write("  s.Reg[%d] = " I_COLORS "[%d];\\n", i, i);\n+\n+  if (numTexgen != 0)\n+  {\n+    //     // TODO: Skip preload on Nvidia and other GPUs which can\'t handle dynamic indexed arrays?', 'created_at': '2017-07-28T02:14:22Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129999957', 'position': 529, 'pull_request_review_id': 52830410, 'updated_at': '2017-07-28T02:14:22Z', 'id': 129999957, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 529, 'body': 'Should this be left in?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129999957', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129999957'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129999957'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/UberShaderPixel.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-28T02:08:40.681838	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52829941', 'comments': [{'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -99,6 +133,59 @@ void PixelShaderManager::SetConstants()\n     dirty = true;\n     s_bViewPortChanged = false;\n   }\n+\n+  if (s_bIndirectDirty)\n+  {\n+    for (int i = 0; i < 4; i++)\n+      constants.pack1[i][3] = 0;\n+\n+    for (u32 i = 0; i < (bpmem.genMode.numtevstages + 1); ++i)', 'created_at': '2017-07-28T02:08:39Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129999548', 'position': 58, 'pull_request_review_id': 52829941, 'updated_at': '2017-07-28T02:08:39Z', 'id': 129999548, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 58, 'body': 'Is this zero based?  Why the plus one?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129999548', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129999548'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129999548'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/PixelShaderManager.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T18:45:10.368094	{'pr_title': 'Qt/Config: Remove unused members', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5833#pullrequestreview-52749753', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'ligfx', 'pr_id': 5833, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T18:42:49.268341	{'pr_title': 'LogManager: use layered config', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5770#pullrequestreview-52749066', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'MerryMage', 'pr_id': 5770, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T15:58:21.716077	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52703234', 'comments': [{'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -0,0 +1,240 @@\n+// Copyright 2016 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#pragma once\n+\n+#include <array>\n+#include <cstddef>\n+#include <map>\n+#include <memory>\n+#include <string>\n+#include <unordered_map>\n+#include <utility>\n+\n+#include "Common/CommonTypes.h"\n+#include "Common/LinearDiskCache.h"\n+\n+#include "VideoBackends/Vulkan/Constants.h"\n+#include "VideoBackends/Vulkan/ObjectCache.h"\n+#include "VideoBackends/Vulkan/ShaderCompiler.h"\n+\n+#include "VideoCommon/AsyncShaderCompiler.h"\n+#include "VideoCommon/GeometryShaderGen.h"\n+#include "VideoCommon/PixelShaderGen.h"\n+#include "VideoCommon/RenderState.h"\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/VertexShaderGen.h"\n+\n+namespace Vulkan\n+{\n+class CommandBufferManager;\n+class VertexFormat;\n+class StreamBuffer;\n+\n+class CommandBufferManager;\n+class VertexFormat;\n+class StreamBuffer;\n+\n+struct PipelineInfo\n+{\n+  // These are packed in descending order of size, to avoid any padding so that the structure', 'created_at': '2017-07-27T15:58:20Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129883537', 'position': 42, 'pull_request_review_id': 52703234, 'updated_at': '2017-07-27T15:58:20Z', 'id': 129883537, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 42, 'body': 'Would it be easier on maintainability to just forcing packing (ex: pragma pack)?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129883537', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129883537'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129883537'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoBackends/Vulkan/ShaderCache.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T15:47:40.489922	{'pr_title': 'Support loading BC7 (BPTC) textures from DDS files', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5834#pullrequestreview-52700007', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5834, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T07:04:06.792333	{'pr_title': 'Send rumble data to the adapter on a separate thread', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5809#pullrequestreview-52572092', 'comments': [{'commit_id': '35c82d93e1d6e4770ec52660839dff580ec14a87', 'diff_hunk': '@@ -83,6 +88,25 @@ static void Read()\n   }\n }\n \n+static void Write()\n+{\n+  int size = 0;\n+\n+  while (true)\n+  {\n+    s_rumble_data_available.Wait();\n+\n+    if (s_adapter_thread_running.IsSet())', 'created_at': '2017-07-27T07:03:57Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129766989', 'position': 38, 'pull_request_review_id': 52572092, 'updated_at': '2017-07-27T07:04:04Z', 'id': 129766989, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5809', 'original_position': 38, 'body': 'Very minor, but returning early is preferable to avoid extra levels of indentation ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5809#discussion_r129766989', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5809#discussion_r129766989'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129766989'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5809'}}, 'original_commit_id': '35c82d93e1d6e4770ec52660839dff580ec14a87', 'path': 'Source/Core/InputCommon/GCAdapter.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'leoetlino', 'pr_id': 5809, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T07:04:06.109360	{'pr_title': 'Send rumble data to the adapter on a separate thread', 'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5809#pullrequestreview-52572092', 'comments': [{'commit_id': '35c82d93e1d6e4770ec52660839dff580ec14a87', 'diff_hunk': '@@ -83,6 +88,25 @@ static void Read()\n   }\n }\n \n+static void Write()\n+{\n+  int size = 0;\n+\n+  while (true)\n+  {\n+    s_rumble_data_available.Wait();\n+\n+    if (s_adapter_thread_running.IsSet())', 'created_at': '2017-07-27T07:03:57Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129766989', 'position': 38, 'pull_request_review_id': 52572092, 'updated_at': '2017-07-27T07:04:04Z', 'id': 129766989, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5809', 'original_position': 38, 'body': 'Very minor, but returning early is preferable to avoid extra levels of indentation ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5809#discussion_r129766989', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5809#discussion_r129766989'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129766989'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5809'}}, 'original_commit_id': '35c82d93e1d6e4770ec52660839dff580ec14a87', 'path': 'Source/Core/InputCommon/GCAdapter.cpp'}], 'state': 'pending', 'source': 'ghhookparser', 'author': 'leoetlino', 'pr_id': 5809, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T07:01:21.030249	{'pr_title': 'DolphinQt2: Remove unimplemented prototypes', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5830#pullrequestreview-52571670', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'leoetlino', 'pr_id': 5830, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T07:00:48.492438	{'pr_title': 'DolphinQt2: Add missing include guards', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5831#pullrequestreview-52571568', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'leoetlino', 'pr_id': 5831, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:53:09.823690	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52557325', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -322,44 +338,134 @@ bool StateTracker::CheckForShaderChanges(u32 gx_primitive_type)\n {\n   VertexShaderUid vs_uid = GetVertexShaderUid();', 'created_at': '2017-07-27T04:53:08Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129753489', 'position': 115, 'pull_request_review_id': 52557325, 'updated_at': '2017-07-27T04:53:08Z', 'id': 129753489, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 115, 'body': 'Just a couple of questions about this function:  1) Why does this return a bool if it never uses it?  2) Where is this logic captured in the other backends?  Is there any particular reason this is so different?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129753489', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129753489'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129753489'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'path': 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:51:25.792190	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52557179', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -0,0 +1,1377 @@\n+// Copyright 2016 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoBackends/Vulkan/ShaderCache.h"\n+\n+#include <algorithm>\n+#include <sstream>\n+#include <type_traits>\n+#include <xxhash.h>\n+\n+#include "Common/Assert.h"\n+#include "Common/CommonFuncs.h"\n+#include "Common/LinearDiskCache.h"\n+#include "Common/MsgHandler.h"\n+\n+#include "Core/ConfigManager.h"\n+#include "Core/Host.h"\n+\n+#include "VideoBackends/Vulkan/FramebufferManager.h"\n+#include "VideoBackends/Vulkan/ShaderCompiler.h"\n+#include "VideoBackends/Vulkan/StreamBuffer.h"\n+#include "VideoBackends/Vulkan/Util.h"\n+#include "VideoBackends/Vulkan/VertexFormat.h"\n+#include "VideoBackends/Vulkan/VulkanContext.h"\n+#include "VideoCommon/AsyncShaderCompiler.h"\n+#include "VideoCommon/GeometryShaderGen.h"\n+#include "VideoCommon/Statistics.h"\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/VertexLoaderManager.h"\n+\n+namespace Vulkan\n+{\n+std::unique_ptr<ShaderCache> g_shader_cache;\n+\n+ShaderCache::ShaderCache()\n+{\n+}\n+\n+ShaderCache::~ShaderCache()\n+{\n+  DestroyPipelineCache();\n+  DestroyShaderCaches();\n+  DestroySharedShaders();\n+}\n+\n+bool ShaderCache::Initialize()\n+{\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    if (!LoadPipelineCache())\n+      return false;\n+  }\n+  else\n+  {\n+    if (!CreatePipelineCache())\n+      return false;\n+  }\n+\n+  if (!CompileSharedShaders())\n+    return false;\n+\n+  m_async_shader_compiler = std::make_unique<VideoCommon::AsyncShaderCompiler>();\n+  m_async_shader_compiler->ResizeWorkerThreads(g_ActiveConfig.CanPrecompileUberShaders() ?\n+                                                   g_ActiveConfig.GetShaderPrecompilerThreads() :\n+                                                   g_ActiveConfig.GetShaderCompilerThreads());\n+  return true;\n+}\n+\n+void ShaderCache::Shutdown()\n+{\n+  if (m_async_shader_compiler)\n+  {\n+    m_async_shader_compiler->StopWorkerThreads();\n+    m_async_shader_compiler->RetrieveWorkItems();\n+  }\n+}\n+\n+static bool IsStripPrimitiveTopology(VkPrimitiveTopology topology)\n+{\n+  return topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;\n+}\n+\n+static VkPipelineRasterizationStateCreateInfo\n+GetVulkanRasterizationState(const RasterizationState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                               pNext\n+      0,                        // VkPipelineRasterizationStateCreateFlags   flags\n+      state.depth_clamp,        // VkBool32                                  depthClampEnable\n+      VK_FALSE,                 // VkBool32                                  rasterizerDiscardEnable\n+      VK_POLYGON_MODE_FILL,     // VkPolygonMode                             polygonMode\n+      state.cull_mode,          // VkCullModeFlags                           cullMode\n+      VK_FRONT_FACE_CLOCKWISE,  // VkFrontFace                               frontFace\n+      VK_FALSE,                 // VkBool32                                  depthBiasEnable\n+      0.0f,                     // float                                     depthBiasConstantFactor\n+      0.0f,                     // float                                     depthBiasClamp\n+      0.0f,                     // float                                     depthBiasSlopeFactor\n+      1.0f                      // float                                     lineWidth\n+  };\n+}\n+\n+static VkPipelineMultisampleStateCreateInfo\n+GetVulkanMultisampleState(const RasterizationState& rs_state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                      // const void*                              pNext\n+      0,                            // VkPipelineMultisampleStateCreateFlags    flags\n+      rs_state.samples,             // VkSampleCountFlagBits                    rasterizationSamples\n+      rs_state.per_sample_shading,  // VkBool32                                 sampleShadingEnable\n+      1.0f,                         // float                                    minSampleShading\n+      nullptr,                      // const VkSampleMask*                      pSampleMask;\n+      VK_FALSE,  // VkBool32                                 alphaToCoverageEnable\n+      VK_FALSE   // VkBool32                                 alphaToOneEnable\n+  };\n+}\n+\n+static VkPipelineDepthStencilStateCreateInfo\n+GetVulkanDepthStencilState(const DepthStencilState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,             // const void*                               pNext\n+      0,                   // VkPipelineDepthStencilStateCreateFlags    flags\n+      state.test_enable,   // VkBool32                                  depthTestEnable\n+      state.write_enable,  // VkBool32                                  depthWriteEnable\n+      state.compare_op,    // VkCompareOp                               depthCompareOp\n+      VK_FALSE,            // VkBool32                                  depthBoundsTestEnable\n+      VK_FALSE,            // VkBool32                                  stencilTestEnable\n+      {},                  // VkStencilOpState                          front\n+      {},                  // VkStencilOpState                          back\n+      0.0f,                // float                                     minDepthBounds\n+      1.0f                 // float                                     maxDepthBounds\n+  };\n+}\n+\n+static VkPipelineColorBlendAttachmentState GetVulkanAttachmentBlendState(const BlendingState& state)\n+{\n+  VkPipelineColorBlendAttachmentState vk_state = {};\n+  vk_state.blendEnable = static_cast<VkBool32>(state.blendenable);\n+  vk_state.colorBlendOp = state.subtract ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+  vk_state.alphaBlendOp = state.subtractAlpha ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+\n+  if (state.usedualsrc && g_vulkan_context->SupportsDualSourceBlend())\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+  else\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+\n+  if (state.colorupdate)\n+  {\n+    vk_state.colorWriteMask =\n+        VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT;\n+  }\n+  else\n+  {\n+    vk_state.colorWriteMask = 0;\n+  }\n+\n+  if (state.alphaupdate)\n+    vk_state.colorWriteMask |= VK_COLOR_COMPONENT_A_BIT;\n+\n+  return vk_state;\n+}\n+\n+static VkPipelineColorBlendStateCreateInfo\n+GetVulkanColorBlendState(const BlendingState& state,\n+                         const VkPipelineColorBlendAttachmentState* attachments,\n+                         uint32_t num_attachments)\n+{\n+  static constexpr std::array<VkLogicOp, 16> vk_logic_ops = {\n+      {VK_LOGIC_OP_CLEAR, VK_LOGIC_OP_AND, VK_LOGIC_OP_AND_REVERSE, VK_LOGIC_OP_COPY,\n+       VK_LOGIC_OP_AND_INVERTED, VK_LOGIC_OP_NO_OP, VK_LOGIC_OP_XOR, VK_LOGIC_OP_OR,\n+       VK_LOGIC_OP_NOR, VK_LOGIC_OP_EQUIVALENT, VK_LOGIC_OP_INVERT, VK_LOGIC_OP_OR_REVERSE,\n+       VK_LOGIC_OP_COPY_INVERTED, VK_LOGIC_OP_OR_INVERTED, VK_LOGIC_OP_NAND, VK_LOGIC_OP_SET}};\n+\n+  VkBool32 vk_logic_op_enable = static_cast<VkBool32>(state.logicopenable);\n+  if (vk_logic_op_enable && !g_vulkan_context->SupportsLogicOps())\n+  {\n+    // At the time of writing, Adreno and Mali drivers didn\'t support logic ops.\n+    // The "emulation" through blending path has been removed, so just disable it completely.\n+    // These drivers don\'t support dual-source blend either, so issues are to be expected.\n+    vk_logic_op_enable = VK_FALSE;\n+  }\n+\n+  VkLogicOp vk_logic_op = vk_logic_op_enable ? vk_logic_ops[state.logicmode] : VK_LOGIC_OP_CLEAR;\n+\n+  VkPipelineColorBlendStateCreateInfo vk_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                   pNext\n+      0,                        // VkPipelineColorBlendStateCreateFlags          flags\n+      vk_logic_op_enable,       // VkBool32                                      logicOpEnable\n+      vk_logic_op,              // VkLogicOp                                     logicOp\n+      num_attachments,          // uint32_t                                      attachmentCount\n+      attachments,              // const VkPipelineColorBlendAttachmentState*    pAttachments\n+      {1.0f, 1.0f, 1.0f, 1.0f}  // float                                         blendConstants[4]\n+  };\n+\n+  return vk_state;\n+}\n+\n+VkPipeline ShaderCache::CreatePipeline(const PipelineInfo& info)\n+{\n+  // Declare descriptors for empty vertex buffers/attributes\n+  static const VkPipelineVertexInputStateCreateInfo empty_vertex_input_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,  // const void*                                pNext\n+      0,        // VkPipelineVertexInputStateCreateFlags       flags\n+      0,        // uint32_t                                    vertexBindingDescriptionCount\n+      nullptr,  // const VkVertexInputBindingDescription*      pVertexBindingDescriptions\n+      0,        // uint32_t                                    vertexAttributeDescriptionCount\n+      nullptr   // const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions\n+  };\n+\n+  // Vertex inputs\n+  const VkPipelineVertexInputStateCreateInfo& vertex_input_state =\n+      info.vertex_format ? info.vertex_format->GetVertexInputStateInfo() : empty_vertex_input_state;\n+\n+  // Input assembly\n+  VkPipelineInputAssemblyStateCreateInfo input_assembly_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                pNext\n+      0,                        // VkPipelineInputAssemblyStateCreateFlags    flags\n+      info.primitive_topology,  // VkPrimitiveTopology                        topology\n+      VK_FALSE                  // VkBool32                                   primitiveRestartEnable\n+  };\n+\n+  // See Vulkan spec, section 19:\n+  // If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,\n+  // primitiveRestartEnable must be VK_FALSE\n+  if (g_ActiveConfig.backend_info.bSupportsPrimitiveRestart &&\n+      IsStripPrimitiveTopology(info.primitive_topology))\n+  {\n+    input_assembly_state.primitiveRestartEnable = VK_TRUE;\n+  }\n+\n+  // Shaders to stages\n+  VkPipelineShaderStageCreateInfo shader_stages[3];\n+  uint32_t num_shader_stages = 0;\n+  if (info.vs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_VERTEX_BIT,\n+                                          info.vs,\n+                                          "main"};\n+  }\n+  if (info.gs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_GEOMETRY_BIT,\n+                                          info.gs,\n+                                          "main"};\n+  }\n+  if (info.ps != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_FRAGMENT_BIT,\n+                                          info.ps,\n+                                          "main"};\n+  }\n+\n+  // Fill in Vulkan descriptor structs from our state structures.\n+  VkPipelineRasterizationStateCreateInfo rasterization_state =\n+      GetVulkanRasterizationState(info.rasterization_state);\n+  VkPipelineMultisampleStateCreateInfo multisample_state =\n+      GetVulkanMultisampleState(info.rasterization_state);\n+  VkPipelineDepthStencilStateCreateInfo depth_stencil_state =\n+      GetVulkanDepthStencilState(info.depth_stencil_state);\n+  VkPipelineColorBlendAttachmentState blend_attachment_state =\n+      GetVulkanAttachmentBlendState(info.blend_state);\n+  VkPipelineColorBlendStateCreateInfo blend_state =\n+      GetVulkanColorBlendState(info.blend_state, &blend_attachment_state, 1);\n+\n+  // This viewport isn\'t used, but needs to be specified anyway.\n+  static const VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};\n+  static const VkRect2D scissor = {{0, 0}, {1, 1}};\n+  static const VkPipelineViewportStateCreateInfo viewport_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,\n+      nullptr,\n+      0,          // VkPipelineViewportStateCreateFlags    flags;\n+      1,          // uint32_t                              viewportCount\n+      &viewport,  // const VkViewport*                     pViewports\n+      1,          // uint32_t                              scissorCount\n+      &scissor    // const VkRect2D*                       pScissors\n+  };\n+\n+  // Set viewport and scissor dynamic state so we can change it elsewhere.\n+  static const VkDynamicState dynamic_states[] = {VK_DYNAMIC_STATE_VIEWPORT,\n+                                                  VK_DYNAMIC_STATE_SCISSOR};\n+  static const VkPipelineDynamicStateCreateInfo dynamic_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, nullptr,\n+      0,                                            // VkPipelineDynamicStateCreateFlags    flags\n+      static_cast<u32>(ArraySize(dynamic_states)),  // uint32_t dynamicStateCount\n+      dynamic_states  // const VkDynamicState*                pDynamicStates\n+  };\n+\n+  // Combine to full pipeline info structure.\n+  VkGraphicsPipelineCreateInfo pipeline_info = {\n+      VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,\n+      nullptr,                // VkStructureType sType\n+      0,                      // VkPipelineCreateFlags                            flags\n+      num_shader_stages,      // uint32_t                                         stageCount\n+      shader_stages,          // const VkPipelineShaderStageCreateInfo*           pStages\n+      &vertex_input_state,    // const VkPipelineVertexInputStateCreateInfo*      pVertexInputState\n+      &input_assembly_state,  // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState\n+      nullptr,                // const VkPipelineTessellationStateCreateInfo*     pTessellationState\n+      &viewport_state,        // const VkPipelineViewportStateCreateInfo*         pViewportState\n+      &rasterization_state,  // const VkPipelineRasterizationStateCreateInfo*    pRasterizationState\n+      &multisample_state,    // const VkPipelineMultisampleStateCreateInfo*      pMultisampleState\n+      &depth_stencil_state,  // const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState\n+      &blend_state,          // const VkPipelineColorBlendStateCreateInfo*       pColorBlendState\n+      &dynamic_state,        // const VkPipelineDynamicStateCreateInfo*          pDynamicState\n+      info.pipeline_layout,  // VkPipelineLayout                                 layout\n+      info.render_pass,      // VkRenderPass                                     renderPass\n+      0,                     // uint32_t                                         subpass\n+      VK_NULL_HANDLE,        // VkPipeline                                       basePipelineHandle\n+      -1                     // int32_t                                          basePipelineIndex\n+  };\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateGraphicsPipelines(g_vulkan_context->GetDevice(), m_pipeline_cache, 1,\n+                                           &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateGraphicsPipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetPipeline(const PipelineInfo& info)\n+{\n+  return GetPipelineWithCacheResult(info).first;\n+}\n+\n+std::pair<VkPipeline, bool> ShaderCache::GetPipelineWithCacheResult(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+  {\n+    // If it\'s background compiling, ignore it, and recompile it synchronously.\n+    if (!iter->second.second)\n+      return std::make_pair(iter->second.first, true);\n+    else\n+      m_pipeline_objects.erase(iter);\n+  }\n+\n+  VkPipeline pipeline = CreatePipeline(info);\n+  m_pipeline_objects.emplace(info, std::make_pair(pipeline, false));\n+  _assert_(pipeline != VK_NULL_HANDLE);\n+  return {pipeline, false};\n+}\n+\n+std::pair<std::pair<VkPipeline, bool>, bool>\n+ShaderCache::GetPipelineWithCacheResultAsync(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+    return std::make_pair(iter->second, true);\n+\n+  // Kick a job off.\n+  m_async_shader_compiler->QueueWorkItem(\n+      m_async_shader_compiler->CreateWorkItem<PipelineCompilerWorkItem>(info));\n+  m_pipeline_objects.emplace(info, std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true));\n+  return std::make_pair(std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true), false);\n+}\n+\n+VkPipeline ShaderCache::CreateComputePipeline(const ComputePipelineInfo& info)\n+{\n+  VkComputePipelineCreateInfo pipeline_info = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,\n+                                               nullptr,\n+                                               0,\n+                                               {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                                nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT, info.cs,\n+                                                "main", nullptr},\n+                                               info.pipeline_layout,\n+                                               VK_NULL_HANDLE,\n+                                               -1};\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateComputePipelines(g_vulkan_context->GetDevice(), VK_NULL_HANDLE, 1,\n+                                          &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateComputePipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetComputePipeline(const ComputePipelineInfo& info)\n+{\n+  auto iter = m_compute_pipeline_objects.find(info);\n+  if (iter != m_compute_pipeline_objects.end())\n+    return iter->second;\n+\n+  VkPipeline pipeline = CreateComputePipeline(info);\n+  m_compute_pipeline_objects.emplace(info, pipeline);\n+  return pipeline;\n+}\n+\n+void ShaderCache::ClearPipelineCache()\n+{\n+  // TODO: Stop any async compiling happening.\n+  for (const auto& it : m_pipeline_objects)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  m_pipeline_objects.clear();\n+\n+  for (const auto& it : m_compute_pipeline_objects)\n+  {\n+    if (it.second != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second, nullptr);\n+  }\n+  m_compute_pipeline_objects.clear();\n+}\n+\n+class PipelineCacheReadCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  PipelineCacheReadCallback(std::vector<u8>* data) : m_data(data) {}\n+  void Read(const u32& key, const u8* value, u32 value_size) override\n+  {\n+    m_data->resize(value_size);\n+    if (value_size > 0)\n+      memcpy(m_data->data(), value, value_size);\n+  }\n+\n+private:\n+  std::vector<u8>* m_data;\n+};\n+\n+class PipelineCacheReadIgnoreCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  void Read(const u32& key, const u8* value, u32 value_size) override {}\n+};\n+\n+bool ShaderCache::CreatePipelineCache()\n+{\n+  // Vulkan pipeline caches can be shared between games for shader compile time reduction.\n+  // This assumes that drivers don\'t create all pipelines in the cache on load time, only\n+  // when a lookup occurs that matches a pipeline (or pipeline data) in the cache.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      0,                                             // size_t                     initialDataSize\n+      nullptr                                        // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed: ");\n+  return false;\n+}\n+\n+bool ShaderCache::LoadPipelineCache()\n+{\n+  // We have to keep the pipeline cache file name around since when we save it\n+  // we delete the old one, by which time the game\'s unique ID is already cleared.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  std::vector<u8> disk_data;\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadCallback read_callback(&disk_data);\n+  if (disk_cache.OpenAndRead(m_pipeline_cache_filename, read_callback) != 1)\n+    disk_data.clear();\n+\n+  if (!disk_data.empty() && !ValidatePipelineCache(disk_data.data(), disk_data.size()))\n+  {\n+    // Don\'t use this data. In fact, we should delete it to prevent it from being used next time.\n+    File::Delete(m_pipeline_cache_filename);\n+    return CreatePipelineCache();\n+  }\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      disk_data.size(),                              // size_t                     initialDataSize\n+      disk_data.data()                               // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  // Failed to create pipeline cache, try with it empty.\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed, trying empty cache: ");\n+  return CreatePipelineCache();\n+}\n+\n+// Based on Vulkan 1.0 specification,\n+// Table 9.1. Layout for pipeline cache header version VK_PIPELINE_CACHE_HEADER_VERSION_ONE\n+// NOTE: This data is assumed to be in little-endian format.\n+#pragma pack(push, 4)\n+struct VK_PIPELINE_CACHE_HEADER\n+{\n+  u32 header_length;\n+  u32 header_version;\n+  u32 vendor_id;\n+  u32 device_id;\n+  u8 uuid[VK_UUID_SIZE];\n+};\n+#pragma pack(pop)\n+// TODO: Remove the #if here when GCC 5 is a minimum build requirement.\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5\n+static_assert(std::has_trivial_copy_constructor<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#else\n+static_assert(std::is_trivially_copyable<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#endif\n+\n+bool ShaderCache::ValidatePipelineCache(const u8* data, size_t data_length)\n+{\n+  if (data_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header");\n+    return false;\n+  }\n+\n+  VK_PIPELINE_CACHE_HEADER header;\n+  std::memcpy(&header, data, sizeof(header));\n+  if (header.header_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header length");\n+    return false;\n+  }\n+\n+  if (header.header_version != VK_PIPELINE_CACHE_HEADER_VERSION_ONE)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header version");\n+    return false;\n+  }\n+\n+  if (header.vendor_id != g_vulkan_context->GetDeviceProperties().vendorID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect vendor ID (file: 0x%X, device: 0x%X)",\n+              header.vendor_id, g_vulkan_context->GetDeviceProperties().vendorID);\n+    return false;\n+  }\n+\n+  if (header.device_id != g_vulkan_context->GetDeviceProperties().deviceID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect device ID (file: 0x%X, device: 0x%X)",\n+              header.device_id, g_vulkan_context->GetDeviceProperties().deviceID);\n+    return false;\n+  }\n+\n+  if (std::memcmp(header.uuid, g_vulkan_context->GetDeviceProperties().pipelineCacheUUID,\n+                  VK_UUID_SIZE) != 0)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Incorrect UUID");\n+    return false;\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroyPipelineCache()\n+{\n+  ClearPipelineCache();\n+  vkDestroyPipelineCache(g_vulkan_context->GetDevice(), m_pipeline_cache, nullptr);\n+  m_pipeline_cache = VK_NULL_HANDLE;\n+}\n+\n+void ShaderCache::SavePipelineCache()\n+{\n+  size_t data_size;\n+  VkResult res =\n+      vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size, nullptr);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  std::vector<u8> data(data_size);\n+  res = vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size,\n+                               data.data());\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  // Delete the old cache and re-create.\n+  File::Delete(m_pipeline_cache_filename);\n+\n+  // We write a single key of 1, with the entire pipeline cache data.\n+  // Not ideal, but our disk cache class does not support just writing a single blob\n+  // of data without specifying a key.\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadIgnoreCallback callback;\n+  disk_cache.OpenAndRead(m_pipeline_cache_filename, callback);\n+  disk_cache.Append(1, data.data(), static_cast<u32>(data.size()));\n+  disk_cache.Close();\n+}\n+\n+// Cache inserter that is called back when reading from the file\n+template <typename Uid>\n+struct ShaderCacheReader : public LinearDiskCacheReader<Uid, u32>\n+{\n+  ShaderCacheReader(std::map<Uid, std::pair<VkShaderModule, bool>>& shader_map)\n+      : m_shader_map(shader_map)\n+  {\n+  }\n+  void Read(const Uid& key, const u32* value, u32 value_size) override\n+  {\n+    // We don\'t insert null modules into the shader map since creation could succeed later on.\n+    // e.g. we\'re generating bad code, but fix this in a later version, and for some reason\n+    // the cache is not invalidated.\n+    VkShaderModule module = Util::CreateShaderModule(value, value_size);\n+    if (module == VK_NULL_HANDLE)\n+      return;\n+\n+    m_shader_map.emplace(key, std::make_pair(module, false));\n+  }\n+\n+  std::map<Uid, std::pair<VkShaderModule, bool>>& m_shader_map;\n+};\n+\n+void ShaderCache::LoadShaderCaches()\n+{\n+  ShaderCacheReader<VertexShaderUid> vs_reader(m_vs_cache.shader_map);\n+  m_vs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "VS", true, true),\n+                                    vs_reader);\n+\n+  ShaderCacheReader<PixelShaderUid> ps_reader(m_ps_cache.shader_map);\n+  m_ps_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "PS", true, true),\n+                                    ps_reader);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    ShaderCacheReader<GeometryShaderUid> gs_reader(m_gs_cache.shader_map);\n+    m_gs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "GS", true, true),\n+                                      gs_reader);\n+  }\n+\n+  ShaderCacheReader<UberShader::VertexShaderUid> uber_vs_reader(m_uber_vs_cache.shader_map);\n+  m_uber_vs_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberVS", false, true), uber_vs_reader);\n+  ShaderCacheReader<UberShader::PixelShaderUid> uber_ps_reader(m_uber_ps_cache.shader_map);\n+  m_uber_ps_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberPS", false, true), uber_ps_reader);\n+\n+  SETSTAT(stats.numPixelShadersCreated, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numPixelShadersAlive, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersCreated, static_cast<int>(m_vs_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersAlive, static_cast<int>(m_vs_cache.shader_map.size()));\n+}\n+\n+template <typename T>\n+static void DestroyShaderCache(T& cache)\n+{\n+  cache.disk_cache.Sync();\n+  cache.disk_cache.Close();\n+  for (const auto& it : cache.shader_map)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  cache.shader_map.clear();\n+}\n+\n+void ShaderCache::DestroyShaderCaches()\n+{\n+  DestroyShaderCache(m_vs_cache);\n+  DestroyShaderCache(m_ps_cache);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+    DestroyShaderCache(m_gs_cache);\n+\n+  DestroyShaderCache(m_uber_vs_cache);\n+  DestroyShaderCache(m_uber_ps_cache);\n+\n+  SETSTAT(stats.numPixelShadersCreated, 0);\n+  SETSTAT(stats.numPixelShadersAlive, 0);\n+  SETSTAT(stats.numVertexShadersCreated, 0);\n+  SETSTAT(stats.numVertexShadersAlive, 0);\n+}\n+\n+VkShaderModule ShaderCache::GetVertexShaderForUid(const VertexShaderUid& uid)\n+{\n+  auto it = m_vs_cache.shader_map.find(uid);\n+  if (it != m_vs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_vs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GenerateVertexShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileVertexShader(&spv, source_code.GetBuffer().c_str(),\n+                                          source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_vs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numVertexShadersCreated);\n+      INCSTAT(stats.numVertexShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_vs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetGeometryShaderForUid(const GeometryShaderUid& uid)\n+{\n+  _assert_(g_vulkan_context->SupportsGeometryShaders());\n+  auto it = m_gs_cache.shader_map.find(uid);\n+  if (it != m_gs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_gs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GenerateGeometryShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileGeometryShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+      m_gs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_gs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetPixelShaderForUid(const PixelShaderUid& uid)\n+{\n+  auto it = m_ps_cache.shader_map.find(uid);\n+  if (it != m_ps_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_ps_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GeneratePixelShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_ps_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numPixelShadersCreated);\n+      INCSTAT(stats.numPixelShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_ps_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetVertexUberShaderForUid(const UberShader::VertexShaderUid& uid)\n+{\n+  auto it = m_uber_vs_cache.shader_map.find(uid);\n+  if (it != m_uber_vs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_uber_vs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code = UberShader::GenVertexShader(\n+      APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileVertexShader(&spv, source_code.GetBuffer().c_str(),\n+                                          source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_uber_vs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numVertexShadersCreated);\n+      INCSTAT(stats.numVertexShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_uber_vs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetPixelUberShaderForUid(const UberShader::PixelShaderUid& uid)\n+{\n+  auto it = m_uber_ps_cache.shader_map.find(uid);\n+  if (it != m_uber_ps_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_uber_ps_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      UberShader::GenPixelShader(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_uber_ps_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numPixelShadersCreated);\n+      INCSTAT(stats.numPixelShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_uber_ps_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+void ShaderCache::RecompileSharedShaders()\n+{\n+  DestroySharedShaders();\n+  if (!CompileSharedShaders())\n+    PanicAlert("Failed to recompile shared shaders.");\n+}\n+\n+void ShaderCache::ReloadShaderAndPipelineCaches()\n+{\n+  m_async_shader_compiler->WaitUntilCompletion();\n+  m_async_shader_compiler->RetrieveWorkItems();\n+\n+  SavePipelineCache();\n+  DestroyShaderCaches();\n+  DestroyPipelineCache();\n+\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    LoadPipelineCache();\n+  }\n+  else\n+  {\n+    CreatePipelineCache();\n+  }\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n+}\n+\n+std::string ShaderCache::GetUtilityShaderHeader() const\n+{\n+  std::stringstream ss;\n+  if (g_ActiveConfig.iMultisamples > 1)\n+  {\n+    ss << "#define MSAA_ENABLED 1" << std::endl;\n+    ss << "#define MSAA_SAMPLES " << g_ActiveConfig.iMultisamples << std::endl;\n+    if (g_ActiveConfig.bSSAA)\n+      ss << "#define SSAA_ENABLED 1" << std::endl;\n+  }\n+\n+  u32 efb_layers = (g_ActiveConfig.iStereoMode != STEREO_OFF) ? 2 : 1;\n+  ss << "#define EFB_LAYERS " << efb_layers << std::endl;\n+\n+  return ss.str();\n+}\n+\n+// Comparison operators for PipelineInfos\n+// Since these all boil down to POD types, we can just memcmp the entire thing for speed\n+// The is_trivially_copyable check fails on MSVC due to BitField.\n+// TODO: Can we work around this any way?\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5 && !defined(_MSC_VER)\n+static_assert(std::has_trivial_copy_constructor<PipelineInfo>::value,\n+              "PipelineInfo is trivially copyable");\n+#elif !defined(_MSC_VER)\n+static_assert(std::is_trivially_copyable<PipelineInfo>::value,\n+              "PipelineInfo is trivially copyable");\n+#endif\n+\n+std::size_t PipelineInfoHash::operator()(const PipelineInfo& key) const\n+{\n+  return static_cast<std::size_t>(XXH64(&key, sizeof(key), 0));\n+}\n+\n+bool operator==(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;\n+}\n+\n+bool operator!=(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator<(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) < 0;\n+}\n+\n+bool operator>(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) > 0;\n+}\n+\n+bool operator==(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits == rhs.bits;\n+}\n+\n+bool operator!=(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator>(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits > rhs.bits;\n+}\n+\n+bool operator<(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits < rhs.bits;\n+}\n+\n+std::size_t ComputePipelineInfoHash::operator()(const ComputePipelineInfo& key) const\n+{\n+  return static_cast<std::size_t>(XXH64(&key, sizeof(key), 0));\n+}\n+\n+bool operator==(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;\n+}\n+\n+bool operator!=(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator<(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) < 0;\n+}\n+\n+bool operator>(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) > 0;\n+}\n+\n+bool ShaderCache::CompileSharedShaders()\n+{\n+  static const char PASSTHROUGH_VERTEX_SHADER_SOURCE[] = R"(\n+    layout(location = 0) in vec4 ipos;\n+    layout(location = 5) in vec4 icol0;\n+    layout(location = 8) in vec3 itex0;\n+\n+    layout(location = 0) out vec3 uv0;\n+    layout(location = 1) out vec4 col0;\n+\n+    void main()\n+    {\n+      gl_Position = ipos;\n+      uv0 = itex0;\n+      col0 = icol0;\n+    }\n+  )";\n+\n+  static const char PASSTHROUGH_GEOMETRY_SHADER_SOURCE[] = R"(\n+    layout(triangles) in;\n+    layout(triangle_strip, max_vertices = EFB_LAYERS * 3) out;\n+\n+    layout(location = 0) in vec3 in_uv0[];\n+    layout(location = 1) in vec4 in_col0[];\n+\n+    layout(location = 0) out vec3 out_uv0;\n+    layout(location = 1) out vec4 out_col0;\n+\n+    void main()\n+    {\n+      for (int j = 0; j < EFB_LAYERS; j++)\n+      {\n+        for (int i = 0; i < 3; i++)\n+        {\n+          gl_Layer = j;\n+          gl_Position = gl_in[i].gl_Position;\n+          out_uv0 = vec3(in_uv0[i].xy, float(j));\n+          out_col0 = in_col0[i];\n+          EmitVertex();\n+        }\n+        EndPrimitive();\n+      }\n+    }\n+  )";\n+\n+  static const char SCREEN_QUAD_VERTEX_SHADER_SOURCE[] = R"(\n+    layout(location = 0) out vec3 uv0;\n+\n+    void main()\n+    {\n+        /*\n+         * id   &1    &2   clamp(*2-1)\n+         * 0    0,0   0,0  -1,-1      TL\n+         * 1    1,0   1,0  1,-1       TR\n+         * 2    0,2   0,1  -1,1       BL\n+         * 3    1,2   1,1  1,1        BR\n+         */\n+        vec2 rawpos = vec2(float(gl_VertexID & 1), clamp(float(gl_VertexID & 2), 0.0f, 1.0f));\n+        gl_Position = vec4(rawpos * 2.0f - 1.0f, 0.0f, 1.0f);\n+        uv0 = vec3(rawpos, 0.0f);\n+    }\n+  )";\n+\n+  static const char SCREEN_QUAD_GEOMETRY_SHADER_SOURCE[] = R"(\n+    layout(triangles) in;\n+    layout(triangle_strip, max_vertices = EFB_LAYERS * 3) out;\n+\n+    layout(location = 0) in vec3 in_uv0[];\n+\n+    layout(location = 0) out vec3 out_uv0;\n+\n+    void main()\n+    {\n+      for (int j = 0; j < EFB_LAYERS; j++)\n+      {\n+        for (int i = 0; i < 3; i++)\n+        {\n+          gl_Layer = j;\n+          gl_Position = gl_in[i].gl_Position;\n+          out_uv0 = vec3(in_uv0[i].xy, float(j));\n+          EmitVertex();\n+        }\n+        EndPrimitive();\n+      }\n+    }\n+  )";\n+\n+  std::string header = GetUtilityShaderHeader();\n+\n+  m_screen_quad_vertex_shader =\n+      Util::CompileAndCreateVertexShader(header + SCREEN_QUAD_VERTEX_SHADER_SOURCE);\n+  m_passthrough_vertex_shader =\n+      Util::CompileAndCreateVertexShader(header + PASSTHROUGH_VERTEX_SHADER_SOURCE);\n+  if (m_screen_quad_vertex_shader == VK_NULL_HANDLE ||\n+      m_passthrough_vertex_shader == VK_NULL_HANDLE)\n+  {\n+    return false;\n+  }\n+\n+  if (g_ActiveConfig.iStereoMode != STEREO_OFF && g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    m_screen_quad_geometry_shader =\n+        Util::CompileAndCreateGeometryShader(header + SCREEN_QUAD_GEOMETRY_SHADER_SOURCE);\n+    m_passthrough_geometry_shader =\n+        Util::CompileAndCreateGeometryShader(header + PASSTHROUGH_GEOMETRY_SHADER_SOURCE);\n+    if (m_screen_quad_geometry_shader == VK_NULL_HANDLE ||\n+        m_passthrough_geometry_shader == VK_NULL_HANDLE)\n+    {\n+      return false;\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroySharedShaders()\n+{\n+  auto DestroyShader = [this](VkShaderModule& shader) {\n+    if (shader != VK_NULL_HANDLE)\n+    {\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), shader, nullptr);\n+      shader = VK_NULL_HANDLE;\n+    }\n+  };\n+\n+  DestroyShader(m_screen_quad_vertex_shader);\n+  DestroyShader(m_passthrough_vertex_shader);\n+  DestroyShader(m_screen_quad_geometry_shader);\n+  DestroyShader(m_passthrough_geometry_shader);\n+}\n+\n+void ShaderCache::CreateDummyPipeline(const UberShader::VertexShaderUid& vuid,\n+                                      const GeometryShaderUid& guid,\n+                                      const UberShader::PixelShaderUid& puid)\n+{\n+  PortableVertexDeclaration vertex_decl;\n+  std::memset(&vertex_decl, 0, sizeof(vertex_decl));\n+\n+  PipelineInfo pinfo;\n+  pinfo.vertex_format =\n+      static_cast<const VertexFormat*>(VertexLoaderManager::GetUberVertexFormat(vertex_decl));\n+  pinfo.pipeline_layout = g_object_cache->GetPipelineLayout(\n+      g_ActiveConfig.bBBoxEnable && g_ActiveConfig.BBoxUseFragmentShaderImplementation() ?\n+          PIPELINE_LAYOUT_BBOX :\n+          PIPELINE_LAYOUT_STANDARD);\n+  pinfo.vs = GetVertexUberShaderForUid(vuid);\n+  pinfo.gs = (!guid.GetUidData()->IsPassthrough() && g_vulkan_context->SupportsGeometryShaders()) ?\n+                 GetGeometryShaderForUid(guid) :\n+                 VK_NULL_HANDLE;\n+  pinfo.ps = GetPixelUberShaderForUid(puid);\n+  pinfo.render_pass = FramebufferManager::GetInstance()->GetEFBLoadRenderPass();\n+  pinfo.rasterization_state.bits = Util::GetNoCullRasterizationState().bits;\n+  pinfo.depth_stencil_state.bits = Util::GetNoDepthTestingDepthStencilState().bits;\n+  pinfo.blend_state.hex = Util::GetNoBlendingBlendState().hex;\n+  pinfo.primitive_topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;\n+  GetPipelineWithCacheResultAsync(pinfo);\n+}\n+\n+void ShaderCache::PrecompileUberShaders()\n+{\n+  UberShader::EnumerateVertexShaderUids([&](const UberShader::VertexShaderUid& vuid) {', 'created_at': '2017-07-27T04:51:24Z', 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129753343', 'position': 1210, 'pull_request_review_id': 52557179, 'updated_at': '2017-07-27T04:51:24Z', 'id': 129753343, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 1210, 'body': 'D3D is generating vertex shaders alone, Vulkan/GL generate pipelines/programs. The pipelines need to have matching texgen counts across stages.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129753343', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129753343'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129753343'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'path': 'Source/Core/VideoBackends/Vulkan/ShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'stenzek', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:36:49.845850	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52555876', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -219,6 +225,42 @@ bool CompileShaderToSPV(SPIRVCodeVector* out_code, EShLanguage stage, const char\n   return true;\n }\n \n+void CopyGLSLToSPVVector(SPIRVCodeVector* out_code, const char* stage_filename,\n+                         const char* source_code, size_t source_code_length, const char* header,\n+                         size_t header_length)\n+{\n+  std::string full_source_code;\n+  if (header_length > 0)\n+  {\n+    full_source_code.reserve(header_length + source_code_length);\n+    full_source_code.append(header, header_length);\n+    full_source_code.append(source_code, source_code_length);\n+  }\n+  else\n+  {\n+    full_source_code.append(source_code, source_code_length);\n+  }\n+\n+  if (g_ActiveConfig.iLog & CONF_SAVESHADERS)', 'created_at': '2017-07-27T04:36:48Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129752059', 'position': 40, 'pull_request_review_id': 52555876, 'updated_at': '2017-07-27T04:36:48Z', 'id': 129752059, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 40, 'body': "Probably doesn't matter but the OGL version is wrapped in some ifdefs", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129752059', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129752059'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129752059'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'path': 'Source/Core/VideoBackends/Vulkan/ShaderCompiler.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:30:31.756332	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52555417', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -0,0 +1,1377 @@\n+// Copyright 2016 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoBackends/Vulkan/ShaderCache.h"\n+\n+#include <algorithm>\n+#include <sstream>\n+#include <type_traits>\n+#include <xxhash.h>\n+\n+#include "Common/Assert.h"\n+#include "Common/CommonFuncs.h"\n+#include "Common/LinearDiskCache.h"\n+#include "Common/MsgHandler.h"\n+\n+#include "Core/ConfigManager.h"\n+#include "Core/Host.h"\n+\n+#include "VideoBackends/Vulkan/FramebufferManager.h"\n+#include "VideoBackends/Vulkan/ShaderCompiler.h"\n+#include "VideoBackends/Vulkan/StreamBuffer.h"\n+#include "VideoBackends/Vulkan/Util.h"\n+#include "VideoBackends/Vulkan/VertexFormat.h"\n+#include "VideoBackends/Vulkan/VulkanContext.h"\n+#include "VideoCommon/AsyncShaderCompiler.h"\n+#include "VideoCommon/GeometryShaderGen.h"\n+#include "VideoCommon/Statistics.h"\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/VertexLoaderManager.h"\n+\n+namespace Vulkan\n+{\n+std::unique_ptr<ShaderCache> g_shader_cache;\n+\n+ShaderCache::ShaderCache()\n+{\n+}\n+\n+ShaderCache::~ShaderCache()\n+{\n+  DestroyPipelineCache();\n+  DestroyShaderCaches();\n+  DestroySharedShaders();\n+}\n+\n+bool ShaderCache::Initialize()\n+{\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    if (!LoadPipelineCache())\n+      return false;\n+  }\n+  else\n+  {\n+    if (!CreatePipelineCache())\n+      return false;\n+  }\n+\n+  if (!CompileSharedShaders())\n+    return false;\n+\n+  m_async_shader_compiler = std::make_unique<VideoCommon::AsyncShaderCompiler>();\n+  m_async_shader_compiler->ResizeWorkerThreads(g_ActiveConfig.CanPrecompileUberShaders() ?\n+                                                   g_ActiveConfig.GetShaderPrecompilerThreads() :\n+                                                   g_ActiveConfig.GetShaderCompilerThreads());\n+  return true;\n+}\n+\n+void ShaderCache::Shutdown()\n+{\n+  if (m_async_shader_compiler)\n+  {\n+    m_async_shader_compiler->StopWorkerThreads();\n+    m_async_shader_compiler->RetrieveWorkItems();\n+  }\n+}\n+\n+static bool IsStripPrimitiveTopology(VkPrimitiveTopology topology)\n+{\n+  return topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;\n+}\n+\n+static VkPipelineRasterizationStateCreateInfo\n+GetVulkanRasterizationState(const RasterizationState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                               pNext\n+      0,                        // VkPipelineRasterizationStateCreateFlags   flags\n+      state.depth_clamp,        // VkBool32                                  depthClampEnable\n+      VK_FALSE,                 // VkBool32                                  rasterizerDiscardEnable\n+      VK_POLYGON_MODE_FILL,     // VkPolygonMode                             polygonMode\n+      state.cull_mode,          // VkCullModeFlags                           cullMode\n+      VK_FRONT_FACE_CLOCKWISE,  // VkFrontFace                               frontFace\n+      VK_FALSE,                 // VkBool32                                  depthBiasEnable\n+      0.0f,                     // float                                     depthBiasConstantFactor\n+      0.0f,                     // float                                     depthBiasClamp\n+      0.0f,                     // float                                     depthBiasSlopeFactor\n+      1.0f                      // float                                     lineWidth\n+  };\n+}\n+\n+static VkPipelineMultisampleStateCreateInfo\n+GetVulkanMultisampleState(const RasterizationState& rs_state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                      // const void*                              pNext\n+      0,                            // VkPipelineMultisampleStateCreateFlags    flags\n+      rs_state.samples,             // VkSampleCountFlagBits                    rasterizationSamples\n+      rs_state.per_sample_shading,  // VkBool32                                 sampleShadingEnable\n+      1.0f,                         // float                                    minSampleShading\n+      nullptr,                      // const VkSampleMask*                      pSampleMask;\n+      VK_FALSE,  // VkBool32                                 alphaToCoverageEnable\n+      VK_FALSE   // VkBool32                                 alphaToOneEnable\n+  };\n+}\n+\n+static VkPipelineDepthStencilStateCreateInfo\n+GetVulkanDepthStencilState(const DepthStencilState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,             // const void*                               pNext\n+      0,                   // VkPipelineDepthStencilStateCreateFlags    flags\n+      state.test_enable,   // VkBool32                                  depthTestEnable\n+      state.write_enable,  // VkBool32                                  depthWriteEnable\n+      state.compare_op,    // VkCompareOp                               depthCompareOp\n+      VK_FALSE,            // VkBool32                                  depthBoundsTestEnable\n+      VK_FALSE,            // VkBool32                                  stencilTestEnable\n+      {},                  // VkStencilOpState                          front\n+      {},                  // VkStencilOpState                          back\n+      0.0f,                // float                                     minDepthBounds\n+      1.0f                 // float                                     maxDepthBounds\n+  };\n+}\n+\n+static VkPipelineColorBlendAttachmentState GetVulkanAttachmentBlendState(const BlendingState& state)\n+{\n+  VkPipelineColorBlendAttachmentState vk_state = {};\n+  vk_state.blendEnable = static_cast<VkBool32>(state.blendenable);\n+  vk_state.colorBlendOp = state.subtract ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+  vk_state.alphaBlendOp = state.subtractAlpha ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+\n+  if (state.usedualsrc && g_vulkan_context->SupportsDualSourceBlend())\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+  else\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+\n+  if (state.colorupdate)\n+  {\n+    vk_state.colorWriteMask =\n+        VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT;\n+  }\n+  else\n+  {\n+    vk_state.colorWriteMask = 0;\n+  }\n+\n+  if (state.alphaupdate)\n+    vk_state.colorWriteMask |= VK_COLOR_COMPONENT_A_BIT;\n+\n+  return vk_state;\n+}\n+\n+static VkPipelineColorBlendStateCreateInfo\n+GetVulkanColorBlendState(const BlendingState& state,\n+                         const VkPipelineColorBlendAttachmentState* attachments,\n+                         uint32_t num_attachments)\n+{\n+  static constexpr std::array<VkLogicOp, 16> vk_logic_ops = {\n+      {VK_LOGIC_OP_CLEAR, VK_LOGIC_OP_AND, VK_LOGIC_OP_AND_REVERSE, VK_LOGIC_OP_COPY,\n+       VK_LOGIC_OP_AND_INVERTED, VK_LOGIC_OP_NO_OP, VK_LOGIC_OP_XOR, VK_LOGIC_OP_OR,\n+       VK_LOGIC_OP_NOR, VK_LOGIC_OP_EQUIVALENT, VK_LOGIC_OP_INVERT, VK_LOGIC_OP_OR_REVERSE,\n+       VK_LOGIC_OP_COPY_INVERTED, VK_LOGIC_OP_OR_INVERTED, VK_LOGIC_OP_NAND, VK_LOGIC_OP_SET}};\n+\n+  VkBool32 vk_logic_op_enable = static_cast<VkBool32>(state.logicopenable);\n+  if (vk_logic_op_enable && !g_vulkan_context->SupportsLogicOps())\n+  {\n+    // At the time of writing, Adreno and Mali drivers didn\'t support logic ops.\n+    // The "emulation" through blending path has been removed, so just disable it completely.\n+    // These drivers don\'t support dual-source blend either, so issues are to be expected.\n+    vk_logic_op_enable = VK_FALSE;\n+  }\n+\n+  VkLogicOp vk_logic_op = vk_logic_op_enable ? vk_logic_ops[state.logicmode] : VK_LOGIC_OP_CLEAR;\n+\n+  VkPipelineColorBlendStateCreateInfo vk_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                   pNext\n+      0,                        // VkPipelineColorBlendStateCreateFlags          flags\n+      vk_logic_op_enable,       // VkBool32                                      logicOpEnable\n+      vk_logic_op,              // VkLogicOp                                     logicOp\n+      num_attachments,          // uint32_t                                      attachmentCount\n+      attachments,              // const VkPipelineColorBlendAttachmentState*    pAttachments\n+      {1.0f, 1.0f, 1.0f, 1.0f}  // float                                         blendConstants[4]\n+  };\n+\n+  return vk_state;\n+}\n+\n+VkPipeline ShaderCache::CreatePipeline(const PipelineInfo& info)\n+{\n+  // Declare descriptors for empty vertex buffers/attributes\n+  static const VkPipelineVertexInputStateCreateInfo empty_vertex_input_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,  // const void*                                pNext\n+      0,        // VkPipelineVertexInputStateCreateFlags       flags\n+      0,        // uint32_t                                    vertexBindingDescriptionCount\n+      nullptr,  // const VkVertexInputBindingDescription*      pVertexBindingDescriptions\n+      0,        // uint32_t                                    vertexAttributeDescriptionCount\n+      nullptr   // const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions\n+  };\n+\n+  // Vertex inputs\n+  const VkPipelineVertexInputStateCreateInfo& vertex_input_state =\n+      info.vertex_format ? info.vertex_format->GetVertexInputStateInfo() : empty_vertex_input_state;\n+\n+  // Input assembly\n+  VkPipelineInputAssemblyStateCreateInfo input_assembly_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                pNext\n+      0,                        // VkPipelineInputAssemblyStateCreateFlags    flags\n+      info.primitive_topology,  // VkPrimitiveTopology                        topology\n+      VK_FALSE                  // VkBool32                                   primitiveRestartEnable\n+  };\n+\n+  // See Vulkan spec, section 19:\n+  // If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,\n+  // primitiveRestartEnable must be VK_FALSE\n+  if (g_ActiveConfig.backend_info.bSupportsPrimitiveRestart &&\n+      IsStripPrimitiveTopology(info.primitive_topology))\n+  {\n+    input_assembly_state.primitiveRestartEnable = VK_TRUE;\n+  }\n+\n+  // Shaders to stages\n+  VkPipelineShaderStageCreateInfo shader_stages[3];\n+  uint32_t num_shader_stages = 0;\n+  if (info.vs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_VERTEX_BIT,\n+                                          info.vs,\n+                                          "main"};\n+  }\n+  if (info.gs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_GEOMETRY_BIT,\n+                                          info.gs,\n+                                          "main"};\n+  }\n+  if (info.ps != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_FRAGMENT_BIT,\n+                                          info.ps,\n+                                          "main"};\n+  }\n+\n+  // Fill in Vulkan descriptor structs from our state structures.\n+  VkPipelineRasterizationStateCreateInfo rasterization_state =\n+      GetVulkanRasterizationState(info.rasterization_state);\n+  VkPipelineMultisampleStateCreateInfo multisample_state =\n+      GetVulkanMultisampleState(info.rasterization_state);\n+  VkPipelineDepthStencilStateCreateInfo depth_stencil_state =\n+      GetVulkanDepthStencilState(info.depth_stencil_state);\n+  VkPipelineColorBlendAttachmentState blend_attachment_state =\n+      GetVulkanAttachmentBlendState(info.blend_state);\n+  VkPipelineColorBlendStateCreateInfo blend_state =\n+      GetVulkanColorBlendState(info.blend_state, &blend_attachment_state, 1);\n+\n+  // This viewport isn\'t used, but needs to be specified anyway.\n+  static const VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};\n+  static const VkRect2D scissor = {{0, 0}, {1, 1}};\n+  static const VkPipelineViewportStateCreateInfo viewport_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,\n+      nullptr,\n+      0,          // VkPipelineViewportStateCreateFlags    flags;\n+      1,          // uint32_t                              viewportCount\n+      &viewport,  // const VkViewport*                     pViewports\n+      1,          // uint32_t                              scissorCount\n+      &scissor    // const VkRect2D*                       pScissors\n+  };\n+\n+  // Set viewport and scissor dynamic state so we can change it elsewhere.\n+  static const VkDynamicState dynamic_states[] = {VK_DYNAMIC_STATE_VIEWPORT,\n+                                                  VK_DYNAMIC_STATE_SCISSOR};\n+  static const VkPipelineDynamicStateCreateInfo dynamic_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, nullptr,\n+      0,                                            // VkPipelineDynamicStateCreateFlags    flags\n+      static_cast<u32>(ArraySize(dynamic_states)),  // uint32_t dynamicStateCount\n+      dynamic_states  // const VkDynamicState*                pDynamicStates\n+  };\n+\n+  // Combine to full pipeline info structure.\n+  VkGraphicsPipelineCreateInfo pipeline_info = {\n+      VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,\n+      nullptr,                // VkStructureType sType\n+      0,                      // VkPipelineCreateFlags                            flags\n+      num_shader_stages,      // uint32_t                                         stageCount\n+      shader_stages,          // const VkPipelineShaderStageCreateInfo*           pStages\n+      &vertex_input_state,    // const VkPipelineVertexInputStateCreateInfo*      pVertexInputState\n+      &input_assembly_state,  // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState\n+      nullptr,                // const VkPipelineTessellationStateCreateInfo*     pTessellationState\n+      &viewport_state,        // const VkPipelineViewportStateCreateInfo*         pViewportState\n+      &rasterization_state,  // const VkPipelineRasterizationStateCreateInfo*    pRasterizationState\n+      &multisample_state,    // const VkPipelineMultisampleStateCreateInfo*      pMultisampleState\n+      &depth_stencil_state,  // const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState\n+      &blend_state,          // const VkPipelineColorBlendStateCreateInfo*       pColorBlendState\n+      &dynamic_state,        // const VkPipelineDynamicStateCreateInfo*          pDynamicState\n+      info.pipeline_layout,  // VkPipelineLayout                                 layout\n+      info.render_pass,      // VkRenderPass                                     renderPass\n+      0,                     // uint32_t                                         subpass\n+      VK_NULL_HANDLE,        // VkPipeline                                       basePipelineHandle\n+      -1                     // int32_t                                          basePipelineIndex\n+  };\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateGraphicsPipelines(g_vulkan_context->GetDevice(), m_pipeline_cache, 1,\n+                                           &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateGraphicsPipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetPipeline(const PipelineInfo& info)\n+{\n+  return GetPipelineWithCacheResult(info).first;\n+}\n+\n+std::pair<VkPipeline, bool> ShaderCache::GetPipelineWithCacheResult(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+  {\n+    // If it\'s background compiling, ignore it, and recompile it synchronously.\n+    if (!iter->second.second)\n+      return std::make_pair(iter->second.first, true);\n+    else\n+      m_pipeline_objects.erase(iter);\n+  }\n+\n+  VkPipeline pipeline = CreatePipeline(info);\n+  m_pipeline_objects.emplace(info, std::make_pair(pipeline, false));\n+  _assert_(pipeline != VK_NULL_HANDLE);\n+  return {pipeline, false};\n+}\n+\n+std::pair<std::pair<VkPipeline, bool>, bool>\n+ShaderCache::GetPipelineWithCacheResultAsync(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+    return std::make_pair(iter->second, true);\n+\n+  // Kick a job off.\n+  m_async_shader_compiler->QueueWorkItem(\n+      m_async_shader_compiler->CreateWorkItem<PipelineCompilerWorkItem>(info));\n+  m_pipeline_objects.emplace(info, std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true));\n+  return std::make_pair(std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true), false);\n+}\n+\n+VkPipeline ShaderCache::CreateComputePipeline(const ComputePipelineInfo& info)\n+{\n+  VkComputePipelineCreateInfo pipeline_info = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,\n+                                               nullptr,\n+                                               0,\n+                                               {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                                nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT, info.cs,\n+                                                "main", nullptr},\n+                                               info.pipeline_layout,\n+                                               VK_NULL_HANDLE,\n+                                               -1};\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateComputePipelines(g_vulkan_context->GetDevice(), VK_NULL_HANDLE, 1,\n+                                          &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateComputePipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetComputePipeline(const ComputePipelineInfo& info)\n+{\n+  auto iter = m_compute_pipeline_objects.find(info);\n+  if (iter != m_compute_pipeline_objects.end())\n+    return iter->second;\n+\n+  VkPipeline pipeline = CreateComputePipeline(info);\n+  m_compute_pipeline_objects.emplace(info, pipeline);\n+  return pipeline;\n+}\n+\n+void ShaderCache::ClearPipelineCache()\n+{\n+  // TODO: Stop any async compiling happening.\n+  for (const auto& it : m_pipeline_objects)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  m_pipeline_objects.clear();\n+\n+  for (const auto& it : m_compute_pipeline_objects)\n+  {\n+    if (it.second != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second, nullptr);\n+  }\n+  m_compute_pipeline_objects.clear();\n+}\n+\n+class PipelineCacheReadCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  PipelineCacheReadCallback(std::vector<u8>* data) : m_data(data) {}\n+  void Read(const u32& key, const u8* value, u32 value_size) override\n+  {\n+    m_data->resize(value_size);\n+    if (value_size > 0)\n+      memcpy(m_data->data(), value, value_size);\n+  }\n+\n+private:\n+  std::vector<u8>* m_data;\n+};\n+\n+class PipelineCacheReadIgnoreCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  void Read(const u32& key, const u8* value, u32 value_size) override {}\n+};\n+\n+bool ShaderCache::CreatePipelineCache()\n+{\n+  // Vulkan pipeline caches can be shared between games for shader compile time reduction.\n+  // This assumes that drivers don\'t create all pipelines in the cache on load time, only\n+  // when a lookup occurs that matches a pipeline (or pipeline data) in the cache.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      0,                                             // size_t                     initialDataSize\n+      nullptr                                        // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed: ");\n+  return false;\n+}\n+\n+bool ShaderCache::LoadPipelineCache()\n+{\n+  // We have to keep the pipeline cache file name around since when we save it\n+  // we delete the old one, by which time the game\'s unique ID is already cleared.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  std::vector<u8> disk_data;\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadCallback read_callback(&disk_data);\n+  if (disk_cache.OpenAndRead(m_pipeline_cache_filename, read_callback) != 1)\n+    disk_data.clear();\n+\n+  if (!disk_data.empty() && !ValidatePipelineCache(disk_data.data(), disk_data.size()))\n+  {\n+    // Don\'t use this data. In fact, we should delete it to prevent it from being used next time.\n+    File::Delete(m_pipeline_cache_filename);\n+    return CreatePipelineCache();\n+  }\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      disk_data.size(),                              // size_t                     initialDataSize\n+      disk_data.data()                               // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  // Failed to create pipeline cache, try with it empty.\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed, trying empty cache: ");\n+  return CreatePipelineCache();\n+}\n+\n+// Based on Vulkan 1.0 specification,\n+// Table 9.1. Layout for pipeline cache header version VK_PIPELINE_CACHE_HEADER_VERSION_ONE\n+// NOTE: This data is assumed to be in little-endian format.\n+#pragma pack(push, 4)\n+struct VK_PIPELINE_CACHE_HEADER\n+{\n+  u32 header_length;\n+  u32 header_version;\n+  u32 vendor_id;\n+  u32 device_id;\n+  u8 uuid[VK_UUID_SIZE];\n+};\n+#pragma pack(pop)\n+// TODO: Remove the #if here when GCC 5 is a minimum build requirement.\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5\n+static_assert(std::has_trivial_copy_constructor<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#else\n+static_assert(std::is_trivially_copyable<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#endif\n+\n+bool ShaderCache::ValidatePipelineCache(const u8* data, size_t data_length)\n+{\n+  if (data_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header");\n+    return false;\n+  }\n+\n+  VK_PIPELINE_CACHE_HEADER header;\n+  std::memcpy(&header, data, sizeof(header));\n+  if (header.header_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header length");\n+    return false;\n+  }\n+\n+  if (header.header_version != VK_PIPELINE_CACHE_HEADER_VERSION_ONE)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header version");\n+    return false;\n+  }\n+\n+  if (header.vendor_id != g_vulkan_context->GetDeviceProperties().vendorID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect vendor ID (file: 0x%X, device: 0x%X)",\n+              header.vendor_id, g_vulkan_context->GetDeviceProperties().vendorID);\n+    return false;\n+  }\n+\n+  if (header.device_id != g_vulkan_context->GetDeviceProperties().deviceID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect device ID (file: 0x%X, device: 0x%X)",\n+              header.device_id, g_vulkan_context->GetDeviceProperties().deviceID);\n+    return false;\n+  }\n+\n+  if (std::memcmp(header.uuid, g_vulkan_context->GetDeviceProperties().pipelineCacheUUID,\n+                  VK_UUID_SIZE) != 0)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Incorrect UUID");\n+    return false;\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroyPipelineCache()\n+{\n+  ClearPipelineCache();\n+  vkDestroyPipelineCache(g_vulkan_context->GetDevice(), m_pipeline_cache, nullptr);\n+  m_pipeline_cache = VK_NULL_HANDLE;\n+}\n+\n+void ShaderCache::SavePipelineCache()\n+{\n+  size_t data_size;\n+  VkResult res =\n+      vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size, nullptr);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  std::vector<u8> data(data_size);\n+  res = vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size,\n+                               data.data());\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  // Delete the old cache and re-create.\n+  File::Delete(m_pipeline_cache_filename);\n+\n+  // We write a single key of 1, with the entire pipeline cache data.\n+  // Not ideal, but our disk cache class does not support just writing a single blob\n+  // of data without specifying a key.\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadIgnoreCallback callback;\n+  disk_cache.OpenAndRead(m_pipeline_cache_filename, callback);\n+  disk_cache.Append(1, data.data(), static_cast<u32>(data.size()));\n+  disk_cache.Close();\n+}\n+\n+// Cache inserter that is called back when reading from the file\n+template <typename Uid>\n+struct ShaderCacheReader : public LinearDiskCacheReader<Uid, u32>\n+{\n+  ShaderCacheReader(std::map<Uid, std::pair<VkShaderModule, bool>>& shader_map)\n+      : m_shader_map(shader_map)\n+  {\n+  }\n+  void Read(const Uid& key, const u32* value, u32 value_size) override\n+  {\n+    // We don\'t insert null modules into the shader map since creation could succeed later on.\n+    // e.g. we\'re generating bad code, but fix this in a later version, and for some reason\n+    // the cache is not invalidated.\n+    VkShaderModule module = Util::CreateShaderModule(value, value_size);\n+    if (module == VK_NULL_HANDLE)\n+      return;\n+\n+    m_shader_map.emplace(key, std::make_pair(module, false));\n+  }\n+\n+  std::map<Uid, std::pair<VkShaderModule, bool>>& m_shader_map;\n+};\n+\n+void ShaderCache::LoadShaderCaches()\n+{\n+  ShaderCacheReader<VertexShaderUid> vs_reader(m_vs_cache.shader_map);\n+  m_vs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "VS", true, true),\n+                                    vs_reader);\n+\n+  ShaderCacheReader<PixelShaderUid> ps_reader(m_ps_cache.shader_map);\n+  m_ps_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "PS", true, true),\n+                                    ps_reader);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    ShaderCacheReader<GeometryShaderUid> gs_reader(m_gs_cache.shader_map);\n+    m_gs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "GS", true, true),\n+                                      gs_reader);\n+  }\n+\n+  ShaderCacheReader<UberShader::VertexShaderUid> uber_vs_reader(m_uber_vs_cache.shader_map);\n+  m_uber_vs_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberVS", false, true), uber_vs_reader);\n+  ShaderCacheReader<UberShader::PixelShaderUid> uber_ps_reader(m_uber_ps_cache.shader_map);\n+  m_uber_ps_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberPS", false, true), uber_ps_reader);\n+\n+  SETSTAT(stats.numPixelShadersCreated, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numPixelShadersAlive, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersCreated, static_cast<int>(m_vs_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersAlive, static_cast<int>(m_vs_cache.shader_map.size()));\n+}\n+\n+template <typename T>\n+static void DestroyShaderCache(T& cache)\n+{\n+  cache.disk_cache.Sync();\n+  cache.disk_cache.Close();\n+  for (const auto& it : cache.shader_map)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  cache.shader_map.clear();\n+}\n+\n+void ShaderCache::DestroyShaderCaches()\n+{\n+  DestroyShaderCache(m_vs_cache);\n+  DestroyShaderCache(m_ps_cache);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+    DestroyShaderCache(m_gs_cache);\n+\n+  DestroyShaderCache(m_uber_vs_cache);\n+  DestroyShaderCache(m_uber_ps_cache);\n+\n+  SETSTAT(stats.numPixelShadersCreated, 0);\n+  SETSTAT(stats.numPixelShadersAlive, 0);\n+  SETSTAT(stats.numVertexShadersCreated, 0);\n+  SETSTAT(stats.numVertexShadersAlive, 0);\n+}\n+\n+VkShaderModule ShaderCache::GetVertexShaderForUid(const VertexShaderUid& uid)\n+{\n+  auto it = m_vs_cache.shader_map.find(uid);\n+  if (it != m_vs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_vs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GenerateVertexShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileVertexShader(&spv, source_code.GetBuffer().c_str(),\n+                                          source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_vs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numVertexShadersCreated);\n+      INCSTAT(stats.numVertexShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_vs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetGeometryShaderForUid(const GeometryShaderUid& uid)\n+{\n+  _assert_(g_vulkan_context->SupportsGeometryShaders());\n+  auto it = m_gs_cache.shader_map.find(uid);\n+  if (it != m_gs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_gs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GenerateGeometryShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileGeometryShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+      m_gs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_gs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetPixelShaderForUid(const PixelShaderUid& uid)\n+{\n+  auto it = m_ps_cache.shader_map.find(uid);\n+  if (it != m_ps_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_ps_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GeneratePixelShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_ps_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numPixelShadersCreated);\n+      INCSTAT(stats.numPixelShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_ps_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetVertexUberShaderForUid(const UberShader::VertexShaderUid& uid)\n+{\n+  auto it = m_uber_vs_cache.shader_map.find(uid);\n+  if (it != m_uber_vs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_uber_vs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code = UberShader::GenVertexShader(\n+      APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileVertexShader(&spv, source_code.GetBuffer().c_str(),\n+                                          source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_uber_vs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numVertexShadersCreated);\n+      INCSTAT(stats.numVertexShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_uber_vs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetPixelUberShaderForUid(const UberShader::PixelShaderUid& uid)\n+{\n+  auto it = m_uber_ps_cache.shader_map.find(uid);\n+  if (it != m_uber_ps_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_uber_ps_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      UberShader::GenPixelShader(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_uber_ps_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numPixelShadersCreated);\n+      INCSTAT(stats.numPixelShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_uber_ps_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+void ShaderCache::RecompileSharedShaders()\n+{\n+  DestroySharedShaders();\n+  if (!CompileSharedShaders())\n+    PanicAlert("Failed to recompile shared shaders.");\n+}\n+\n+void ShaderCache::ReloadShaderAndPipelineCaches()\n+{\n+  m_async_shader_compiler->WaitUntilCompletion();\n+  m_async_shader_compiler->RetrieveWorkItems();\n+\n+  SavePipelineCache();\n+  DestroyShaderCaches();\n+  DestroyPipelineCache();\n+\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    LoadPipelineCache();\n+  }\n+  else\n+  {\n+    CreatePipelineCache();\n+  }\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n+}\n+\n+std::string ShaderCache::GetUtilityShaderHeader() const\n+{\n+  std::stringstream ss;\n+  if (g_ActiveConfig.iMultisamples > 1)\n+  {\n+    ss << "#define MSAA_ENABLED 1" << std::endl;\n+    ss << "#define MSAA_SAMPLES " << g_ActiveConfig.iMultisamples << std::endl;\n+    if (g_ActiveConfig.bSSAA)\n+      ss << "#define SSAA_ENABLED 1" << std::endl;\n+  }\n+\n+  u32 efb_layers = (g_ActiveConfig.iStereoMode != STEREO_OFF) ? 2 : 1;\n+  ss << "#define EFB_LAYERS " << efb_layers << std::endl;\n+\n+  return ss.str();\n+}\n+\n+// Comparison operators for PipelineInfos\n+// Since these all boil down to POD types, we can just memcmp the entire thing for speed\n+// The is_trivially_copyable check fails on MSVC due to BitField.\n+// TODO: Can we work around this any way?\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5 && !defined(_MSC_VER)\n+static_assert(std::has_trivial_copy_constructor<PipelineInfo>::value,\n+              "PipelineInfo is trivially copyable");\n+#elif !defined(_MSC_VER)\n+static_assert(std::is_trivially_copyable<PipelineInfo>::value,\n+              "PipelineInfo is trivially copyable");\n+#endif\n+\n+std::size_t PipelineInfoHash::operator()(const PipelineInfo& key) const\n+{\n+  return static_cast<std::size_t>(XXH64(&key, sizeof(key), 0));\n+}\n+\n+bool operator==(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;\n+}\n+\n+bool operator!=(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator<(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) < 0;\n+}\n+\n+bool operator>(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) > 0;\n+}\n+\n+bool operator==(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits == rhs.bits;\n+}\n+\n+bool operator!=(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator>(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits > rhs.bits;\n+}\n+\n+bool operator<(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits < rhs.bits;\n+}\n+\n+std::size_t ComputePipelineInfoHash::operator()(const ComputePipelineInfo& key) const\n+{\n+  return static_cast<std::size_t>(XXH64(&key, sizeof(key), 0));\n+}\n+\n+bool operator==(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;\n+}\n+\n+bool operator!=(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator<(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) < 0;\n+}\n+\n+bool operator>(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) > 0;\n+}\n+\n+bool ShaderCache::CompileSharedShaders()\n+{\n+  static const char PASSTHROUGH_VERTEX_SHADER_SOURCE[] = R"(\n+    layout(location = 0) in vec4 ipos;\n+    layout(location = 5) in vec4 icol0;\n+    layout(location = 8) in vec3 itex0;\n+\n+    layout(location = 0) out vec3 uv0;\n+    layout(location = 1) out vec4 col0;\n+\n+    void main()\n+    {\n+      gl_Position = ipos;\n+      uv0 = itex0;\n+      col0 = icol0;\n+    }\n+  )";\n+\n+  static const char PASSTHROUGH_GEOMETRY_SHADER_SOURCE[] = R"(\n+    layout(triangles) in;\n+    layout(triangle_strip, max_vertices = EFB_LAYERS * 3) out;\n+\n+    layout(location = 0) in vec3 in_uv0[];\n+    layout(location = 1) in vec4 in_col0[];\n+\n+    layout(location = 0) out vec3 out_uv0;\n+    layout(location = 1) out vec4 out_col0;\n+\n+    void main()\n+    {\n+      for (int j = 0; j < EFB_LAYERS; j++)\n+      {\n+        for (int i = 0; i < 3; i++)\n+        {\n+          gl_Layer = j;\n+          gl_Position = gl_in[i].gl_Position;\n+          out_uv0 = vec3(in_uv0[i].xy, float(j));\n+          out_col0 = in_col0[i];\n+          EmitVertex();\n+        }\n+        EndPrimitive();\n+      }\n+    }\n+  )";\n+\n+  static const char SCREEN_QUAD_VERTEX_SHADER_SOURCE[] = R"(\n+    layout(location = 0) out vec3 uv0;\n+\n+    void main()\n+    {\n+        /*\n+         * id   &1    &2   clamp(*2-1)\n+         * 0    0,0   0,0  -1,-1      TL\n+         * 1    1,0   1,0  1,-1       TR\n+         * 2    0,2   0,1  -1,1       BL\n+         * 3    1,2   1,1  1,1        BR\n+         */\n+        vec2 rawpos = vec2(float(gl_VertexID & 1), clamp(float(gl_VertexID & 2), 0.0f, 1.0f));\n+        gl_Position = vec4(rawpos * 2.0f - 1.0f, 0.0f, 1.0f);\n+        uv0 = vec3(rawpos, 0.0f);\n+    }\n+  )";\n+\n+  static const char SCREEN_QUAD_GEOMETRY_SHADER_SOURCE[] = R"(\n+    layout(triangles) in;\n+    layout(triangle_strip, max_vertices = EFB_LAYERS * 3) out;\n+\n+    layout(location = 0) in vec3 in_uv0[];\n+\n+    layout(location = 0) out vec3 out_uv0;\n+\n+    void main()\n+    {\n+      for (int j = 0; j < EFB_LAYERS; j++)\n+      {\n+        for (int i = 0; i < 3; i++)\n+        {\n+          gl_Layer = j;\n+          gl_Position = gl_in[i].gl_Position;\n+          out_uv0 = vec3(in_uv0[i].xy, float(j));\n+          EmitVertex();\n+        }\n+        EndPrimitive();\n+      }\n+    }\n+  )";\n+\n+  std::string header = GetUtilityShaderHeader();\n+\n+  m_screen_quad_vertex_shader =\n+      Util::CompileAndCreateVertexShader(header + SCREEN_QUAD_VERTEX_SHADER_SOURCE);\n+  m_passthrough_vertex_shader =\n+      Util::CompileAndCreateVertexShader(header + PASSTHROUGH_VERTEX_SHADER_SOURCE);\n+  if (m_screen_quad_vertex_shader == VK_NULL_HANDLE ||\n+      m_passthrough_vertex_shader == VK_NULL_HANDLE)\n+  {\n+    return false;\n+  }\n+\n+  if (g_ActiveConfig.iStereoMode != STEREO_OFF && g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    m_screen_quad_geometry_shader =\n+        Util::CompileAndCreateGeometryShader(header + SCREEN_QUAD_GEOMETRY_SHADER_SOURCE);\n+    m_passthrough_geometry_shader =\n+        Util::CompileAndCreateGeometryShader(header + PASSTHROUGH_GEOMETRY_SHADER_SOURCE);\n+    if (m_screen_quad_geometry_shader == VK_NULL_HANDLE ||\n+        m_passthrough_geometry_shader == VK_NULL_HANDLE)\n+    {\n+      return false;\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroySharedShaders()\n+{\n+  auto DestroyShader = [this](VkShaderModule& shader) {\n+    if (shader != VK_NULL_HANDLE)\n+    {\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), shader, nullptr);\n+      shader = VK_NULL_HANDLE;\n+    }\n+  };\n+\n+  DestroyShader(m_screen_quad_vertex_shader);\n+  DestroyShader(m_passthrough_vertex_shader);\n+  DestroyShader(m_screen_quad_geometry_shader);\n+  DestroyShader(m_passthrough_geometry_shader);\n+}\n+\n+void ShaderCache::CreateDummyPipeline(const UberShader::VertexShaderUid& vuid,\n+                                      const GeometryShaderUid& guid,\n+                                      const UberShader::PixelShaderUid& puid)\n+{\n+  PortableVertexDeclaration vertex_decl;\n+  std::memset(&vertex_decl, 0, sizeof(vertex_decl));\n+\n+  PipelineInfo pinfo;\n+  pinfo.vertex_format =\n+      static_cast<const VertexFormat*>(VertexLoaderManager::GetUberVertexFormat(vertex_decl));\n+  pinfo.pipeline_layout = g_object_cache->GetPipelineLayout(\n+      g_ActiveConfig.bBBoxEnable && g_ActiveConfig.BBoxUseFragmentShaderImplementation() ?\n+          PIPELINE_LAYOUT_BBOX :\n+          PIPELINE_LAYOUT_STANDARD);\n+  pinfo.vs = GetVertexUberShaderForUid(vuid);\n+  pinfo.gs = (!guid.GetUidData()->IsPassthrough() && g_vulkan_context->SupportsGeometryShaders()) ?\n+                 GetGeometryShaderForUid(guid) :\n+                 VK_NULL_HANDLE;\n+  pinfo.ps = GetPixelUberShaderForUid(puid);\n+  pinfo.render_pass = FramebufferManager::GetInstance()->GetEFBLoadRenderPass();\n+  pinfo.rasterization_state.bits = Util::GetNoCullRasterizationState().bits;\n+  pinfo.depth_stencil_state.bits = Util::GetNoDepthTestingDepthStencilState().bits;\n+  pinfo.blend_state.hex = Util::GetNoBlendingBlendState().hex;\n+  pinfo.primitive_topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;\n+  GetPipelineWithCacheResultAsync(pinfo);\n+}\n+\n+void ShaderCache::PrecompileUberShaders()\n+{\n+  UberShader::EnumerateVertexShaderUids([&](const UberShader::VertexShaderUid& vuid) {', 'created_at': '2017-07-27T04:30:30Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751631', 'position': 1210, 'pull_request_review_id': 52555417, 'updated_at': '2017-07-27T04:30:30Z', 'id': 129751631, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 1210, 'body': "Both this and OGL use this approach where it compares numTexGen and early returns if they are different.  D3D however uses a find with the uid and returns if it isn't found.  Is there a reason D3D isn't the same?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751631', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751631'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751631'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'path': 'Source/Core/VideoBackends/Vulkan/ShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:27:35.370106	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52555182', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -0,0 +1,1377 @@\n+// Copyright 2016 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoBackends/Vulkan/ShaderCache.h"\n+\n+#include <algorithm>\n+#include <sstream>\n+#include <type_traits>\n+#include <xxhash.h>\n+\n+#include "Common/Assert.h"\n+#include "Common/CommonFuncs.h"\n+#include "Common/LinearDiskCache.h"\n+#include "Common/MsgHandler.h"\n+\n+#include "Core/ConfigManager.h"\n+#include "Core/Host.h"\n+\n+#include "VideoBackends/Vulkan/FramebufferManager.h"\n+#include "VideoBackends/Vulkan/ShaderCompiler.h"\n+#include "VideoBackends/Vulkan/StreamBuffer.h"\n+#include "VideoBackends/Vulkan/Util.h"\n+#include "VideoBackends/Vulkan/VertexFormat.h"\n+#include "VideoBackends/Vulkan/VulkanContext.h"\n+#include "VideoCommon/AsyncShaderCompiler.h"\n+#include "VideoCommon/GeometryShaderGen.h"\n+#include "VideoCommon/Statistics.h"\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/VertexLoaderManager.h"\n+\n+namespace Vulkan\n+{\n+std::unique_ptr<ShaderCache> g_shader_cache;\n+\n+ShaderCache::ShaderCache()\n+{\n+}\n+\n+ShaderCache::~ShaderCache()\n+{\n+  DestroyPipelineCache();\n+  DestroyShaderCaches();\n+  DestroySharedShaders();\n+}\n+\n+bool ShaderCache::Initialize()\n+{\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    if (!LoadPipelineCache())\n+      return false;\n+  }\n+  else\n+  {\n+    if (!CreatePipelineCache())\n+      return false;\n+  }\n+\n+  if (!CompileSharedShaders())\n+    return false;\n+\n+  m_async_shader_compiler = std::make_unique<VideoCommon::AsyncShaderCompiler>();\n+  m_async_shader_compiler->ResizeWorkerThreads(g_ActiveConfig.CanPrecompileUberShaders() ?\n+                                                   g_ActiveConfig.GetShaderPrecompilerThreads() :\n+                                                   g_ActiveConfig.GetShaderCompilerThreads());\n+  return true;\n+}\n+\n+void ShaderCache::Shutdown()\n+{\n+  if (m_async_shader_compiler)\n+  {\n+    m_async_shader_compiler->StopWorkerThreads();\n+    m_async_shader_compiler->RetrieveWorkItems();\n+  }\n+}\n+\n+static bool IsStripPrimitiveTopology(VkPrimitiveTopology topology)\n+{\n+  return topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;\n+}\n+\n+static VkPipelineRasterizationStateCreateInfo\n+GetVulkanRasterizationState(const RasterizationState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                               pNext\n+      0,                        // VkPipelineRasterizationStateCreateFlags   flags\n+      state.depth_clamp,        // VkBool32                                  depthClampEnable\n+      VK_FALSE,                 // VkBool32                                  rasterizerDiscardEnable\n+      VK_POLYGON_MODE_FILL,     // VkPolygonMode                             polygonMode\n+      state.cull_mode,          // VkCullModeFlags                           cullMode\n+      VK_FRONT_FACE_CLOCKWISE,  // VkFrontFace                               frontFace\n+      VK_FALSE,                 // VkBool32                                  depthBiasEnable\n+      0.0f,                     // float                                     depthBiasConstantFactor\n+      0.0f,                     // float                                     depthBiasClamp\n+      0.0f,                     // float                                     depthBiasSlopeFactor\n+      1.0f                      // float                                     lineWidth\n+  };\n+}\n+\n+static VkPipelineMultisampleStateCreateInfo\n+GetVulkanMultisampleState(const RasterizationState& rs_state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                      // const void*                              pNext\n+      0,                            // VkPipelineMultisampleStateCreateFlags    flags\n+      rs_state.samples,             // VkSampleCountFlagBits                    rasterizationSamples\n+      rs_state.per_sample_shading,  // VkBool32                                 sampleShadingEnable\n+      1.0f,                         // float                                    minSampleShading\n+      nullptr,                      // const VkSampleMask*                      pSampleMask;\n+      VK_FALSE,  // VkBool32                                 alphaToCoverageEnable\n+      VK_FALSE   // VkBool32                                 alphaToOneEnable\n+  };\n+}\n+\n+static VkPipelineDepthStencilStateCreateInfo\n+GetVulkanDepthStencilState(const DepthStencilState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,             // const void*                               pNext\n+      0,                   // VkPipelineDepthStencilStateCreateFlags    flags\n+      state.test_enable,   // VkBool32                                  depthTestEnable\n+      state.write_enable,  // VkBool32                                  depthWriteEnable\n+      state.compare_op,    // VkCompareOp                               depthCompareOp\n+      VK_FALSE,            // VkBool32                                  depthBoundsTestEnable\n+      VK_FALSE,            // VkBool32                                  stencilTestEnable\n+      {},                  // VkStencilOpState                          front\n+      {},                  // VkStencilOpState                          back\n+      0.0f,                // float                                     minDepthBounds\n+      1.0f                 // float                                     maxDepthBounds\n+  };\n+}\n+\n+static VkPipelineColorBlendAttachmentState GetVulkanAttachmentBlendState(const BlendingState& state)\n+{\n+  VkPipelineColorBlendAttachmentState vk_state = {};\n+  vk_state.blendEnable = static_cast<VkBool32>(state.blendenable);\n+  vk_state.colorBlendOp = state.subtract ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+  vk_state.alphaBlendOp = state.subtractAlpha ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+\n+  if (state.usedualsrc && g_vulkan_context->SupportsDualSourceBlend())\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+  else\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+\n+  if (state.colorupdate)\n+  {\n+    vk_state.colorWriteMask =\n+        VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT;\n+  }\n+  else\n+  {\n+    vk_state.colorWriteMask = 0;\n+  }\n+\n+  if (state.alphaupdate)\n+    vk_state.colorWriteMask |= VK_COLOR_COMPONENT_A_BIT;\n+\n+  return vk_state;\n+}\n+\n+static VkPipelineColorBlendStateCreateInfo\n+GetVulkanColorBlendState(const BlendingState& state,\n+                         const VkPipelineColorBlendAttachmentState* attachments,\n+                         uint32_t num_attachments)\n+{\n+  static constexpr std::array<VkLogicOp, 16> vk_logic_ops = {\n+      {VK_LOGIC_OP_CLEAR, VK_LOGIC_OP_AND, VK_LOGIC_OP_AND_REVERSE, VK_LOGIC_OP_COPY,\n+       VK_LOGIC_OP_AND_INVERTED, VK_LOGIC_OP_NO_OP, VK_LOGIC_OP_XOR, VK_LOGIC_OP_OR,\n+       VK_LOGIC_OP_NOR, VK_LOGIC_OP_EQUIVALENT, VK_LOGIC_OP_INVERT, VK_LOGIC_OP_OR_REVERSE,\n+       VK_LOGIC_OP_COPY_INVERTED, VK_LOGIC_OP_OR_INVERTED, VK_LOGIC_OP_NAND, VK_LOGIC_OP_SET}};\n+\n+  VkBool32 vk_logic_op_enable = static_cast<VkBool32>(state.logicopenable);\n+  if (vk_logic_op_enable && !g_vulkan_context->SupportsLogicOps())\n+  {\n+    // At the time of writing, Adreno and Mali drivers didn\'t support logic ops.\n+    // The "emulation" through blending path has been removed, so just disable it completely.\n+    // These drivers don\'t support dual-source blend either, so issues are to be expected.\n+    vk_logic_op_enable = VK_FALSE;\n+  }\n+\n+  VkLogicOp vk_logic_op = vk_logic_op_enable ? vk_logic_ops[state.logicmode] : VK_LOGIC_OP_CLEAR;\n+\n+  VkPipelineColorBlendStateCreateInfo vk_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                   pNext\n+      0,                        // VkPipelineColorBlendStateCreateFlags          flags\n+      vk_logic_op_enable,       // VkBool32                                      logicOpEnable\n+      vk_logic_op,              // VkLogicOp                                     logicOp\n+      num_attachments,          // uint32_t                                      attachmentCount\n+      attachments,              // const VkPipelineColorBlendAttachmentState*    pAttachments\n+      {1.0f, 1.0f, 1.0f, 1.0f}  // float                                         blendConstants[4]\n+  };\n+\n+  return vk_state;\n+}\n+\n+VkPipeline ShaderCache::CreatePipeline(const PipelineInfo& info)\n+{\n+  // Declare descriptors for empty vertex buffers/attributes\n+  static const VkPipelineVertexInputStateCreateInfo empty_vertex_input_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,  // const void*                                pNext\n+      0,        // VkPipelineVertexInputStateCreateFlags       flags\n+      0,        // uint32_t                                    vertexBindingDescriptionCount\n+      nullptr,  // const VkVertexInputBindingDescription*      pVertexBindingDescriptions\n+      0,        // uint32_t                                    vertexAttributeDescriptionCount\n+      nullptr   // const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions\n+  };\n+\n+  // Vertex inputs\n+  const VkPipelineVertexInputStateCreateInfo& vertex_input_state =\n+      info.vertex_format ? info.vertex_format->GetVertexInputStateInfo() : empty_vertex_input_state;\n+\n+  // Input assembly\n+  VkPipelineInputAssemblyStateCreateInfo input_assembly_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                pNext\n+      0,                        // VkPipelineInputAssemblyStateCreateFlags    flags\n+      info.primitive_topology,  // VkPrimitiveTopology                        topology\n+      VK_FALSE                  // VkBool32                                   primitiveRestartEnable\n+  };\n+\n+  // See Vulkan spec, section 19:\n+  // If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,\n+  // primitiveRestartEnable must be VK_FALSE\n+  if (g_ActiveConfig.backend_info.bSupportsPrimitiveRestart &&\n+      IsStripPrimitiveTopology(info.primitive_topology))\n+  {\n+    input_assembly_state.primitiveRestartEnable = VK_TRUE;\n+  }\n+\n+  // Shaders to stages\n+  VkPipelineShaderStageCreateInfo shader_stages[3];\n+  uint32_t num_shader_stages = 0;\n+  if (info.vs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_VERTEX_BIT,\n+                                          info.vs,\n+                                          "main"};\n+  }\n+  if (info.gs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_GEOMETRY_BIT,\n+                                          info.gs,\n+                                          "main"};\n+  }\n+  if (info.ps != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_FRAGMENT_BIT,\n+                                          info.ps,\n+                                          "main"};\n+  }\n+\n+  // Fill in Vulkan descriptor structs from our state structures.\n+  VkPipelineRasterizationStateCreateInfo rasterization_state =\n+      GetVulkanRasterizationState(info.rasterization_state);\n+  VkPipelineMultisampleStateCreateInfo multisample_state =\n+      GetVulkanMultisampleState(info.rasterization_state);\n+  VkPipelineDepthStencilStateCreateInfo depth_stencil_state =\n+      GetVulkanDepthStencilState(info.depth_stencil_state);\n+  VkPipelineColorBlendAttachmentState blend_attachment_state =\n+      GetVulkanAttachmentBlendState(info.blend_state);\n+  VkPipelineColorBlendStateCreateInfo blend_state =\n+      GetVulkanColorBlendState(info.blend_state, &blend_attachment_state, 1);\n+\n+  // This viewport isn\'t used, but needs to be specified anyway.\n+  static const VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};\n+  static const VkRect2D scissor = {{0, 0}, {1, 1}};\n+  static const VkPipelineViewportStateCreateInfo viewport_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,\n+      nullptr,\n+      0,          // VkPipelineViewportStateCreateFlags    flags;\n+      1,          // uint32_t                              viewportCount\n+      &viewport,  // const VkViewport*                     pViewports\n+      1,          // uint32_t                              scissorCount\n+      &scissor    // const VkRect2D*                       pScissors\n+  };\n+\n+  // Set viewport and scissor dynamic state so we can change it elsewhere.\n+  static const VkDynamicState dynamic_states[] = {VK_DYNAMIC_STATE_VIEWPORT,\n+                                                  VK_DYNAMIC_STATE_SCISSOR};\n+  static const VkPipelineDynamicStateCreateInfo dynamic_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, nullptr,\n+      0,                                            // VkPipelineDynamicStateCreateFlags    flags\n+      static_cast<u32>(ArraySize(dynamic_states)),  // uint32_t dynamicStateCount\n+      dynamic_states  // const VkDynamicState*                pDynamicStates\n+  };\n+\n+  // Combine to full pipeline info structure.\n+  VkGraphicsPipelineCreateInfo pipeline_info = {\n+      VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,\n+      nullptr,                // VkStructureType sType\n+      0,                      // VkPipelineCreateFlags                            flags\n+      num_shader_stages,      // uint32_t                                         stageCount\n+      shader_stages,          // const VkPipelineShaderStageCreateInfo*           pStages\n+      &vertex_input_state,    // const VkPipelineVertexInputStateCreateInfo*      pVertexInputState\n+      &input_assembly_state,  // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState\n+      nullptr,                // const VkPipelineTessellationStateCreateInfo*     pTessellationState\n+      &viewport_state,        // const VkPipelineViewportStateCreateInfo*         pViewportState\n+      &rasterization_state,  // const VkPipelineRasterizationStateCreateInfo*    pRasterizationState\n+      &multisample_state,    // const VkPipelineMultisampleStateCreateInfo*      pMultisampleState\n+      &depth_stencil_state,  // const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState\n+      &blend_state,          // const VkPipelineColorBlendStateCreateInfo*       pColorBlendState\n+      &dynamic_state,        // const VkPipelineDynamicStateCreateInfo*          pDynamicState\n+      info.pipeline_layout,  // VkPipelineLayout                                 layout\n+      info.render_pass,      // VkRenderPass                                     renderPass\n+      0,                     // uint32_t                                         subpass\n+      VK_NULL_HANDLE,        // VkPipeline                                       basePipelineHandle\n+      -1                     // int32_t                                          basePipelineIndex\n+  };\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateGraphicsPipelines(g_vulkan_context->GetDevice(), m_pipeline_cache, 1,\n+                                           &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateGraphicsPipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetPipeline(const PipelineInfo& info)\n+{\n+  return GetPipelineWithCacheResult(info).first;\n+}\n+\n+std::pair<VkPipeline, bool> ShaderCache::GetPipelineWithCacheResult(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+  {\n+    // If it\'s background compiling, ignore it, and recompile it synchronously.\n+    if (!iter->second.second)\n+      return std::make_pair(iter->second.first, true);\n+    else\n+      m_pipeline_objects.erase(iter);\n+  }\n+\n+  VkPipeline pipeline = CreatePipeline(info);\n+  m_pipeline_objects.emplace(info, std::make_pair(pipeline, false));\n+  _assert_(pipeline != VK_NULL_HANDLE);\n+  return {pipeline, false};\n+}\n+\n+std::pair<std::pair<VkPipeline, bool>, bool>\n+ShaderCache::GetPipelineWithCacheResultAsync(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+    return std::make_pair(iter->second, true);\n+\n+  // Kick a job off.\n+  m_async_shader_compiler->QueueWorkItem(\n+      m_async_shader_compiler->CreateWorkItem<PipelineCompilerWorkItem>(info));\n+  m_pipeline_objects.emplace(info, std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true));\n+  return std::make_pair(std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true), false);\n+}\n+\n+VkPipeline ShaderCache::CreateComputePipeline(const ComputePipelineInfo& info)\n+{\n+  VkComputePipelineCreateInfo pipeline_info = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,\n+                                               nullptr,\n+                                               0,\n+                                               {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                                nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT, info.cs,\n+                                                "main", nullptr},\n+                                               info.pipeline_layout,\n+                                               VK_NULL_HANDLE,\n+                                               -1};\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateComputePipelines(g_vulkan_context->GetDevice(), VK_NULL_HANDLE, 1,\n+                                          &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateComputePipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetComputePipeline(const ComputePipelineInfo& info)\n+{\n+  auto iter = m_compute_pipeline_objects.find(info);\n+  if (iter != m_compute_pipeline_objects.end())\n+    return iter->second;\n+\n+  VkPipeline pipeline = CreateComputePipeline(info);\n+  m_compute_pipeline_objects.emplace(info, pipeline);\n+  return pipeline;\n+}\n+\n+void ShaderCache::ClearPipelineCache()\n+{\n+  // TODO: Stop any async compiling happening.\n+  for (const auto& it : m_pipeline_objects)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  m_pipeline_objects.clear();\n+\n+  for (const auto& it : m_compute_pipeline_objects)\n+  {\n+    if (it.second != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second, nullptr);\n+  }\n+  m_compute_pipeline_objects.clear();\n+}\n+\n+class PipelineCacheReadCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  PipelineCacheReadCallback(std::vector<u8>* data) : m_data(data) {}\n+  void Read(const u32& key, const u8* value, u32 value_size) override\n+  {\n+    m_data->resize(value_size);\n+    if (value_size > 0)\n+      memcpy(m_data->data(), value, value_size);\n+  }\n+\n+private:\n+  std::vector<u8>* m_data;\n+};\n+\n+class PipelineCacheReadIgnoreCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  void Read(const u32& key, const u8* value, u32 value_size) override {}\n+};\n+\n+bool ShaderCache::CreatePipelineCache()\n+{\n+  // Vulkan pipeline caches can be shared between games for shader compile time reduction.\n+  // This assumes that drivers don\'t create all pipelines in the cache on load time, only\n+  // when a lookup occurs that matches a pipeline (or pipeline data) in the cache.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      0,                                             // size_t                     initialDataSize\n+      nullptr                                        // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed: ");\n+  return false;\n+}\n+\n+bool ShaderCache::LoadPipelineCache()\n+{\n+  // We have to keep the pipeline cache file name around since when we save it\n+  // we delete the old one, by which time the game\'s unique ID is already cleared.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  std::vector<u8> disk_data;\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadCallback read_callback(&disk_data);\n+  if (disk_cache.OpenAndRead(m_pipeline_cache_filename, read_callback) != 1)\n+    disk_data.clear();\n+\n+  if (!disk_data.empty() && !ValidatePipelineCache(disk_data.data(), disk_data.size()))\n+  {\n+    // Don\'t use this data. In fact, we should delete it to prevent it from being used next time.\n+    File::Delete(m_pipeline_cache_filename);\n+    return CreatePipelineCache();\n+  }\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      disk_data.size(),                              // size_t                     initialDataSize\n+      disk_data.data()                               // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  // Failed to create pipeline cache, try with it empty.\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed, trying empty cache: ");\n+  return CreatePipelineCache();\n+}\n+\n+// Based on Vulkan 1.0 specification,\n+// Table 9.1. Layout for pipeline cache header version VK_PIPELINE_CACHE_HEADER_VERSION_ONE\n+// NOTE: This data is assumed to be in little-endian format.\n+#pragma pack(push, 4)\n+struct VK_PIPELINE_CACHE_HEADER\n+{\n+  u32 header_length;\n+  u32 header_version;\n+  u32 vendor_id;\n+  u32 device_id;\n+  u8 uuid[VK_UUID_SIZE];\n+};\n+#pragma pack(pop)\n+// TODO: Remove the #if here when GCC 5 is a minimum build requirement.\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5\n+static_assert(std::has_trivial_copy_constructor<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#else\n+static_assert(std::is_trivially_copyable<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#endif\n+\n+bool ShaderCache::ValidatePipelineCache(const u8* data, size_t data_length)\n+{\n+  if (data_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header");\n+    return false;\n+  }\n+\n+  VK_PIPELINE_CACHE_HEADER header;\n+  std::memcpy(&header, data, sizeof(header));\n+  if (header.header_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header length");\n+    return false;\n+  }\n+\n+  if (header.header_version != VK_PIPELINE_CACHE_HEADER_VERSION_ONE)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header version");\n+    return false;\n+  }\n+\n+  if (header.vendor_id != g_vulkan_context->GetDeviceProperties().vendorID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect vendor ID (file: 0x%X, device: 0x%X)",\n+              header.vendor_id, g_vulkan_context->GetDeviceProperties().vendorID);\n+    return false;\n+  }\n+\n+  if (header.device_id != g_vulkan_context->GetDeviceProperties().deviceID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect device ID (file: 0x%X, device: 0x%X)",\n+              header.device_id, g_vulkan_context->GetDeviceProperties().deviceID);\n+    return false;\n+  }\n+\n+  if (std::memcmp(header.uuid, g_vulkan_context->GetDeviceProperties().pipelineCacheUUID,\n+                  VK_UUID_SIZE) != 0)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Incorrect UUID");\n+    return false;\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroyPipelineCache()\n+{\n+  ClearPipelineCache();\n+  vkDestroyPipelineCache(g_vulkan_context->GetDevice(), m_pipeline_cache, nullptr);\n+  m_pipeline_cache = VK_NULL_HANDLE;\n+}\n+\n+void ShaderCache::SavePipelineCache()\n+{\n+  size_t data_size;\n+  VkResult res =\n+      vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size, nullptr);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  std::vector<u8> data(data_size);\n+  res = vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size,\n+                               data.data());\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  // Delete the old cache and re-create.\n+  File::Delete(m_pipeline_cache_filename);\n+\n+  // We write a single key of 1, with the entire pipeline cache data.\n+  // Not ideal, but our disk cache class does not support just writing a single blob\n+  // of data without specifying a key.\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadIgnoreCallback callback;\n+  disk_cache.OpenAndRead(m_pipeline_cache_filename, callback);\n+  disk_cache.Append(1, data.data(), static_cast<u32>(data.size()));\n+  disk_cache.Close();\n+}\n+\n+// Cache inserter that is called back when reading from the file\n+template <typename Uid>\n+struct ShaderCacheReader : public LinearDiskCacheReader<Uid, u32>\n+{\n+  ShaderCacheReader(std::map<Uid, std::pair<VkShaderModule, bool>>& shader_map)\n+      : m_shader_map(shader_map)\n+  {\n+  }\n+  void Read(const Uid& key, const u32* value, u32 value_size) override\n+  {\n+    // We don\'t insert null modules into the shader map since creation could succeed later on.\n+    // e.g. we\'re generating bad code, but fix this in a later version, and for some reason\n+    // the cache is not invalidated.\n+    VkShaderModule module = Util::CreateShaderModule(value, value_size);\n+    if (module == VK_NULL_HANDLE)\n+      return;\n+\n+    m_shader_map.emplace(key, std::make_pair(module, false));\n+  }\n+\n+  std::map<Uid, std::pair<VkShaderModule, bool>>& m_shader_map;\n+};\n+\n+void ShaderCache::LoadShaderCaches()\n+{\n+  ShaderCacheReader<VertexShaderUid> vs_reader(m_vs_cache.shader_map);\n+  m_vs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "VS", true, true),\n+                                    vs_reader);\n+\n+  ShaderCacheReader<PixelShaderUid> ps_reader(m_ps_cache.shader_map);\n+  m_ps_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "PS", true, true),\n+                                    ps_reader);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    ShaderCacheReader<GeometryShaderUid> gs_reader(m_gs_cache.shader_map);\n+    m_gs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "GS", true, true),\n+                                      gs_reader);\n+  }\n+\n+  ShaderCacheReader<UberShader::VertexShaderUid> uber_vs_reader(m_uber_vs_cache.shader_map);\n+  m_uber_vs_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberVS", false, true), uber_vs_reader);\n+  ShaderCacheReader<UberShader::PixelShaderUid> uber_ps_reader(m_uber_ps_cache.shader_map);\n+  m_uber_ps_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberPS", false, true), uber_ps_reader);\n+\n+  SETSTAT(stats.numPixelShadersCreated, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numPixelShadersAlive, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersCreated, static_cast<int>(m_vs_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersAlive, static_cast<int>(m_vs_cache.shader_map.size()));\n+}\n+\n+template <typename T>\n+static void DestroyShaderCache(T& cache)\n+{\n+  cache.disk_cache.Sync();\n+  cache.disk_cache.Close();\n+  for (const auto& it : cache.shader_map)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  cache.shader_map.clear();\n+}\n+\n+void ShaderCache::DestroyShaderCaches()\n+{\n+  DestroyShaderCache(m_vs_cache);\n+  DestroyShaderCache(m_ps_cache);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+    DestroyShaderCache(m_gs_cache);\n+\n+  DestroyShaderCache(m_uber_vs_cache);\n+  DestroyShaderCache(m_uber_ps_cache);\n+\n+  SETSTAT(stats.numPixelShadersCreated, 0);\n+  SETSTAT(stats.numPixelShadersAlive, 0);\n+  SETSTAT(stats.numVertexShadersCreated, 0);\n+  SETSTAT(stats.numVertexShadersAlive, 0);\n+}\n+\n+VkShaderModule ShaderCache::GetVertexShaderForUid(const VertexShaderUid& uid)\n+{\n+  auto it = m_vs_cache.shader_map.find(uid);\n+  if (it != m_vs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_vs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GenerateVertexShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileVertexShader(&spv, source_code.GetBuffer().c_str(),\n+                                          source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_vs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numVertexShadersCreated);\n+      INCSTAT(stats.numVertexShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_vs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetGeometryShaderForUid(const GeometryShaderUid& uid)\n+{\n+  _assert_(g_vulkan_context->SupportsGeometryShaders());\n+  auto it = m_gs_cache.shader_map.find(uid);\n+  if (it != m_gs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_gs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GenerateGeometryShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileGeometryShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+      m_gs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_gs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetPixelShaderForUid(const PixelShaderUid& uid)\n+{\n+  auto it = m_ps_cache.shader_map.find(uid);\n+  if (it != m_ps_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_ps_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      GeneratePixelShaderCode(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_ps_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numPixelShadersCreated);\n+      INCSTAT(stats.numPixelShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_ps_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetVertexUberShaderForUid(const UberShader::VertexShaderUid& uid)\n+{\n+  auto it = m_uber_vs_cache.shader_map.find(uid);\n+  if (it != m_uber_vs_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_uber_vs_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code = UberShader::GenVertexShader(\n+      APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileVertexShader(&spv, source_code.GetBuffer().c_str(),\n+                                          source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_uber_vs_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numVertexShadersCreated);\n+      INCSTAT(stats.numVertexShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_uber_vs_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+VkShaderModule ShaderCache::GetPixelUberShaderForUid(const UberShader::PixelShaderUid& uid)\n+{\n+  auto it = m_uber_ps_cache.shader_map.find(uid);\n+  if (it != m_uber_ps_cache.shader_map.end())\n+  {\n+    // If it\'s pending, compile it synchronously.\n+    if (!it->second.second)\n+      return it->second.first;\n+    else\n+      m_uber_ps_cache.shader_map.erase(it);\n+  }\n+\n+  // Not in the cache, so compile the shader.\n+  ShaderCompiler::SPIRVCodeVector spv;\n+  VkShaderModule module = VK_NULL_HANDLE;\n+  ShaderCode source_code =\n+      UberShader::GenPixelShader(APIType::Vulkan, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(),\n+                                            source_code.GetBuffer().length()))\n+  {\n+    module = Util::CreateShaderModule(spv.data(), spv.size());\n+\n+    // Append to shader cache if it created successfully.\n+    if (module != VK_NULL_HANDLE)\n+    {\n+      m_uber_ps_cache.disk_cache.Append(uid, spv.data(), static_cast<u32>(spv.size()));\n+      INCSTAT(stats.numPixelShadersCreated);\n+      INCSTAT(stats.numPixelShadersAlive);\n+    }\n+  }\n+\n+  // We still insert null entries to prevent further compilation attempts.\n+  m_uber_ps_cache.shader_map.emplace(uid, std::make_pair(module, false));\n+  return module;\n+}\n+\n+void ShaderCache::RecompileSharedShaders()\n+{\n+  DestroySharedShaders();\n+  if (!CompileSharedShaders())\n+    PanicAlert("Failed to recompile shared shaders.");\n+}\n+\n+void ShaderCache::ReloadShaderAndPipelineCaches()\n+{\n+  m_async_shader_compiler->WaitUntilCompletion();\n+  m_async_shader_compiler->RetrieveWorkItems();\n+\n+  SavePipelineCache();\n+  DestroyShaderCaches();\n+  DestroyPipelineCache();\n+\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    LoadPipelineCache();\n+  }\n+  else\n+  {\n+    CreatePipelineCache();\n+  }\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n+}\n+\n+std::string ShaderCache::GetUtilityShaderHeader() const\n+{\n+  std::stringstream ss;\n+  if (g_ActiveConfig.iMultisamples > 1)\n+  {\n+    ss << "#define MSAA_ENABLED 1" << std::endl;\n+    ss << "#define MSAA_SAMPLES " << g_ActiveConfig.iMultisamples << std::endl;\n+    if (g_ActiveConfig.bSSAA)\n+      ss << "#define SSAA_ENABLED 1" << std::endl;\n+  }\n+\n+  u32 efb_layers = (g_ActiveConfig.iStereoMode != STEREO_OFF) ? 2 : 1;\n+  ss << "#define EFB_LAYERS " << efb_layers << std::endl;\n+\n+  return ss.str();\n+}\n+\n+// Comparison operators for PipelineInfos\n+// Since these all boil down to POD types, we can just memcmp the entire thing for speed\n+// The is_trivially_copyable check fails on MSVC due to BitField.\n+// TODO: Can we work around this any way?\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5 && !defined(_MSC_VER)\n+static_assert(std::has_trivial_copy_constructor<PipelineInfo>::value,\n+              "PipelineInfo is trivially copyable");\n+#elif !defined(_MSC_VER)\n+static_assert(std::is_trivially_copyable<PipelineInfo>::value,\n+              "PipelineInfo is trivially copyable");\n+#endif\n+\n+std::size_t PipelineInfoHash::operator()(const PipelineInfo& key) const\n+{\n+  return static_cast<std::size_t>(XXH64(&key, sizeof(key), 0));\n+}\n+\n+bool operator==(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;\n+}\n+\n+bool operator!=(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator<(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) < 0;\n+}\n+\n+bool operator>(const PipelineInfo& lhs, const PipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) > 0;\n+}\n+\n+bool operator==(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits == rhs.bits;\n+}\n+\n+bool operator!=(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator>(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits > rhs.bits;\n+}\n+\n+bool operator<(const SamplerState& lhs, const SamplerState& rhs)\n+{\n+  return lhs.bits < rhs.bits;\n+}\n+\n+std::size_t ComputePipelineInfoHash::operator()(const ComputePipelineInfo& key) const\n+{\n+  return static_cast<std::size_t>(XXH64(&key, sizeof(key), 0));\n+}\n+\n+bool operator==(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;\n+}\n+\n+bool operator!=(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return !operator==(lhs, rhs);\n+}\n+\n+bool operator<(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) < 0;\n+}\n+\n+bool operator>(const ComputePipelineInfo& lhs, const ComputePipelineInfo& rhs)\n+{\n+  return std::memcmp(&lhs, &rhs, sizeof(lhs)) > 0;\n+}\n+\n+bool ShaderCache::CompileSharedShaders()\n+{\n+  static const char PASSTHROUGH_VERTEX_SHADER_SOURCE[] = R"(\n+    layout(location = 0) in vec4 ipos;\n+    layout(location = 5) in vec4 icol0;\n+    layout(location = 8) in vec3 itex0;\n+\n+    layout(location = 0) out vec3 uv0;\n+    layout(location = 1) out vec4 col0;\n+\n+    void main()\n+    {\n+      gl_Position = ipos;\n+      uv0 = itex0;\n+      col0 = icol0;\n+    }\n+  )";\n+\n+  static const char PASSTHROUGH_GEOMETRY_SHADER_SOURCE[] = R"(\n+    layout(triangles) in;\n+    layout(triangle_strip, max_vertices = EFB_LAYERS * 3) out;\n+\n+    layout(location = 0) in vec3 in_uv0[];\n+    layout(location = 1) in vec4 in_col0[];\n+\n+    layout(location = 0) out vec3 out_uv0;\n+    layout(location = 1) out vec4 out_col0;\n+\n+    void main()\n+    {\n+      for (int j = 0; j < EFB_LAYERS; j++)\n+      {\n+        for (int i = 0; i < 3; i++)\n+        {\n+          gl_Layer = j;\n+          gl_Position = gl_in[i].gl_Position;\n+          out_uv0 = vec3(in_uv0[i].xy, float(j));\n+          out_col0 = in_col0[i];\n+          EmitVertex();\n+        }\n+        EndPrimitive();\n+      }\n+    }\n+  )";\n+\n+  static const char SCREEN_QUAD_VERTEX_SHADER_SOURCE[] = R"(\n+    layout(location = 0) out vec3 uv0;\n+\n+    void main()\n+    {\n+        /*\n+         * id   &1    &2   clamp(*2-1)\n+         * 0    0,0   0,0  -1,-1      TL\n+         * 1    1,0   1,0  1,-1       TR\n+         * 2    0,2   0,1  -1,1       BL\n+         * 3    1,2   1,1  1,1        BR\n+         */\n+        vec2 rawpos = vec2(float(gl_VertexID & 1), clamp(float(gl_VertexID & 2), 0.0f, 1.0f));\n+        gl_Position = vec4(rawpos * 2.0f - 1.0f, 0.0f, 1.0f);\n+        uv0 = vec3(rawpos, 0.0f);\n+    }\n+  )";\n+\n+  static const char SCREEN_QUAD_GEOMETRY_SHADER_SOURCE[] = R"(\n+    layout(triangles) in;\n+    layout(triangle_strip, max_vertices = EFB_LAYERS * 3) out;\n+\n+    layout(location = 0) in vec3 in_uv0[];\n+\n+    layout(location = 0) out vec3 out_uv0;\n+\n+    void main()\n+    {\n+      for (int j = 0; j < EFB_LAYERS; j++)\n+      {\n+        for (int i = 0; i < 3; i++)\n+        {\n+          gl_Layer = j;\n+          gl_Position = gl_in[i].gl_Position;\n+          out_uv0 = vec3(in_uv0[i].xy, float(j));\n+          EmitVertex();\n+        }\n+        EndPrimitive();\n+      }\n+    }\n+  )";\n+\n+  std::string header = GetUtilityShaderHeader();\n+\n+  m_screen_quad_vertex_shader =\n+      Util::CompileAndCreateVertexShader(header + SCREEN_QUAD_VERTEX_SHADER_SOURCE);\n+  m_passthrough_vertex_shader =\n+      Util::CompileAndCreateVertexShader(header + PASSTHROUGH_VERTEX_SHADER_SOURCE);\n+  if (m_screen_quad_vertex_shader == VK_NULL_HANDLE ||\n+      m_passthrough_vertex_shader == VK_NULL_HANDLE)\n+  {\n+    return false;\n+  }\n+\n+  if (g_ActiveConfig.iStereoMode != STEREO_OFF && g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    m_screen_quad_geometry_shader =\n+        Util::CompileAndCreateGeometryShader(header + SCREEN_QUAD_GEOMETRY_SHADER_SOURCE);\n+    m_passthrough_geometry_shader =\n+        Util::CompileAndCreateGeometryShader(header + PASSTHROUGH_GEOMETRY_SHADER_SOURCE);\n+    if (m_screen_quad_geometry_shader == VK_NULL_HANDLE ||\n+        m_passthrough_geometry_shader == VK_NULL_HANDLE)\n+    {\n+      return false;\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroySharedShaders()\n+{\n+  auto DestroyShader = [this](VkShaderModule& shader) {\n+    if (shader != VK_NULL_HANDLE)\n+    {\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), shader, nullptr);\n+      shader = VK_NULL_HANDLE;\n+    }\n+  };\n+\n+  DestroyShader(m_screen_quad_vertex_shader);\n+  DestroyShader(m_passthrough_vertex_shader);\n+  DestroyShader(m_screen_quad_geometry_shader);\n+  DestroyShader(m_passthrough_geometry_shader);\n+}\n+\n+void ShaderCache::CreateDummyPipeline(const UberShader::VertexShaderUid& vuid,\n+                                      const GeometryShaderUid& guid,\n+                                      const UberShader::PixelShaderUid& puid)\n+{\n+  PortableVertexDeclaration vertex_decl;\n+  std::memset(&vertex_decl, 0, sizeof(vertex_decl));\n+\n+  PipelineInfo pinfo;\n+  pinfo.vertex_format =\n+      static_cast<const VertexFormat*>(VertexLoaderManager::GetUberVertexFormat(vertex_decl));\n+  pinfo.pipeline_layout = g_object_cache->GetPipelineLayout(\n+      g_ActiveConfig.bBBoxEnable && g_ActiveConfig.BBoxUseFragmentShaderImplementation() ?\n+          PIPELINE_LAYOUT_BBOX :\n+          PIPELINE_LAYOUT_STANDARD);\n+  pinfo.vs = GetVertexUberShaderForUid(vuid);\n+  pinfo.gs = (!guid.GetUidData()->IsPassthrough() && g_vulkan_context->SupportsGeometryShaders()) ?\n+                 GetGeometryShaderForUid(guid) :\n+                 VK_NULL_HANDLE;\n+  pinfo.ps = GetPixelUberShaderForUid(puid);\n+  pinfo.render_pass = FramebufferManager::GetInstance()->GetEFBLoadRenderPass();\n+  pinfo.rasterization_state.bits = Util::GetNoCullRasterizationState().bits;\n+  pinfo.depth_stencil_state.bits = Util::GetNoDepthTestingDepthStencilState().bits;\n+  pinfo.blend_state.hex = Util::GetNoBlendingBlendState().hex;\n+  pinfo.primitive_topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;', 'created_at': '2017-07-27T04:27:33Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751390', 'position': 1204, 'pull_request_review_id': 52555182, 'updated_at': '2017-07-27T04:27:33Z', 'id': 129751390, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 1204, 'body': "I keep questioning whether this should follow the same as `VertexManager::vFlush` where it takes into account `g_ActiveConfig.backend_info.bSupportsPrimitiveRestart` but testing doesn't seem to offer any improvements on my RX480.  Is there a reason we do it in vFlush and not here?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751390', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751390'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751390'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'path': 'Source/Core/VideoBackends/Vulkan/ShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:24:48.979780	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52554971', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -182,161 +220,214 @@ void ProgramShaderCache::UploadConstants()\n   }\n }\n \n-SHADER* ProgramShaderCache::SetShader(u32 primitive_type)\n+SHADER* ProgramShaderCache::SetShader(u32 primitive_type, const GLVertexFormat* vertex_format)', 'created_at': '2017-07-27T04:24:47Z', 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751167', 'position': 134, 'pull_request_review_id': 52554971, 'updated_at': '2017-07-27T04:24:47Z', 'id': 129751167, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 126, 'body': 'Ideally, yep. But the best way would be with the "abstract pipeline" concept.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751167', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751167'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751167'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '89e592d62f6e3acef0c6927dcdae0540cba64291', 'path': 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'stenzek', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:23:27.578498	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52554870', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -195,73 +242,264 @@ void VertexShaderCache::Shutdown()\n   Clear();\n   g_vs_disk_cache.Sync();\n   g_vs_disk_cache.Close();\n+  g_uber_vs_disk_cache.Sync();\n+  g_uber_vs_disk_cache.Close();\n }\n \n-bool VertexShaderCache::SetShader()\n+bool VertexShaderCache::SetShader(D3DVertexFormat* vertex_format)\n {\n-  VertexShaderUid uid = GetVertexShaderUid();\n-\n-  if (last_entry)\n+  if (g_ActiveConfig.CanUseUberShaders() &&\n+      (g_ActiveConfig.bDisableSpecializedShaders || g_ActiveConfig.bForceVertexUberShaders))\n   {\n-    if (uid == last_uid)\n-    {\n-      GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true);\n-      return (last_entry->shader != nullptr);\n-    }\n+    return SetUberShader(vertex_format);\n   }\n \n-  last_uid = uid;\n+  VertexShaderUid uid = GetVertexShaderUid();\n+  if (last_entry && uid == last_uid)\n+  {\n+    if (last_entry->pending)\n+      return SetUberShader(vertex_format);\n+\n+    if (!last_entry->shader)\n+      return false;\n+\n+    vertex_format->SetInputLayout(last_entry->bytecode);\n+    D3D::stateman->SetVertexShader(last_entry->shader);\n+    return true;\n+  }\n \n-  VSCache::iterator iter = vshaders.find(uid);\n+  auto iter = vshaders.find(uid);\n   if (iter != vshaders.end())\n   {\n     const VSCacheEntry& entry = iter->second;\n+    if (entry.pending)\n+      return SetUberShader(vertex_format);\n+\n+    last_uid = uid;\n     last_entry = &entry;\n \n     GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true);\n-    return (entry.shader != nullptr);\n+    if (!last_entry->shader)\n+      return false;\n+\n+    vertex_format->SetInputLayout(last_entry->bytecode);\n+    D3D::stateman->SetVertexShader(last_entry->shader);\n+    return true;\n+  }\n+\n+  // Background compiling?\n+  if (g_ActiveConfig.CanBackgroundCompileShaders())\n+  {\n+    // Create a pending entry\n+    VSCacheEntry entry;\n+    entry.pending = true;\n+    vshaders[uid] = entry;\n+\n+    // Queue normal shader compiling and use ubershader\n+    g_async_compiler->QueueWorkItem(\n+        g_async_compiler->CreateWorkItem<VertexShaderCompilerWorkItem>(uid));\n+    return SetUberShader(vertex_format);\n+  }\n+\n+  // Need to compile a new shader\n+  D3DBlob* bytecode = nullptr;\n+  ShaderCode code =\n+      GenerateVertexShaderCode(APIType::D3D, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  D3D::CompileVertexShader(code.GetBuffer(), &bytecode);\n+  if (!InsertByteCode(uid, bytecode))\n+  {\n+    SAFE_RELEASE(bytecode);\n+    return false;\n   }\n \n-  ShaderCode code = GenerateVertexShaderCode(APIType::D3D, uid.GetUidData());\n+  g_vs_disk_cache.Append(uid, bytecode->Data(), bytecode->Size());\n+  bytecode->Release();\n+  return SetShader(vertex_format);\n+}\n+\n+bool VertexShaderCache::SetUberShader(D3DVertexFormat* vertex_format)\n+{\n+  D3DVertexFormat* uber_vertex_format = static_cast<D3DVertexFormat*>(\n+      VertexLoaderManager::GetUberVertexFormat(vertex_format->GetVertexDeclaration()));\n+  UberShader::VertexShaderUid uid = UberShader::GetVertexShaderUid();\n+  if (last_uber_entry && last_uber_uid == uid)\n+  {\n+    if (!last_uber_entry->shader)\n+      return false;\n+\n+    uber_vertex_format->SetInputLayout(last_uber_entry->bytecode);\n+    D3D::stateman->SetVertexShader(last_uber_entry->shader);\n+    return true;\n+  }\n \n-  D3DBlob* pbytecode = nullptr;\n-  D3D::CompileVertexShader(code.GetBuffer(), &pbytecode);\n+  auto iter = ubervshaders.find(uid);\n+  if (iter != ubervshaders.end())\n+  {\n+    const VSCacheEntry& entry = iter->second;\n+    last_uber_uid = uid;\n+    last_uber_entry = &entry;\n+\n+    GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true);\n+    if (!last_uber_entry->shader)\n+      return false;\n+\n+    uber_vertex_format->SetInputLayout(last_uber_entry->bytecode);\n+    D3D::stateman->SetVertexShader(last_uber_entry->shader);\n+    return true;\n+  }\n \n-  if (pbytecode == nullptr)\n+  // Need to compile a new shader\n+  D3DBlob* bytecode = nullptr;\n+  ShaderCode code =\n+      UberShader::GenVertexShader(APIType::D3D, ShaderHostConfig::GetCurrent(), uid.GetUidData());\n+  D3D::CompileVertexShader(code.GetBuffer(), &bytecode);\n+  if (!InsertByteCode(uid, bytecode))\n   {\n-    GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true);\n+    SAFE_RELEASE(bytecode);\n     return false;\n   }\n-  g_vs_disk_cache.Append(uid, pbytecode->Data(), pbytecode->Size());\n \n-  bool success = InsertByteCode(uid, pbytecode);\n-  pbytecode->Release();\n+  g_uber_vs_disk_cache.Append(uid, bytecode->Data(), bytecode->Size());\n+  bytecode->Release();\n+  return SetUberShader(vertex_format);\n+}\n+\n+bool VertexShaderCache::InsertByteCode(const VertexShaderUid& uid, D3DBlob* blob)', 'created_at': '2017-07-27T04:23:26Z', 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751075', 'position': None, 'pull_request_review_id': 52554870, 'updated_at': '2017-07-27T04:23:26Z', 'id': 129751075, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 280, 'body': 'Very different. The vertex ubershader UID is just the number of texgens. The specialized shader UID has texgen config as well as count, lighting, transforms, etc.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751075', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129751075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129751075'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '89e592d62f6e3acef0c6927dcdae0540cba64291', 'path': 'Source/Core/VideoBackends/D3D/VertexShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'stenzek', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:22:20.109842	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52554763', 'comments': [{'commit_id': '5e8adb49e0ff98c37ecd2770b94191da99e57461', 'diff_hunk': '@@ -502,88 +605,253 @@ void ProgramShaderCache::Init()\n   // Then once more to get bytes\n   s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH);\n \n-  // Read our shader cache, only if supported and enabled\n-  if (g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache)\n+  // The GPU shader code appears to be context-specific on Mesa/i965.\n+  // This means that if we compiled the ubershaders asynchronously, they will be recompiled\n+  // on the main thread the first time they are used, causing stutter. Nouveau has been\n+  // reported to crash if draw calls are invoked on the shared context threads. For now,\n+  // disable asynchronous compilation on Mesa.\n+  if (!DriverDetails::HasBug(DriverDetails::BUG_SHARED_CONTEXT_SHADER_COMPILATION) &&\n+      g_ActiveConfig.GetShaderCompilerThreads() > 0)\n   {\n-    GLint Supported;\n-    glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported);\n-    if (!Supported)\n+    s_async_compiler = std::make_unique<SharedContextAsyncShaderCompiler>();\n+    s_async_compiler->StartWorkerThreads(g_ActiveConfig.GetShaderCompilerThreads());\n+    if (!s_async_compiler->HasWorkerThreads())\n     {\n-      ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So "\n-                       "disable shader cache.");\n-      g_ogl_config.bSupportsGLSLCache = false;\n+      // No point using the async compiler without workers.\n+      s_async_compiler.reset();\n     }\n-    else\n-    {\n-      if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX)))\n-        File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX));\n+  }\n+\n+  // Read our shader cache, only if supported and enabled\n+  if (g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache)\n+    LoadProgramBinaries();\n \n-      std::string cache_filename =\n-          StringFromFormat("%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(),\n-                           SConfig::GetInstance().GetGameID().c_str());\n+  CreateHeader();\n \n-      ProgramShaderCacheInserter inserter;\n-      g_program_disk_cache.OpenAndRead(cache_filename, inserter);\n-    }\n-    SETSTAT(stats.numPixelShadersAlive, pshaders.size());\n+  CurrentProgram = 0;\n+  last_entry = nullptr;\n+  last_uber_entry = nullptr;\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n+}\n+\n+void ProgramShaderCache::RetrieveAsyncShaders()\n+{\n+  if (s_async_compiler)\n+    s_async_compiler->RetrieveWorkItems();\n+}\n+\n+void ProgramShaderCache::Reload()\n+{\n+  if (s_async_compiler)\n+  {\n+    s_async_compiler->WaitUntilCompletion();\n+    s_async_compiler->RetrieveWorkItems();\n   }\n \n-  CreateHeader();\n+  const bool use_cache = g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache;\n+  if (use_cache)\n+    SaveProgramBinaries();\n+\n+  s_program_disk_cache.Close();\n+  s_uber_program_disk_cache.Close();\n+  DestroyShaders();\n+\n+  if (use_cache)\n+    LoadProgramBinaries();\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n \n+  InvalidateVertexFormat();\n   CurrentProgram = 0;\n   last_entry = nullptr;\n+  last_uber_entry = nullptr;\n+  last_uid = {};\n+  last_uber_uid = {};\n }\n \n void ProgramShaderCache::Shutdown()\n {\n+  if (s_async_compiler)\n+  {\n+    s_async_compiler->WaitUntilCompletion();\n+    s_async_compiler->StopWorkerThreads();\n+    s_async_compiler->RetrieveWorkItems();\n+    s_async_compiler.reset();\n+  }\n+\n   // store all shaders in cache on disk\n-  if (g_ogl_config.bSupportsGLSLCache)\n+  if (g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache)\n+    SaveProgramBinaries();', 'created_at': '2017-07-27T04:22:18Z', 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129750964', 'position': None, 'pull_request_review_id': 52554763, 'updated_at': '2017-07-27T04:22:18Z', 'id': 129750964, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 702, 'body': 'Saving immediately after compilation will possibly increase stuttering without ubershaders (depending on the driver).', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129750964', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129750964'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129750964'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '89e592d62f6e3acef0c6927dcdae0540cba64291', 'path': 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'stenzek', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T04:10:39.455812	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52553946', 'comments': [{'commit_id': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'diff_hunk': '@@ -0,0 +1,1377 @@\n+// Copyright 2016 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoBackends/Vulkan/ShaderCache.h"\n+\n+#include <algorithm>\n+#include <sstream>\n+#include <type_traits>\n+#include <xxhash.h>\n+\n+#include "Common/Assert.h"\n+#include "Common/CommonFuncs.h"\n+#include "Common/LinearDiskCache.h"\n+#include "Common/MsgHandler.h"\n+\n+#include "Core/ConfigManager.h"\n+#include "Core/Host.h"\n+\n+#include "VideoBackends/Vulkan/FramebufferManager.h"\n+#include "VideoBackends/Vulkan/ShaderCompiler.h"\n+#include "VideoBackends/Vulkan/StreamBuffer.h"\n+#include "VideoBackends/Vulkan/Util.h"\n+#include "VideoBackends/Vulkan/VertexFormat.h"\n+#include "VideoBackends/Vulkan/VulkanContext.h"\n+#include "VideoCommon/AsyncShaderCompiler.h"\n+#include "VideoCommon/GeometryShaderGen.h"\n+#include "VideoCommon/Statistics.h"\n+#include "VideoCommon/UberShaderPixel.h"\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/VertexLoaderManager.h"\n+\n+namespace Vulkan\n+{\n+std::unique_ptr<ShaderCache> g_shader_cache;\n+\n+ShaderCache::ShaderCache()\n+{\n+}\n+\n+ShaderCache::~ShaderCache()\n+{\n+  DestroyPipelineCache();\n+  DestroyShaderCaches();\n+  DestroySharedShaders();\n+}\n+\n+bool ShaderCache::Initialize()\n+{\n+  if (g_ActiveConfig.bShaderCache)\n+  {\n+    LoadShaderCaches();\n+    if (!LoadPipelineCache())\n+      return false;\n+  }\n+  else\n+  {\n+    if (!CreatePipelineCache())\n+      return false;\n+  }\n+\n+  if (!CompileSharedShaders())\n+    return false;\n+\n+  m_async_shader_compiler = std::make_unique<VideoCommon::AsyncShaderCompiler>();\n+  m_async_shader_compiler->ResizeWorkerThreads(g_ActiveConfig.CanPrecompileUberShaders() ?\n+                                                   g_ActiveConfig.GetShaderPrecompilerThreads() :\n+                                                   g_ActiveConfig.GetShaderCompilerThreads());\n+  return true;\n+}\n+\n+void ShaderCache::Shutdown()\n+{\n+  if (m_async_shader_compiler)\n+  {\n+    m_async_shader_compiler->StopWorkerThreads();\n+    m_async_shader_compiler->RetrieveWorkItems();\n+  }\n+}\n+\n+static bool IsStripPrimitiveTopology(VkPrimitiveTopology topology)\n+{\n+  return topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY ||\n+         topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;\n+}\n+\n+static VkPipelineRasterizationStateCreateInfo\n+GetVulkanRasterizationState(const RasterizationState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                               pNext\n+      0,                        // VkPipelineRasterizationStateCreateFlags   flags\n+      state.depth_clamp,        // VkBool32                                  depthClampEnable\n+      VK_FALSE,                 // VkBool32                                  rasterizerDiscardEnable\n+      VK_POLYGON_MODE_FILL,     // VkPolygonMode                             polygonMode\n+      state.cull_mode,          // VkCullModeFlags                           cullMode\n+      VK_FRONT_FACE_CLOCKWISE,  // VkFrontFace                               frontFace\n+      VK_FALSE,                 // VkBool32                                  depthBiasEnable\n+      0.0f,                     // float                                     depthBiasConstantFactor\n+      0.0f,                     // float                                     depthBiasClamp\n+      0.0f,                     // float                                     depthBiasSlopeFactor\n+      1.0f                      // float                                     lineWidth\n+  };\n+}\n+\n+static VkPipelineMultisampleStateCreateInfo\n+GetVulkanMultisampleState(const RasterizationState& rs_state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                      // const void*                              pNext\n+      0,                            // VkPipelineMultisampleStateCreateFlags    flags\n+      rs_state.samples,             // VkSampleCountFlagBits                    rasterizationSamples\n+      rs_state.per_sample_shading,  // VkBool32                                 sampleShadingEnable\n+      1.0f,                         // float                                    minSampleShading\n+      nullptr,                      // const VkSampleMask*                      pSampleMask;\n+      VK_FALSE,  // VkBool32                                 alphaToCoverageEnable\n+      VK_FALSE   // VkBool32                                 alphaToOneEnable\n+  };\n+}\n+\n+static VkPipelineDepthStencilStateCreateInfo\n+GetVulkanDepthStencilState(const DepthStencilState& state)\n+{\n+  return {\n+      VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,             // const void*                               pNext\n+      0,                   // VkPipelineDepthStencilStateCreateFlags    flags\n+      state.test_enable,   // VkBool32                                  depthTestEnable\n+      state.write_enable,  // VkBool32                                  depthWriteEnable\n+      state.compare_op,    // VkCompareOp                               depthCompareOp\n+      VK_FALSE,            // VkBool32                                  depthBoundsTestEnable\n+      VK_FALSE,            // VkBool32                                  stencilTestEnable\n+      {},                  // VkStencilOpState                          front\n+      {},                  // VkStencilOpState                          back\n+      0.0f,                // float                                     minDepthBounds\n+      1.0f                 // float                                     maxDepthBounds\n+  };\n+}\n+\n+static VkPipelineColorBlendAttachmentState GetVulkanAttachmentBlendState(const BlendingState& state)\n+{\n+  VkPipelineColorBlendAttachmentState vk_state = {};\n+  vk_state.blendEnable = static_cast<VkBool32>(state.blendenable);\n+  vk_state.colorBlendOp = state.subtract ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+  vk_state.alphaBlendOp = state.subtractAlpha ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD;\n+\n+  if (state.usedualsrc && g_vulkan_context->SupportsDualSourceBlend())\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+  else\n+  {\n+    static constexpr std::array<VkBlendFactor, 8> src_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    static constexpr std::array<VkBlendFactor, 8> dst_factors = {\n+        {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_SRC_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA,\n+         VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA}};\n+\n+    vk_state.srcColorBlendFactor = src_factors[state.srcfactor];\n+    vk_state.srcAlphaBlendFactor = src_factors[state.srcfactoralpha];\n+    vk_state.dstColorBlendFactor = dst_factors[state.dstfactor];\n+    vk_state.dstAlphaBlendFactor = dst_factors[state.dstfactoralpha];\n+  }\n+\n+  if (state.colorupdate)\n+  {\n+    vk_state.colorWriteMask =\n+        VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT;\n+  }\n+  else\n+  {\n+    vk_state.colorWriteMask = 0;\n+  }\n+\n+  if (state.alphaupdate)\n+    vk_state.colorWriteMask |= VK_COLOR_COMPONENT_A_BIT;\n+\n+  return vk_state;\n+}\n+\n+static VkPipelineColorBlendStateCreateInfo\n+GetVulkanColorBlendState(const BlendingState& state,\n+                         const VkPipelineColorBlendAttachmentState* attachments,\n+                         uint32_t num_attachments)\n+{\n+  static constexpr std::array<VkLogicOp, 16> vk_logic_ops = {\n+      {VK_LOGIC_OP_CLEAR, VK_LOGIC_OP_AND, VK_LOGIC_OP_AND_REVERSE, VK_LOGIC_OP_COPY,\n+       VK_LOGIC_OP_AND_INVERTED, VK_LOGIC_OP_NO_OP, VK_LOGIC_OP_XOR, VK_LOGIC_OP_OR,\n+       VK_LOGIC_OP_NOR, VK_LOGIC_OP_EQUIVALENT, VK_LOGIC_OP_INVERT, VK_LOGIC_OP_OR_REVERSE,\n+       VK_LOGIC_OP_COPY_INVERTED, VK_LOGIC_OP_OR_INVERTED, VK_LOGIC_OP_NAND, VK_LOGIC_OP_SET}};\n+\n+  VkBool32 vk_logic_op_enable = static_cast<VkBool32>(state.logicopenable);\n+  if (vk_logic_op_enable && !g_vulkan_context->SupportsLogicOps())\n+  {\n+    // At the time of writing, Adreno and Mali drivers didn\'t support logic ops.\n+    // The "emulation" through blending path has been removed, so just disable it completely.\n+    // These drivers don\'t support dual-source blend either, so issues are to be expected.\n+    vk_logic_op_enable = VK_FALSE;\n+  }\n+\n+  VkLogicOp vk_logic_op = vk_logic_op_enable ? vk_logic_ops[state.logicmode] : VK_LOGIC_OP_CLEAR;\n+\n+  VkPipelineColorBlendStateCreateInfo vk_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                   pNext\n+      0,                        // VkPipelineColorBlendStateCreateFlags          flags\n+      vk_logic_op_enable,       // VkBool32                                      logicOpEnable\n+      vk_logic_op,              // VkLogicOp                                     logicOp\n+      num_attachments,          // uint32_t                                      attachmentCount\n+      attachments,              // const VkPipelineColorBlendAttachmentState*    pAttachments\n+      {1.0f, 1.0f, 1.0f, 1.0f}  // float                                         blendConstants[4]\n+  };\n+\n+  return vk_state;\n+}\n+\n+VkPipeline ShaderCache::CreatePipeline(const PipelineInfo& info)\n+{\n+  // Declare descriptors for empty vertex buffers/attributes\n+  static const VkPipelineVertexInputStateCreateInfo empty_vertex_input_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,  // const void*                                pNext\n+      0,        // VkPipelineVertexInputStateCreateFlags       flags\n+      0,        // uint32_t                                    vertexBindingDescriptionCount\n+      nullptr,  // const VkVertexInputBindingDescription*      pVertexBindingDescriptions\n+      0,        // uint32_t                                    vertexAttributeDescriptionCount\n+      nullptr   // const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions\n+  };\n+\n+  // Vertex inputs\n+  const VkPipelineVertexInputStateCreateInfo& vertex_input_state =\n+      info.vertex_format ? info.vertex_format->GetVertexInputStateInfo() : empty_vertex_input_state;\n+\n+  // Input assembly\n+  VkPipelineInputAssemblyStateCreateInfo input_assembly_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,  // VkStructureType sType\n+      nullptr,                  // const void*                                pNext\n+      0,                        // VkPipelineInputAssemblyStateCreateFlags    flags\n+      info.primitive_topology,  // VkPrimitiveTopology                        topology\n+      VK_FALSE                  // VkBool32                                   primitiveRestartEnable\n+  };\n+\n+  // See Vulkan spec, section 19:\n+  // If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,\n+  // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,\n+  // primitiveRestartEnable must be VK_FALSE\n+  if (g_ActiveConfig.backend_info.bSupportsPrimitiveRestart &&\n+      IsStripPrimitiveTopology(info.primitive_topology))\n+  {\n+    input_assembly_state.primitiveRestartEnable = VK_TRUE;\n+  }\n+\n+  // Shaders to stages\n+  VkPipelineShaderStageCreateInfo shader_stages[3];\n+  uint32_t num_shader_stages = 0;\n+  if (info.vs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_VERTEX_BIT,\n+                                          info.vs,\n+                                          "main"};\n+  }\n+  if (info.gs != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_GEOMETRY_BIT,\n+                                          info.gs,\n+                                          "main"};\n+  }\n+  if (info.ps != VK_NULL_HANDLE)\n+  {\n+    shader_stages[num_shader_stages++] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                          nullptr,\n+                                          0,\n+                                          VK_SHADER_STAGE_FRAGMENT_BIT,\n+                                          info.ps,\n+                                          "main"};\n+  }\n+\n+  // Fill in Vulkan descriptor structs from our state structures.\n+  VkPipelineRasterizationStateCreateInfo rasterization_state =\n+      GetVulkanRasterizationState(info.rasterization_state);\n+  VkPipelineMultisampleStateCreateInfo multisample_state =\n+      GetVulkanMultisampleState(info.rasterization_state);\n+  VkPipelineDepthStencilStateCreateInfo depth_stencil_state =\n+      GetVulkanDepthStencilState(info.depth_stencil_state);\n+  VkPipelineColorBlendAttachmentState blend_attachment_state =\n+      GetVulkanAttachmentBlendState(info.blend_state);\n+  VkPipelineColorBlendStateCreateInfo blend_state =\n+      GetVulkanColorBlendState(info.blend_state, &blend_attachment_state, 1);\n+\n+  // This viewport isn\'t used, but needs to be specified anyway.\n+  static const VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};\n+  static const VkRect2D scissor = {{0, 0}, {1, 1}};\n+  static const VkPipelineViewportStateCreateInfo viewport_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,\n+      nullptr,\n+      0,          // VkPipelineViewportStateCreateFlags    flags;\n+      1,          // uint32_t                              viewportCount\n+      &viewport,  // const VkViewport*                     pViewports\n+      1,          // uint32_t                              scissorCount\n+      &scissor    // const VkRect2D*                       pScissors\n+  };\n+\n+  // Set viewport and scissor dynamic state so we can change it elsewhere.\n+  static const VkDynamicState dynamic_states[] = {VK_DYNAMIC_STATE_VIEWPORT,\n+                                                  VK_DYNAMIC_STATE_SCISSOR};\n+  static const VkPipelineDynamicStateCreateInfo dynamic_state = {\n+      VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, nullptr,\n+      0,                                            // VkPipelineDynamicStateCreateFlags    flags\n+      static_cast<u32>(ArraySize(dynamic_states)),  // uint32_t dynamicStateCount\n+      dynamic_states  // const VkDynamicState*                pDynamicStates\n+  };\n+\n+  // Combine to full pipeline info structure.\n+  VkGraphicsPipelineCreateInfo pipeline_info = {\n+      VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,\n+      nullptr,                // VkStructureType sType\n+      0,                      // VkPipelineCreateFlags                            flags\n+      num_shader_stages,      // uint32_t                                         stageCount\n+      shader_stages,          // const VkPipelineShaderStageCreateInfo*           pStages\n+      &vertex_input_state,    // const VkPipelineVertexInputStateCreateInfo*      pVertexInputState\n+      &input_assembly_state,  // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState\n+      nullptr,                // const VkPipelineTessellationStateCreateInfo*     pTessellationState\n+      &viewport_state,        // const VkPipelineViewportStateCreateInfo*         pViewportState\n+      &rasterization_state,  // const VkPipelineRasterizationStateCreateInfo*    pRasterizationState\n+      &multisample_state,    // const VkPipelineMultisampleStateCreateInfo*      pMultisampleState\n+      &depth_stencil_state,  // const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState\n+      &blend_state,          // const VkPipelineColorBlendStateCreateInfo*       pColorBlendState\n+      &dynamic_state,        // const VkPipelineDynamicStateCreateInfo*          pDynamicState\n+      info.pipeline_layout,  // VkPipelineLayout                                 layout\n+      info.render_pass,      // VkRenderPass                                     renderPass\n+      0,                     // uint32_t                                         subpass\n+      VK_NULL_HANDLE,        // VkPipeline                                       basePipelineHandle\n+      -1                     // int32_t                                          basePipelineIndex\n+  };\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateGraphicsPipelines(g_vulkan_context->GetDevice(), m_pipeline_cache, 1,\n+                                           &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateGraphicsPipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetPipeline(const PipelineInfo& info)\n+{\n+  return GetPipelineWithCacheResult(info).first;\n+}\n+\n+std::pair<VkPipeline, bool> ShaderCache::GetPipelineWithCacheResult(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+  {\n+    // If it\'s background compiling, ignore it, and recompile it synchronously.\n+    if (!iter->second.second)\n+      return std::make_pair(iter->second.first, true);\n+    else\n+      m_pipeline_objects.erase(iter);\n+  }\n+\n+  VkPipeline pipeline = CreatePipeline(info);\n+  m_pipeline_objects.emplace(info, std::make_pair(pipeline, false));\n+  _assert_(pipeline != VK_NULL_HANDLE);\n+  return {pipeline, false};\n+}\n+\n+std::pair<std::pair<VkPipeline, bool>, bool>\n+ShaderCache::GetPipelineWithCacheResultAsync(const PipelineInfo& info)\n+{\n+  auto iter = m_pipeline_objects.find(info);\n+  if (iter != m_pipeline_objects.end())\n+    return std::make_pair(iter->second, true);\n+\n+  // Kick a job off.\n+  m_async_shader_compiler->QueueWorkItem(\n+      m_async_shader_compiler->CreateWorkItem<PipelineCompilerWorkItem>(info));\n+  m_pipeline_objects.emplace(info, std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true));\n+  return std::make_pair(std::make_pair(static_cast<VkPipeline>(VK_NULL_HANDLE), true), false);\n+}\n+\n+VkPipeline ShaderCache::CreateComputePipeline(const ComputePipelineInfo& info)\n+{\n+  VkComputePipelineCreateInfo pipeline_info = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,\n+                                               nullptr,\n+                                               0,\n+                                               {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n+                                                nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT, info.cs,\n+                                                "main", nullptr},\n+                                               info.pipeline_layout,\n+                                               VK_NULL_HANDLE,\n+                                               -1};\n+\n+  VkPipeline pipeline;\n+  VkResult res = vkCreateComputePipelines(g_vulkan_context->GetDevice(), VK_NULL_HANDLE, 1,\n+                                          &pipeline_info, nullptr, &pipeline);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkCreateComputePipelines failed: ");\n+    return VK_NULL_HANDLE;\n+  }\n+\n+  return pipeline;\n+}\n+\n+VkPipeline ShaderCache::GetComputePipeline(const ComputePipelineInfo& info)\n+{\n+  auto iter = m_compute_pipeline_objects.find(info);\n+  if (iter != m_compute_pipeline_objects.end())\n+    return iter->second;\n+\n+  VkPipeline pipeline = CreateComputePipeline(info);\n+  m_compute_pipeline_objects.emplace(info, pipeline);\n+  return pipeline;\n+}\n+\n+void ShaderCache::ClearPipelineCache()\n+{\n+  // TODO: Stop any async compiling happening.\n+  for (const auto& it : m_pipeline_objects)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  m_pipeline_objects.clear();\n+\n+  for (const auto& it : m_compute_pipeline_objects)\n+  {\n+    if (it.second != VK_NULL_HANDLE)\n+      vkDestroyPipeline(g_vulkan_context->GetDevice(), it.second, nullptr);\n+  }\n+  m_compute_pipeline_objects.clear();\n+}\n+\n+class PipelineCacheReadCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  PipelineCacheReadCallback(std::vector<u8>* data) : m_data(data) {}\n+  void Read(const u32& key, const u8* value, u32 value_size) override\n+  {\n+    m_data->resize(value_size);\n+    if (value_size > 0)\n+      memcpy(m_data->data(), value, value_size);\n+  }\n+\n+private:\n+  std::vector<u8>* m_data;\n+};\n+\n+class PipelineCacheReadIgnoreCallback : public LinearDiskCacheReader<u32, u8>\n+{\n+public:\n+  void Read(const u32& key, const u8* value, u32 value_size) override {}\n+};\n+\n+bool ShaderCache::CreatePipelineCache()\n+{\n+  // Vulkan pipeline caches can be shared between games for shader compile time reduction.\n+  // This assumes that drivers don\'t create all pipelines in the cache on load time, only\n+  // when a lookup occurs that matches a pipeline (or pipeline data) in the cache.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      0,                                             // size_t                     initialDataSize\n+      nullptr                                        // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed: ");\n+  return false;\n+}\n+\n+bool ShaderCache::LoadPipelineCache()\n+{\n+  // We have to keep the pipeline cache file name around since when we save it\n+  // we delete the old one, by which time the game\'s unique ID is already cleared.\n+  m_pipeline_cache_filename = GetDiskShaderCacheFileName(APIType::Vulkan, "Pipeline", false, true);\n+\n+  std::vector<u8> disk_data;\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadCallback read_callback(&disk_data);\n+  if (disk_cache.OpenAndRead(m_pipeline_cache_filename, read_callback) != 1)\n+    disk_data.clear();\n+\n+  if (!disk_data.empty() && !ValidatePipelineCache(disk_data.data(), disk_data.size()))\n+  {\n+    // Don\'t use this data. In fact, we should delete it to prevent it from being used next time.\n+    File::Delete(m_pipeline_cache_filename);\n+    return CreatePipelineCache();\n+  }\n+\n+  VkPipelineCacheCreateInfo info = {\n+      VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,  // VkStructureType            sType\n+      nullptr,                                       // const void*                pNext\n+      0,                                             // VkPipelineCacheCreateFlags flags\n+      disk_data.size(),                              // size_t                     initialDataSize\n+      disk_data.data()                               // const void*                pInitialData\n+  };\n+\n+  VkResult res =\n+      vkCreatePipelineCache(g_vulkan_context->GetDevice(), &info, nullptr, &m_pipeline_cache);\n+  if (res == VK_SUCCESS)\n+    return true;\n+\n+  // Failed to create pipeline cache, try with it empty.\n+  LOG_VULKAN_ERROR(res, "vkCreatePipelineCache failed, trying empty cache: ");\n+  return CreatePipelineCache();\n+}\n+\n+// Based on Vulkan 1.0 specification,\n+// Table 9.1. Layout for pipeline cache header version VK_PIPELINE_CACHE_HEADER_VERSION_ONE\n+// NOTE: This data is assumed to be in little-endian format.\n+#pragma pack(push, 4)\n+struct VK_PIPELINE_CACHE_HEADER\n+{\n+  u32 header_length;\n+  u32 header_version;\n+  u32 vendor_id;\n+  u32 device_id;\n+  u8 uuid[VK_UUID_SIZE];\n+};\n+#pragma pack(pop)\n+// TODO: Remove the #if here when GCC 5 is a minimum build requirement.\n+#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5\n+static_assert(std::has_trivial_copy_constructor<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#else\n+static_assert(std::is_trivially_copyable<VK_PIPELINE_CACHE_HEADER>::value,\n+              "VK_PIPELINE_CACHE_HEADER must be trivially copyable");\n+#endif\n+\n+bool ShaderCache::ValidatePipelineCache(const u8* data, size_t data_length)\n+{\n+  if (data_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header");\n+    return false;\n+  }\n+\n+  VK_PIPELINE_CACHE_HEADER header;\n+  std::memcpy(&header, data, sizeof(header));\n+  if (header.header_length < sizeof(VK_PIPELINE_CACHE_HEADER))\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header length");\n+    return false;\n+  }\n+\n+  if (header.header_version != VK_PIPELINE_CACHE_HEADER_VERSION_ONE)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Invalid header version");\n+    return false;\n+  }\n+\n+  if (header.vendor_id != g_vulkan_context->GetDeviceProperties().vendorID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect vendor ID (file: 0x%X, device: 0x%X)",\n+              header.vendor_id, g_vulkan_context->GetDeviceProperties().vendorID);\n+    return false;\n+  }\n+\n+  if (header.device_id != g_vulkan_context->GetDeviceProperties().deviceID)\n+  {\n+    ERROR_LOG(VIDEO,\n+              "Pipeline cache failed validation: Incorrect device ID (file: 0x%X, device: 0x%X)",\n+              header.device_id, g_vulkan_context->GetDeviceProperties().deviceID);\n+    return false;\n+  }\n+\n+  if (std::memcmp(header.uuid, g_vulkan_context->GetDeviceProperties().pipelineCacheUUID,\n+                  VK_UUID_SIZE) != 0)\n+  {\n+    ERROR_LOG(VIDEO, "Pipeline cache failed validation: Incorrect UUID");\n+    return false;\n+  }\n+\n+  return true;\n+}\n+\n+void ShaderCache::DestroyPipelineCache()\n+{\n+  ClearPipelineCache();\n+  vkDestroyPipelineCache(g_vulkan_context->GetDevice(), m_pipeline_cache, nullptr);\n+  m_pipeline_cache = VK_NULL_HANDLE;\n+}\n+\n+void ShaderCache::SavePipelineCache()\n+{\n+  size_t data_size;\n+  VkResult res =\n+      vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size, nullptr);\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  std::vector<u8> data(data_size);\n+  res = vkGetPipelineCacheData(g_vulkan_context->GetDevice(), m_pipeline_cache, &data_size,\n+                               data.data());\n+  if (res != VK_SUCCESS)\n+  {\n+    LOG_VULKAN_ERROR(res, "vkGetPipelineCacheData failed: ");\n+    return;\n+  }\n+\n+  // Delete the old cache and re-create.\n+  File::Delete(m_pipeline_cache_filename);\n+\n+  // We write a single key of 1, with the entire pipeline cache data.\n+  // Not ideal, but our disk cache class does not support just writing a single blob\n+  // of data without specifying a key.\n+  LinearDiskCache<u32, u8> disk_cache;\n+  PipelineCacheReadIgnoreCallback callback;\n+  disk_cache.OpenAndRead(m_pipeline_cache_filename, callback);\n+  disk_cache.Append(1, data.data(), static_cast<u32>(data.size()));\n+  disk_cache.Close();\n+}\n+\n+// Cache inserter that is called back when reading from the file\n+template <typename Uid>\n+struct ShaderCacheReader : public LinearDiskCacheReader<Uid, u32>\n+{\n+  ShaderCacheReader(std::map<Uid, std::pair<VkShaderModule, bool>>& shader_map)\n+      : m_shader_map(shader_map)\n+  {\n+  }\n+  void Read(const Uid& key, const u32* value, u32 value_size) override\n+  {\n+    // We don\'t insert null modules into the shader map since creation could succeed later on.\n+    // e.g. we\'re generating bad code, but fix this in a later version, and for some reason\n+    // the cache is not invalidated.\n+    VkShaderModule module = Util::CreateShaderModule(value, value_size);\n+    if (module == VK_NULL_HANDLE)\n+      return;\n+\n+    m_shader_map.emplace(key, std::make_pair(module, false));\n+  }\n+\n+  std::map<Uid, std::pair<VkShaderModule, bool>>& m_shader_map;\n+};\n+\n+void ShaderCache::LoadShaderCaches()\n+{\n+  ShaderCacheReader<VertexShaderUid> vs_reader(m_vs_cache.shader_map);\n+  m_vs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "VS", true, true),\n+                                    vs_reader);\n+\n+  ShaderCacheReader<PixelShaderUid> ps_reader(m_ps_cache.shader_map);\n+  m_ps_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "PS", true, true),\n+                                    ps_reader);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+  {\n+    ShaderCacheReader<GeometryShaderUid> gs_reader(m_gs_cache.shader_map);\n+    m_gs_cache.disk_cache.OpenAndRead(GetDiskShaderCacheFileName(APIType::Vulkan, "GS", true, true),\n+                                      gs_reader);\n+  }\n+\n+  ShaderCacheReader<UberShader::VertexShaderUid> uber_vs_reader(m_uber_vs_cache.shader_map);\n+  m_uber_vs_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberVS", false, true), uber_vs_reader);\n+  ShaderCacheReader<UberShader::PixelShaderUid> uber_ps_reader(m_uber_ps_cache.shader_map);\n+  m_uber_ps_cache.disk_cache.OpenAndRead(\n+      GetDiskShaderCacheFileName(APIType::Vulkan, "UberPS", false, true), uber_ps_reader);\n+\n+  SETSTAT(stats.numPixelShadersCreated, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numPixelShadersAlive, static_cast<int>(m_ps_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersCreated, static_cast<int>(m_vs_cache.shader_map.size()));\n+  SETSTAT(stats.numVertexShadersAlive, static_cast<int>(m_vs_cache.shader_map.size()));\n+}\n+\n+template <typename T>\n+static void DestroyShaderCache(T& cache)\n+{\n+  cache.disk_cache.Sync();\n+  cache.disk_cache.Close();\n+  for (const auto& it : cache.shader_map)\n+  {\n+    if (it.second.first != VK_NULL_HANDLE)\n+      vkDestroyShaderModule(g_vulkan_context->GetDevice(), it.second.first, nullptr);\n+  }\n+  cache.shader_map.clear();\n+}\n+\n+void ShaderCache::DestroyShaderCaches()\n+{\n+  DestroyShaderCache(m_vs_cache);\n+  DestroyShaderCache(m_ps_cache);\n+\n+  if (g_vulkan_context->SupportsGeometryShaders())\n+    DestroyShaderCache(m_gs_cache);\n+\n+  DestroyShaderCache(m_uber_vs_cache);\n+  DestroyShaderCache(m_uber_ps_cache);\n+\n+  SETSTAT(stats.numPixelShadersCreated, 0);\n+  SETSTAT(stats.numPixelShadersAlive, 0);\n+  SETSTAT(stats.numVertexShadersCreated, 0);\n+  SETSTAT(stats.numVertexShadersAlive, 0);\n+}\n+\n+VkShaderModule ShaderCache::GetVertexShaderForUid(const VertexShaderUid& uid)', 'created_at': '2017-07-27T04:10:37Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129750120', 'position': 744, 'pull_request_review_id': 52553946, 'updated_at': '2017-07-27T04:10:37Z', 'id': 129750120, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 744, 'body': "Not sure if it'd be worth it but in the future we could merge these variants into one function with the following parameters:  map, uid, and a enum stating type.  We could then call the appropriate function based on that type (or just pass in a functor?).", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129750120', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129750120'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129750120'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '342719ebbe0b84d5a46f9962ff5632b2f11b47cd', 'path': 'Source/Core/VideoBackends/Vulkan/ShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-07-27T03:55:16.583829	{'pr_title': 'Ubershaders 2.0', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52552712', 'comments': [{'commit_id': '8e7c40f3a84b8af83c6283d6464d946d129d2f77', 'diff_hunk': '@@ -502,88 +605,253 @@ void ProgramShaderCache::Init()\n   // Then once more to get bytes\n   s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH);\n \n-  // Read our shader cache, only if supported and enabled\n-  if (g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache)\n+  // The GPU shader code appears to be context-specific on Mesa/i965.\n+  // This means that if we compiled the ubershaders asynchronously, they will be recompiled\n+  // on the main thread the first time they are used, causing stutter. Nouveau has been\n+  // reported to crash if draw calls are invoked on the shared context threads. For now,\n+  // disable asynchronous compilation on Mesa.\n+  if (!DriverDetails::HasBug(DriverDetails::BUG_SHARED_CONTEXT_SHADER_COMPILATION) &&\n+      g_ActiveConfig.GetShaderCompilerThreads() > 0)\n   {\n-    GLint Supported;\n-    glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported);\n-    if (!Supported)\n+    s_async_compiler = std::make_unique<SharedContextAsyncShaderCompiler>();\n+    s_async_compiler->StartWorkerThreads(g_ActiveConfig.GetShaderCompilerThreads());\n+    if (!s_async_compiler->HasWorkerThreads())\n     {\n-      ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So "\n-                       "disable shader cache.");\n-      g_ogl_config.bSupportsGLSLCache = false;\n+      // No point using the async compiler without workers.\n+      s_async_compiler.reset();\n     }\n-    else\n-    {\n-      if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX)))\n-        File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX));\n+  }\n+\n+  // Read our shader cache, only if supported and enabled\n+  if (g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache)\n+    LoadProgramBinaries();\n \n-      std::string cache_filename =\n-          StringFromFormat("%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(),\n-                           SConfig::GetInstance().GetGameID().c_str());\n+  CreateHeader();\n \n-      ProgramShaderCacheInserter inserter;\n-      g_program_disk_cache.OpenAndRead(cache_filename, inserter);\n-    }\n-    SETSTAT(stats.numPixelShadersAlive, pshaders.size());\n+  CurrentProgram = 0;\n+  last_entry = nullptr;\n+  last_uber_entry = nullptr;\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n+}\n+\n+void ProgramShaderCache::RetrieveAsyncShaders()\n+{\n+  if (s_async_compiler)\n+    s_async_compiler->RetrieveWorkItems();\n+}\n+\n+void ProgramShaderCache::Reload()\n+{\n+  if (s_async_compiler)\n+  {\n+    s_async_compiler->WaitUntilCompletion();\n+    s_async_compiler->RetrieveWorkItems();\n   }\n \n-  CreateHeader();\n+  const bool use_cache = g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache;\n+  if (use_cache)\n+    SaveProgramBinaries();\n+\n+  s_program_disk_cache.Close();\n+  s_uber_program_disk_cache.Close();\n+  DestroyShaders();\n+\n+  if (use_cache)\n+    LoadProgramBinaries();\n+\n+  if (g_ActiveConfig.CanPrecompileUberShaders())\n+    PrecompileUberShaders();\n \n+  InvalidateVertexFormat();\n   CurrentProgram = 0;\n   last_entry = nullptr;\n+  last_uber_entry = nullptr;\n+  last_uid = {};\n+  last_uber_uid = {};\n }\n \n void ProgramShaderCache::Shutdown()\n {\n+  if (s_async_compiler)\n+  {\n+    s_async_compiler->WaitUntilCompletion();\n+    s_async_compiler->StopWorkerThreads();\n+    s_async_compiler->RetrieveWorkItems();\n+    s_async_compiler.reset();\n+  }\n+\n   // store all shaders in cache on disk\n-  if (g_ogl_config.bSupportsGLSLCache)\n+  if (g_ogl_config.bSupportsGLSLCache && g_ActiveConfig.bShaderCache)\n+    SaveProgramBinaries();\n+  s_program_disk_cache.Close();\n+  s_uber_program_disk_cache.Close();\n+\n+  InvalidateVertexFormat();\n+  DestroyShaders();\n+  s_buffer.reset();\n+}\n+\n+void ProgramShaderCache::BindVertexFormat(const GLVertexFormat* vertex_format)\n+{\n+  u32 new_VAO = vertex_format ? vertex_format->VAO : 0;\n+  if (s_last_VAO == new_VAO)\n+    return;\n+\n+  glBindVertexArray(new_VAO);\n+  s_last_VAO = new_VAO;\n+}\n+\n+void ProgramShaderCache::InvalidateVertexFormat()\n+{\n+  s_last_VAO = static_cast<u32>(-1);\n+}\n+\n+void ProgramShaderCache::BindLastVertexFormat()\n+{\n+  if (s_last_VAO != static_cast<u32>(-1))\n+    glBindVertexArray(s_last_VAO);\n+  else\n+    glBindVertexArray(0);\n+}\n+\n+GLuint ProgramShaderCache::CreateProgramFromBinary(const u8* value, u32 value_size)\n+{\n+  const u8* binary = value + sizeof(GLenum);\n+  GLint binary_size = value_size - sizeof(GLenum);\n+  GLenum prog_format;\n+  std::memcpy(&prog_format, value, sizeof(GLenum));\n+\n+  GLuint progid = glCreateProgram();\n+  glProgramBinary(progid, prog_format, binary, binary_size);\n+\n+  // TODO: Is it worth using ARB_parallel_shader_compile here?\n+  GLint success;\n+  glGetProgramiv(progid, GL_LINK_STATUS, &success);\n+  if (!success)\n   {\n-    for (auto& entry : pshaders)\n-    {\n-      // Clear any prior error code\n-      glGetError();\n+    glDeleteProgram(progid);\n+    return 0;\n+  }\n \n-      if (entry.second.in_cache)\n-      {\n-        continue;\n-      }\n+  return progid;\n+}\n \n-      GLint link_status = GL_FALSE, delete_status = GL_TRUE, binary_size = 0;\n-      glGetProgramiv(entry.second.shader.glprogid, GL_LINK_STATUS, &link_status);\n-      glGetProgramiv(entry.second.shader.glprogid, GL_DELETE_STATUS, &delete_status);\n-      glGetProgramiv(entry.second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size);\n-      if (glGetError() != GL_NO_ERROR || link_status == GL_FALSE || delete_status == GL_TRUE ||\n-          !binary_size)\n-      {\n-        continue;\n-      }\n+bool ProgramShaderCache::CreateCacheEntryFromBinary(PCacheEntry* entry, const u8* value,\n+                                                    u32 value_size)\n+{\n+  entry->in_cache = true;\n+  entry->pending = false;\n+  entry->shader.glprogid = CreateProgramFromBinary(value, value_size);\n+  if (entry->shader.glprogid == 0)\n+    return false;\n \n-      std::vector<u8> data(binary_size + sizeof(GLenum));\n-      u8* binary = &data[sizeof(GLenum)];\n-      GLenum* prog_format = (GLenum*)&data[0];\n-      glGetProgramBinary(entry.second.shader.glprogid, binary_size, nullptr, prog_format, binary);\n-      if (glGetError() != GL_NO_ERROR)\n-      {\n-        continue;\n-      }\n+  entry->shader.SetProgramVariables();\n+  return true;\n+}\n \n-      g_program_disk_cache.Append(entry.first, &data[0], binary_size + sizeof(GLenum));\n-    }\n+void ProgramShaderCache::LoadProgramBinaries()\n+{\n+  GLint Supported;\n+  glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported);\n+  if (!Supported)\n+  {\n+    ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So "\n+                     "disable shader cache.");\n+    g_ogl_config.bSupportsGLSLCache = false;\n+  }\n+  else\n+  {\n+    // Load game-specific shaders.\n+    std::string cache_filename =\n+        GetDiskShaderCacheFileName(APIType::OpenGL, "ProgramBinaries", true, true);\n+    ProgramShaderCacheInserter<SHADERUID> inserter(pshaders);\n+    s_program_disk_cache.OpenAndRead(cache_filename, inserter);\n+\n+    // Load global ubershaders.\n+    cache_filename =\n+        GetDiskShaderCacheFileName(APIType::OpenGL, "UberProgramBinaries", false, true);\n+    ProgramShaderCacheInserter<UBERSHADERUID> uber_inserter(ubershaders);\n+    s_uber_program_disk_cache.OpenAndRead(cache_filename, uber_inserter);\n+  }\n+  SETSTAT(stats.numPixelShadersAlive, pshaders.size());\n+}\n \n-    g_program_disk_cache.Sync();\n-    g_program_disk_cache.Close();\n+bool ProgramShaderCache::GetProgramBinary(const PCacheEntry& entry, std::vector<u8>& data)\n+{\n+  // Clear any prior error code\n+  glGetError();\n+\n+  GLint link_status = GL_FALSE, delete_status = GL_TRUE, binary_size = 0;\n+  glGetProgramiv(entry.shader.glprogid, GL_LINK_STATUS, &link_status);\n+  glGetProgramiv(entry.shader.glprogid, GL_DELETE_STATUS, &delete_status);\n+  glGetProgramiv(entry.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size);\n+  if (glGetError() != GL_NO_ERROR || link_status == GL_FALSE || delete_status == GL_TRUE ||\n+      binary_size == 0)\n+  {\n+    return false;\n   }\n \n-  glUseProgram(0);\n+  data.resize(binary_size + sizeof(GLenum));\n+\n+  GLsizei length = binary_size;\n+  GLenum prog_format;\n+  glGetProgramBinary(entry.shader.glprogid, binary_size, &length, &prog_format,\n+                     &data[sizeof(GLenum)]);\n+  if (glGetError() != GL_NO_ERROR)\n+    return false;\n+\n+  std::memcpy(&data[0], &prog_format, sizeof(prog_format));\n+  return true;\n+}\n+\n+void ProgramShaderCache::SaveProgramBinaries()\n+{\n+  std::vector<u8> binary_data;\n \n   for (auto& entry : pshaders)', 'created_at': '2017-07-27T03:55:15Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129748900', 'position': 858, 'pull_request_review_id': 52552712, 'updated_at': '2017-07-27T03:55:15Z', 'id': 129748900, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 858, 'body': 'Not sure if there\'s anything in the standard but boost has something that allows you to store the same structure in different "views". ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748900', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r129748900'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/129748900'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '89e592d62f6e3acef0c6927dcdae0540cba64291', 'path': 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'iwubcode', 'pr_id': 5702, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}

Recent 'gh_push' events

2017-07-28T04:20:04.567732	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'author': {'name': 'ligfx', 'username': 'ligfx', 'email': 'ligfx@users.noreply.github.com'}, 'message': 'LogManager: remove stand-alone semicolon\n\nMy bad!', 'modified': ['Source/Core/Common/Logging/LogManager.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'added': [], 'removed': [], 'distinct': True}, {'hash': '41e8a36befe934f25db550db565da011a708050c', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'modified': ['Source/Core/Common/Logging/LogManager.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/41e8a36befe934f25db550db565da011a708050c', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '41e8a36befe934f25db550db565da011a708050c', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-27T19:00:38.498704	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '27924a1e2efa6d5e831fe5286126b7b20b2daa50', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'Qt/Config: Remove unused members', 'modified': ['Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/27924a1e2efa6d5e831fe5286126b7b20b2daa50', 'added': [], 'removed': [], 'distinct': True}, {'hash': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'Helios747@users.noreply.github.com'}, 'message': 'Merge pull request #5833 from leoetlino/unused\n\nQt/Config: Remove unused members', 'modified': ['Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/97ea97564fecac7759e33347ed50d61ad5c5d550', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '6fe33f844f1ad9ca02965f9fb75e752430e2744a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'Helios747'}
2017-07-27T18:58:59.350390	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '8b54ac225b834b172ee46371200d8addbde08021', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Merge Core/Config/Config.h into Common/Config/Config.h\n\nAllows code in Common to take advantage of the layered config logic.', 'modified': ['Source/Core/Common/Config/Config.cpp', 'Source/Core/Common/Config/Config.h', 'Source/Core/Core/BootManager.cpp', 'Source/Core/Core/CMakeLists.txt', 'Source/Core/Core/Config/GraphicsSettings.cpp', 'Source/Core/Core/Config/GraphicsSettings.h', 'Source/Core/Core/ConfigLoaders/BaseConfigLoader.cpp', 'Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp', 'Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp', 'Source/Core/Core/Core.vcxproj', 'Source/Core/Core/Core.vcxproj.filters', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsBool.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsChoice.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsSlider.cpp', 'Source/UnitTests/Core/CoreTimingTest.cpp', 'Source/UnitTests/Core/MMIOTest.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8b54ac225b834b172ee46371200d8addbde08021', 'added': [], 'removed': ['Source/Core/Core/Config/Config.cpp', 'Source/Core/Core/Config/Config.h'], 'distinct': True}, {'hash': 'e6c4455e65be43800950b38af276d2a20907d834', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'remove commented-out FileLogListener::GetName', 'modified': ['Source/Core/Common/Logging/LogManager.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e6c4455e65be43800950b38af276d2a20907d834', 'added': [], 'removed': [], 'distinct': True}, {'hash': '28d6c61e34aeb478d73d440d1aa3faa48b765fa8', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'LogManager: use layered config', 'modified': ['Source/Core/Common/Logging/LogManager.cpp', 'Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp', 'Source/Core/UICommon/UICommon.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/28d6c61e34aeb478d73d440d1aa3faa48b765fa8', 'added': [], 'removed': [], 'distinct': True}, {'hash': '6fe33f844f1ad9ca02965f9fb75e752430e2744a', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'Helios747@users.noreply.github.com'}, 'message': 'Merge pull request #5770 from ligfx/lognewconfig\n\nLogManager: use layered config', 'modified': ['Source/Core/Common/Config/Config.cpp', 'Source/Core/Common/Config/Config.h', 'Source/Core/Common/Logging/LogManager.cpp', 'Source/Core/Core/BootManager.cpp', 'Source/Core/Core/CMakeLists.txt', 'Source/Core/Core/Config/GraphicsSettings.cpp', 'Source/Core/Core/Config/GraphicsSettings.h', 'Source/Core/Core/ConfigLoaders/BaseConfigLoader.cpp', 'Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp', 'Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp', 'Source/Core/Core/Core.vcxproj', 'Source/Core/Core/Core.vcxproj.filters', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsBool.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsChoice.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsSlider.cpp', 'Source/Core/UICommon/UICommon.cpp', 'Source/UnitTests/Core/CoreTimingTest.cpp', 'Source/UnitTests/Core/MMIOTest.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/6fe33f844f1ad9ca02965f9fb75e752430e2744a', 'added': [], 'removed': ['Source/Core/Core/Config/Config.cpp', 'Source/Core/Core/Config/Config.h'], 'distinct': True}], 'after_sha': '6fe33f844f1ad9ca02965f9fb75e752430e2744a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'repo': 'dolphin-emu/dolphin', 'pusher': 'Helios747'}
2017-07-27T07:02:30.669874	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'ee868e2362d09427d6416c52f37dff85bf25a6e1', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'Move the Wiimote connect code out of Host\n\nI don\'t know who thought it would be a good idea to put the Wiimote\nconnect code as part of the Host interface, and have that called\nfrom both the UI code and the core. And then hack around it by having\n"force connect" events whenever Host_ConnectWiimote is called\nfrom the core...', 'modified': ['Source/Android/jni/MainAndroid.cpp', 'Source/Core/Core/HW/Wiimote.cpp', 'Source/Core/Core/HW/Wiimote.h', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp', 'Source/Core/Core/Host.h', 'Source/Core/DolphinNoGUI/MainNoGUI.cpp', 'Source/Core/DolphinQt2/Host.cpp', 'Source/Core/DolphinWX/Frame.cpp', 'Source/Core/DolphinWX/Frame.h', 'Source/Core/DolphinWX/FrameTools.cpp', 'Source/Core/DolphinWX/Globals.h', 'Source/Core/DolphinWX/Main.cpp', 'Source/UnitTests/StubHost.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/ee868e2362d09427d6416c52f37dff85bf25a6e1', 'added': [], 'removed': [], 'distinct': True}, {'hash': '1c33dfc787419d156a5d097fba878f6d09f3c75f', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': "Wiimote: Remove useless disconnections\n\nChangeWiimoteSource does not need to disconnect a Wiimote if it isn't\nconnected.", 'modified': ['Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/1c33dfc787419d156a5d097fba878f6d09f3c75f', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5807 from leoetlino/connect-wiimote\n\nMove the Wiimote connect code out of Host', 'modified': ['Source/Android/jni/MainAndroid.cpp', 'Source/Core/Core/HW/Wiimote.cpp', 'Source/Core/Core/HW/Wiimote.h', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp', 'Source/Core/Core/Host.h', 'Source/Core/DolphinNoGUI/MainNoGUI.cpp', 'Source/Core/DolphinQt2/Host.cpp', 'Source/Core/DolphinWX/Frame.cpp', 'Source/Core/DolphinWX/Frame.h', 'Source/Core/DolphinWX/FrameTools.cpp', 'Source/Core/DolphinWX/Globals.h', 'Source/Core/DolphinWX/Main.cpp', 'Source/UnitTests/StubHost.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '5c29ea54c5413384c4e24bff41d7386f22e7be7e', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-27T07:01:58.786784	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '8deba867e85ec1ac0a13106fb911efd98d24b6d8', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': "DolphinQt2: Remove ellipses from settings menu options\n\nThe action that these menu options perform is to open a\nsettings window, and that action is completed instantly,\nso we shouldn't have ellipses.", 'modified': ['Source/Core/DolphinQt2/MenuBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8deba867e85ec1ac0a13106fb911efd98d24b6d8', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'd7d88aeb7d3c954847640015fd32325c27378c54', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinWX: Mark AF choices as translatable\n\nFor consistency with DolphinQt2.', 'modified': ['Source/Core/DolphinWX/VideoConfigDiag.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d7d88aeb7d3c954847640015fd32325c27378c54', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'fb80c5398ac9a20f2ea277e781d1f347982dfb42', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinWX: Use title case for hotkey group names', 'modified': ['Source/Core/Core/HotkeyManager.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/fb80c5398ac9a20f2ea277e781d1f347982dfb42', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'ce11b34e743cba42886a7d3a9d5c8123580808e5', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Make DolphinQt2 strings more like DolphinWX strings\n\nWithout this, we would be pushing a lot of extra strings onto\ntranslators now that 55fb6ef is merged.', 'modified': ['Source/Core/DolphinQt2/AboutDialog.cpp', 'Source/Core/DolphinQt2/Config/ControllersWindow.cpp', 'Source/Core/DolphinQt2/Config/Graphics/AdvancedWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/EnhancementsWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GeneralWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/SoftwareRendererWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/SoftwareRendererWidget.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.cpp', 'Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuExtension.cpp', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameListModel.cpp', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/Settings/GeneralPane.cpp', 'Source/Core/DolphinQt2/Settings/InterfacePane.cpp', 'Source/Core/DolphinQt2/Settings/PathPane.cpp', 'Source/Core/DolphinQt2/ToolBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/ce11b34e743cba42886a7d3a9d5c8123580808e5', 'added': [], 'removed': [], 'distinct': True}, {'hash': '960525859bf226445c75b96541e495c14b5e46ba', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': "Make DolphinWX strings more like DolphinQt2 strings\n\nSame as the previous commit, except I'm copying strings\nin the other direction because the DolphinWX variants\nof these strings could use some improvement.", 'modified': ['Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.cpp', 'Source/Core/DolphinWX/Config/GCAdapterConfigDiag.cpp', 'Source/Core/DolphinWX/Config/GeneralConfigPane.cpp', 'Source/Core/DolphinWX/Config/InterfaceConfigPane.cpp', 'Source/Core/DolphinWX/VideoConfigDiag.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/960525859bf226445c75b96541e495c14b5e46ba', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'b32fe5e41d59e49d55b62704a8ff8b10d1e40c96', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Remove the %1 from "%1 Banner Details"\n\nIt\'s not particularily useful to list the platform here,\nand these kinds of messages that use words as parameters\nare more likely to be mistranslated than the average string.', 'modified': ['Source/Core/DolphinQt2/Config/InfoWidget.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/b32fe5e41d59e49d55b62704a8ff8b10d1e40c96', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'de6bd80f9c4deca136b2b6f560e17340605fed9e', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Add i18n comments for Table/List\n\nTo avoid confusion with the verb "list" and the kind of table\nthat\'s a type of furniture.', 'modified': ['Source/Core/DolphinQt2/MenuBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/de6bd80f9c4deca136b2b6f560e17340605fed9e', 'added': [], 'removed': [], 'distinct': True}, {'hash': '5c29ea54c5413384c4e24bff41d7386f22e7be7e', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5817 from JosJuice/qt-strings-match-wx\n\nMake DolphinQt2 strings more like DolphinWX strings', 'modified': ['Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.cpp', 'Source/Core/Core/HotkeyManager.cpp', 'Source/Core/DolphinQt2/AboutDialog.cpp', 'Source/Core/DolphinQt2/Config/ControllersWindow.cpp', 'Source/Core/DolphinQt2/Config/Graphics/AdvancedWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/EnhancementsWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GeneralWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/SoftwareRendererWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/SoftwareRendererWidget.h', 'Source/Core/DolphinQt2/Config/InfoWidget.cpp', 'Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.cpp', 'Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuExtension.cpp', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameListModel.cpp', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/Settings/GeneralPane.cpp', 'Source/Core/DolphinQt2/Settings/InterfacePane.cpp', 'Source/Core/DolphinQt2/Settings/PathPane.cpp', 'Source/Core/DolphinQt2/ToolBar.cpp', 'Source/Core/DolphinWX/Config/GCAdapterConfigDiag.cpp', 'Source/Core/DolphinWX/Config/GeneralConfigPane.cpp', 'Source/Core/DolphinWX/Config/InterfaceConfigPane.cpp', 'Source/Core/DolphinWX/VideoConfigDiag.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5c29ea54c5413384c4e24bff41d7386f22e7be7e', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '5c29ea54c5413384c4e24bff41d7386f22e7be7e', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'b140a6eb040109e2bc4e1648b68b5ae6f92ca063', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-27T07:01:31.836667	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '80b938b403fd64c1c6e6beaa3a9baac1387590d6', 'author': {'name': 'Lioncash', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'DolphinQt2: Remove unimplemented prototypes\n\nAlso removes an unnecessary includes in related files', 'modified': ['Source/Core/DolphinQt2/Config/Graphics/GraphicsWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsWidget.h', 'Source/Core/DolphinQt2/Config/Mapping/GCKeyboardEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/IOWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/IOWindow.h', 'Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/MappingWindow.h', 'Source/Core/DolphinQt2/Settings.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/80b938b403fd64c1c6e6beaa3a9baac1387590d6', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'b140a6eb040109e2bc4e1648b68b5ae6f92ca063', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5830 from lioncash/prototypes\n\nDolphinQt2: Remove unimplemented prototypes', 'modified': ['Source/Core/DolphinQt2/Config/Graphics/GraphicsWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsWidget.h', 'Source/Core/DolphinQt2/Config/Mapping/GCKeyboardEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/IOWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/IOWindow.h', 'Source/Core/DolphinQt2/Config/Mapping/MappingWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/MappingWindow.h', 'Source/Core/DolphinQt2/Settings.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/b140a6eb040109e2bc4e1648b68b5ae6f92ca063', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'b140a6eb040109e2bc4e1648b68b5ae6f92ca063', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'bf7c0c80244375a9eafdef8aeee91fac6673a1b2', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-27T07:00:55.313221	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'fb42c3eddcd0a680a892f17a50438cfb9c2e2ff1', 'author': {'name': 'Lioncash', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'DolphinQt2: Add missing include guards', 'modified': ['Source/Core/DolphinQt2/Config/Mapping/GCKeyboardEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadWiiU.h', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuExtension.h', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuGeneral.h', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuMotionControl.h', 'Source/Core/DolphinQt2/GameList/TableProxyModel.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/fb42c3eddcd0a680a892f17a50438cfb9c2e2ff1', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'bf7c0c80244375a9eafdef8aeee91fac6673a1b2', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5831 from lioncash/include\n\nDolphinQt2: Add missing include guards', 'modified': ['Source/Core/DolphinQt2/Config/Mapping/GCKeyboardEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadEmu.h', 'Source/Core/DolphinQt2/Config/Mapping/GCPadWiiU.h', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuExtension.h', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuGeneral.h', 'Source/Core/DolphinQt2/Config/Mapping/WiimoteEmuMotionControl.h', 'Source/Core/DolphinQt2/GameList/TableProxyModel.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/bf7c0c80244375a9eafdef8aeee91fac6673a1b2', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'bf7c0c80244375a9eafdef8aeee91fac6673a1b2', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'a11bde7d167c65bb693e5138e47dd4586683c092', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-27T03:30:40.103611	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '82c27182a8a15903a0082890e6b188435ec957b4', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'ShaderGen: Remove host state from shader uids', 'modified': ['Source/Core/VideoCommon/GeometryShaderGen.cpp', 'Source/Core/VideoCommon/GeometryShaderGen.h', 'Source/Core/VideoCommon/PixelShaderGen.cpp', 'Source/Core/VideoCommon/PixelShaderGen.h', 'Source/Core/VideoCommon/VertexShaderGen.cpp', 'Source/Core/VideoCommon/VertexShaderGen.h', 'Source/Core/VideoCommon/VideoConfig.cpp', 'Source/Core/VideoCommon/VideoConfig.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/82c27182a8a15903a0082890e6b188435ec957b4', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'd1381f5021815c36d2fdd98087b6522c995428cc', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'VideoConfig: Add host config union\n\nContains all host state that can affect shadergen.', 'modified': ['Source/Core/VideoCommon/VideoConfig.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d1381f5021815c36d2fdd98087b6522c995428cc', 'added': [], 'removed': [], 'distinct': True}, {'hash': '62a901508b1fd23eb386a3d108950ab061bbc19a', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'OGL: Reload shader cache when relevant video config changes', 'modified': ['Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp', 'Source/Core/VideoBackends/OGL/ProgramShaderCache.h', 'Source/Core/VideoBackends/OGL/Render.cpp', 'Source/Core/VideoBackends/OGL/Render.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/62a901508b1fd23eb386a3d108950ab061bbc19a', 'added': [], 'removed': [], 'distinct': True}, {'hash': '228ddb8abab02105e02233647834bde2528d9ba9', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'D3D11: Reload shader cache when relevant config changes', 'modified': ['Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp', 'Source/Core/VideoBackends/D3D/GeometryShaderCache.h', 'Source/Core/VideoBackends/D3D/PixelShaderCache.cpp', 'Source/Core/VideoBackends/D3D/PixelShaderCache.h', 'Source/Core/VideoBackends/D3D/Render.cpp', 'Source/Core/VideoBackends/D3D/Render.h', 'Source/Core/VideoBackends/D3D/VertexShaderCache.cpp', 'Source/Core/VideoBackends/D3D/VertexShaderCache.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/228ddb8abab02105e02233647834bde2528d9ba9', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'd9a3b29a0776ef64e33883bdd7aef237c31ff7da', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'Vulkan: Emit input/output locations for EFB poke geometry shader', 'modified': ['Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d9a3b29a0776ef64e33883bdd7aef237c31ff7da', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'a8343cc19a3728d4a44c279dff167503a6eaecfc', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': "Vulkan: Don't save pipeline cache if shader cache is disabled\n\nWe still create a pipeline cache object, since that speeds up driver's\ncreation of pipelines at runtime. However, we should not save it.", 'modified': ['Source/Core/VideoBackends/Vulkan/ObjectCache.cpp', 'Source/Core/VideoBackends/Vulkan/ObjectCache.h', 'Source/Core/VideoBackends/Vulkan/main.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/a8343cc19a3728d4a44c279dff167503a6eaecfc', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'b380f292b47c8b1a3e1711a665a3469074715485', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'Vulkan: Reload pipeline cache when relevant host config changes', 'modified': ['Source/Core/VideoBackends/Vulkan/ObjectCache.cpp', 'Source/Core/VideoBackends/Vulkan/ObjectCache.h', 'Source/Core/VideoBackends/Vulkan/Renderer.cpp', 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp', 'Source/Core/VideoBackends/Vulkan/StateTracker.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/b380f292b47c8b1a3e1711a665a3469074715485', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7c5bbafdd119e3b8975d7b49411dd89e7770baab', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': "Vulkan: Don't save/load pipeline UID cache when shader cache is disabled", 'modified': ['Source/Core/VideoBackends/Vulkan/StateTracker.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7c5bbafdd119e3b8975d7b49411dd89e7770baab', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'd01b0bf60fba2101e45cfac1e5747edcdbab5fc1', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'VideoCommon: Move shader cache filename generation to common', 'modified': ['Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp', 'Source/Core/VideoBackends/D3D/PixelShaderCache.cpp', 'Source/Core/VideoBackends/D3D/VertexShaderCache.cpp', 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp', 'Source/Core/VideoBackends/Vulkan/ObjectCache.cpp', 'Source/Core/VideoBackends/Vulkan/ObjectCache.h', 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp', 'Source/Core/VideoCommon/VideoConfig.cpp', 'Source/Core/VideoCommon/VideoConfig.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d01b0bf60fba2101e45cfac1e5747edcdbab5fc1', 'added': [], 'removed': [], 'distinct': True}, {'hash': '3ea9d86faa2544b8c1c235db9456f271baf42fec', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@gmail.com'}, 'message': 'ShaderGen: Pass host config to shader generation functions\n\nAlso moves the host config checks to common.', 'modified': ['Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp', 'Source/Core/VideoBackends/D3D/PixelShaderCache.cpp', 'Source/Core/VideoBackends/D3D/Render.cpp', 'Source/Core/VideoBackends/D3D/Render.h', 'Source/Core/VideoBackends/D3D/VertexShaderCache.cpp', 'Source/Core/VideoBackends/Null/ShaderCache.h', 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp', 'Source/Core/VideoBackends/OGL/Render.cpp', 'Source/Core/VideoBackends/OGL/Render.h', 'Source/Core/VideoBackends/Vulkan/ObjectCache.cpp', 'Source/Core/VideoBackends/Vulkan/Renderer.cpp', 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp', 'Source/Core/VideoCommon/CMakeLists.txt', 'Source/Core/VideoCommon/GeometryShaderGen.cpp', 'Source/Core/VideoCommon/GeometryShaderGen.h', 'Source/Core/VideoCommon/PixelShaderGen.cpp', 'Source/Core/VideoCommon/PixelShaderGen.h', 'Source/Core/VideoCommon/RenderBase.cpp', 'Source/Core/VideoCommon/RenderBase.h', 'Source/Core/VideoCommon/ShaderGenCommon.h', 'Source/Core/VideoCommon/VertexShaderGen.cpp', 'Source/Core/VideoCommon/VertexShaderGen.h', 'Source/Core/VideoCommon/VideoCommon.vcxproj', 'Source/Core/VideoCommon/VideoCommon.vcxproj.filters', 'Source/Core/VideoCommon/VideoConfig.cpp', 'Source/Core/VideoCommon/VideoConfig.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3ea9d86faa2544b8c1c235db9456f271baf42fec', 'added': ['Source/Core/VideoCommon/ShaderGenCommon.cpp'], 'removed': [], 'distinct': True}, {'hash': 'a11bde7d167c65bb693e5138e47dd4586683c092', 'author': {'name': 'Stenzek', 'username': 'stenzek', 'email': 'stenzek@users.noreply.github.com'}, 'message': 'Merge pull request #5679 from stenzek/no-host-state-in-uids\n\nShaderGen: Decouple host state from shader UIDs', 'modified': ['Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp', 'Source/Core/VideoBackends/D3D/GeometryShaderCache.h', 'Source/Core/VideoBackends/D3D/PixelShaderCache.cpp', 'Source/Core/VideoBackends/D3D/PixelShaderCache.h', 'Source/Core/VideoBackends/D3D/Render.cpp', 'Source/Core/VideoBackends/D3D/VertexShaderCache.cpp', 'Source/Core/VideoBackends/D3D/VertexShaderCache.h', 'Source/Core/VideoBackends/Null/ShaderCache.h', 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp', 'Source/Core/VideoBackends/OGL/ProgramShaderCache.h', 'Source/Core/VideoBackends/OGL/Render.cpp', 'Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp', 'Source/Core/VideoBackends/Vulkan/ObjectCache.cpp', 'Source/Core/VideoBackends/Vulkan/ObjectCache.h', 'Source/Core/VideoBackends/Vulkan/Renderer.cpp', 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp', 'Source/Core/VideoBackends/Vulkan/StateTracker.h', 'Source/Core/VideoBackends/Vulkan/main.cpp', 'Source/Core/VideoCommon/CMakeLists.txt', 'Source/Core/VideoCommon/GeometryShaderGen.cpp', 'Source/Core/VideoCommon/GeometryShaderGen.h', 'Source/Core/VideoCommon/PixelShaderGen.cpp', 'Source/Core/VideoCommon/PixelShaderGen.h', 'Source/Core/VideoCommon/RenderBase.cpp', 'Source/Core/VideoCommon/RenderBase.h', 'Source/Core/VideoCommon/ShaderGenCommon.h', 'Source/Core/VideoCommon/VertexShaderGen.cpp', 'Source/Core/VideoCommon/VertexShaderGen.h', 'Source/Core/VideoCommon/VideoCommon.vcxproj', 'Source/Core/VideoCommon/VideoCommon.vcxproj.filters', 'Source/Core/VideoCommon/VideoConfig.cpp', 'Source/Core/VideoCommon/VideoConfig.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/a11bde7d167c65bb693e5138e47dd4586683c092', 'added': ['Source/Core/VideoCommon/ShaderGenCommon.cpp'], 'removed': [], 'distinct': True}], 'after_sha': 'a11bde7d167c65bb693e5138e47dd4586683c092', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '10db1bcbca947a56e872ed4b6625d9d3de31b298', 'repo': 'dolphin-emu/dolphin', 'pusher': 'stenzek'}
2017-07-26T04:56:10.741358	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '734c9e1459d50358118bac5585ba4035c1318679', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'QtUtils: add QueueOnObject', 'modified': [], 'url': 'https://github.com/dolphin-emu/dolphin/commit/734c9e1459d50358118bac5585ba4035c1318679', 'added': ['Source/Core/DolphinQt2/QtUtils/QueueOnObject.h'], 'removed': [], 'distinct': True}, {'hash': '2c03cfacc2d7a76b54e315c957b7ce39e09dad13', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Qt WiiUpdate: use QueueOnObject instead of Core::QueueHostJob', 'modified': ['Source/Core/DolphinQt2/WiiUpdate.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/2c03cfacc2d7a76b54e315c957b7ce39e09dad13', 'added': [], 'removed': [], 'distinct': True}, {'hash': '10db1bcbca947a56e872ed4b6625d9d3de31b298', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5828 from ligfx/qtqueueonobject\n\nQt: add QueueOnObject', 'modified': ['Source/Core/DolphinQt2/WiiUpdate.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/10db1bcbca947a56e872ed4b6625d9d3de31b298', 'added': ['Source/Core/DolphinQt2/QtUtils/QueueOnObject.h'], 'removed': [], 'distinct': True}], 'after_sha': '10db1bcbca947a56e872ed4b6625d9d3de31b298', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'be8324380de0d81e855834f8c69f12b7de3bf801', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-26T04:02:15.969412	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'df35a26628fae6cfc874f31f04af799a6c199198', 'author': {'name': 'Christian Murphy', 'email': 'cfm.work@googlemail.com'}, 'message': 'Qt: Implement Show Platforms / Show Regions\n\nPorting the View config logic from WX to Qt.\nAdds to the View Menu', 'modified': ['Source/Core/DolphinQt2/CMakeLists.txt', 'Source/Core/DolphinQt2/DolphinQt2.vcxproj', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameList.h', 'Source/Core/DolphinQt2/GameList/GameListModel.cpp', 'Source/Core/DolphinQt2/GameList/GameListModel.h', 'Source/Core/DolphinQt2/GameList/ListProxyModel.cpp', 'Source/Core/DolphinQt2/GameList/ListProxyModel.h', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/df35a26628fae6cfc874f31f04af799a6c199198', 'added': ['Source/Core/DolphinQt2/GameList/TableProxyModel.cpp', 'Source/Core/DolphinQt2/GameList/TableProxyModel.h'], 'removed': [], 'distinct': True}, {'hash': 'be8324380de0d81e855834f8c69f12b7de3bf801', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5786 from grimpunch/qt_viewoptions\n\nQt: Implement Show Platforms / Show Regions', 'modified': ['Source/Core/DolphinQt2/CMakeLists.txt', 'Source/Core/DolphinQt2/DolphinQt2.vcxproj', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameList.h', 'Source/Core/DolphinQt2/GameList/GameListModel.cpp', 'Source/Core/DolphinQt2/GameList/GameListModel.h', 'Source/Core/DolphinQt2/GameList/ListProxyModel.cpp', 'Source/Core/DolphinQt2/GameList/ListProxyModel.h', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/be8324380de0d81e855834f8c69f12b7de3bf801', 'added': ['Source/Core/DolphinQt2/GameList/TableProxyModel.cpp', 'Source/Core/DolphinQt2/GameList/TableProxyModel.h'], 'removed': [], 'distinct': True}], 'after_sha': 'be8324380de0d81e855834f8c69f12b7de3bf801', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '8292d378ea0dc91eca501f417409a5199a46bd18', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-25T06:23:52.923675	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '73734748887ba4bc254658d496e0897e8f333707', 'author': {'name': 'Lioncash', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'ListProxyModel: Add missing include guard', 'modified': ['Source/Core/DolphinQt2/GameList/ListProxyModel.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/73734748887ba4bc254658d496e0897e8f333707', 'added': [], 'removed': [], 'distinct': True}, {'hash': '8292d378ea0dc91eca501f417409a5199a46bd18', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Merge pull request #5824 from lioncash/include-guard\n\nListProxyModel: Add missing include guard', 'modified': ['Source/Core/DolphinQt2/GameList/ListProxyModel.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8292d378ea0dc91eca501f417409a5199a46bd18', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '8292d378ea0dc91eca501f417409a5199a46bd18', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '63f1f122fabec3d7a244acb24a8f9013ddea74c6', 'repo': 'dolphin-emu/dolphin', 'pusher': 'JosJuice'}
2017-07-24T23:48:21.954666	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'a365686956297efad1bc4fa7964ccadbf0be9353', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'GameList: fix Decompress slot typo\n\nThere is no such `DecompressISO` slot.', 'modified': ['Source/Core/DolphinQt2/GameList/GameList.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/a365686956297efad1bc4fa7964ccadbf0be9353', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'f0fd38698e8ab5c0c2e8277f23aa39a4c4934050', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'DolphinQt2: use new connection syntax instead of old syntax', 'modified': ['Source/Core/DolphinQt2/Config/InfoWidget.cpp', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/ToolBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/f0fd38698e8ab5c0c2e8277f23aa39a4c4934050', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'aafb61c1879a11e0ad906a85b0577930258ed1b4', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': "DolphinQt2: Remove 'slots:' syntax from headers\n\nWith Qt5's new connection syntax, method pointers and functors are\nconnected directly. There's no need to declare slots.", 'modified': ['Source/Core/DolphinQt2/Config/InfoWidget.h', 'Source/Core/DolphinQt2/GameList/GameList.h', 'Source/Core/DolphinQt2/GameList/GameListModel.h', 'Source/Core/DolphinQt2/GameList/GameTracker.h', 'Source/Core/DolphinQt2/Host.h', 'Source/Core/DolphinQt2/MainWindow.h', 'Source/Core/DolphinQt2/MenuBar.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/aafb61c1879a11e0ad906a85b0577930258ed1b4', 'added': [], 'removed': [], 'distinct': True}, {'hash': '63f1f122fabec3d7a244acb24a8f9013ddea74c6', 'author': {'name': 'Mat M', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'Merge pull request #5729 from ligfx/qtremoveoldsyntax\n\nDolphinQt2: update old SLOT/SIGNAL syntax', 'modified': ['Source/Core/DolphinQt2/Config/InfoWidget.cpp', 'Source/Core/DolphinQt2/Config/InfoWidget.h', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameList.h', 'Source/Core/DolphinQt2/GameList/GameListModel.h', 'Source/Core/DolphinQt2/GameList/GameTracker.h', 'Source/Core/DolphinQt2/Host.h', 'Source/Core/DolphinQt2/MainWindow.h', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h', 'Source/Core/DolphinQt2/ToolBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/63f1f122fabec3d7a244acb24a8f9013ddea74c6', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '63f1f122fabec3d7a244acb24a8f9013ddea74c6', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '8eb1ddcea8b0ab3798d3e4e50f3e8f17913b5f99', 'repo': 'dolphin-emu/dolphin', 'pusher': 'lioncash'}
2017-07-24T07:30:49.862723	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'a9aabc398a9ee8d267d51914ad600eaf2059a2e1', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Update game INIs\n\nhttps://bugs.dolphin-emu.org/issues/10171\nhttps://bugs.dolphin-emu.org/issues/10207\nhttps://bugs.dolphin-emu.org/issues/10336\nhttps://bugs.dolphin-emu.org/issues/10355\nhttps://bugs.dolphin-emu.org/issues/10370\nhttps://github.com/dolphin-emu/dolphin/pull/5726#discussion_r126879253', 'modified': ['Data/Sys/GameSettings/G5S.ini', 'Data/Sys/GameSettings/G8M.ini', 'Data/Sys/GameSettings/GED.ini', 'Data/Sys/GameSettings/GUT.ini'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/a9aabc398a9ee8d267d51914ad600eaf2059a2e1', 'added': ['Data/Sys/GameSettings/R55.ini', 'Data/Sys/GameSettings/R59.ini'], 'removed': [], 'distinct': True}, {'hash': '8eb1ddcea8b0ab3798d3e4e50f3e8f17913b5f99', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5760 from JosJuice/game-inis-2017-07-07\n\nUpdate game INIs', 'modified': ['Data/Sys/GameSettings/G5S.ini', 'Data/Sys/GameSettings/G8M.ini', 'Data/Sys/GameSettings/GED.ini', 'Data/Sys/GameSettings/GUT.ini'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8eb1ddcea8b0ab3798d3e4e50f3e8f17913b5f99', 'added': ['Data/Sys/GameSettings/R55.ini', 'Data/Sys/GameSettings/R59.ini'], 'removed': [], 'distinct': True}], 'after_sha': '8eb1ddcea8b0ab3798d3e4e50f3e8f17913b5f99', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'c27dd9dc20a216bcb604b2aff619d21f41d4c162', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-24T06:03:35.520908	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'c759739ee9ec9f577c524a7b48116ac933e91623', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': "SysConf: Handle array entries properly\n\nIt turns out that the last byte of array entries isn't unused (as we\nthought); instead, it looks like it's actually part of the main data,\nand the length stored next to the name is in fact the length minus one.\n\nGetting it wrong and always storing a null byte in there won't affect\nmost entries (since the last byte is zeroed most of the time), except:\n\n- IPL.NIK: the length is stored in the last byte, and it must be kept.\n- BT.DINF: u8 unknown[0x45] should be another Bluetooth device entry.\n- Possibly other unknown affected entries.", 'modified': ['Source/Core/Common/SysConf.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c759739ee9ec9f577c524a7b48116ac933e91623', 'added': [], 'removed': [], 'distinct': True}, {'hash': '02f32a9b2670ec7df3e8ae947b1b755d6933b5b6', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'Handle BT.DINF properly\n\nThe section is 0x461 bytes long, not 0x460. The config data is also now\ninitialised to zero to avoid garbage being written to the SYSCONF.\n\nBecause our handling has been wrong forever, we discard older BT.DINF\nsection backups as using them would result in the section being the\nwrong size / incomplete again.', 'modified': ['Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTEmu.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/02f32a9b2670ec7df3e8ae947b1b755d6933b5b6', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'c27dd9dc20a216bcb604b2aff619d21f41d4c162', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5785 from leoetlino/sysconf-fix\n\nSysConf: Minor fixes', 'modified': ['Source/Core/Common/SysConf.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp', 'Source/Core/Core/IOS/USB/Bluetooth/BTEmu.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c27dd9dc20a216bcb604b2aff619d21f41d4c162', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'c27dd9dc20a216bcb604b2aff619d21f41d4c162', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'a23a38da23043cf55a24e69ae631b5fdac2fa82a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-24T03:06:22.104152	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '22fbd65d4721e799dcf13089acf09546dc8ec058', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Change the placement of "Use Built-In Database of Game Names"\n\nWhen I added this setting, I didn\'t notice that the interface\npane in DolphinQt2 was split into two different sections.', 'modified': ['Source/Core/DolphinQt2/Settings/InterfacePane.cpp', 'Source/Core/DolphinQt2/Settings/InterfacePane.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/22fbd65d4721e799dcf13089acf09546dc8ec058', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'bb3bbb288752cd2122d86f6f0a4d1aeb3dda9dd6', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Fix saving "Use Built-In Database of Game Names"\n\nThis one is my fault too', 'modified': ['Source/Core/DolphinQt2/Settings/InterfacePane.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/bb3bbb288752cd2122d86f6f0a4d1aeb3dda9dd6', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'a23a38da23043cf55a24e69ae631b5fdac2fa82a', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5821 from JosJuice/qt-builtin-database-placement\n\nDolphinQt2: Change the placement of "Use Built-In Database of Game Names"', 'modified': ['Source/Core/DolphinQt2/Settings/InterfacePane.cpp', 'Source/Core/DolphinQt2/Settings/InterfacePane.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/a23a38da23043cf55a24e69ae631b5fdac2fa82a', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'a23a38da23043cf55a24e69ae631b5fdac2fa82a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '7c70e77c74272582c8a980ef7c6439d6d73a249c', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T14:04:19.225394	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '5938c58f9944187e1dc2445a112469708a854e60', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Fix localization issues', 'modified': ['Source/Core/DolphinQt2/MenuBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5938c58f9944187e1dc2445a112469708a854e60', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7c70e77c74272582c8a980ef7c6439d6d73a249c', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5818 from JosJuice/qt-localization-fixes\n\nDolphinQt2: Fix localization issues', 'modified': ['Source/Core/DolphinQt2/MenuBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7c70e77c74272582c8a980ef7c6439d6d73a249c', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '7c70e77c74272582c8a980ef7c6439d6d73a249c', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '96a8fb720db1d8c185bea01e23c2b64433ffa61a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T14:02:04.645338	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '34cacd4944618229b18cd5ef729cac8f0eb2339b', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Reword the analytics message\n\n"this" made sense when "Do you authorize..." was on the bottom,\nbut it doesn\'t make sense when it\'s at the top.\n\nAlso removing unnecessary newlines.', 'modified': ['Source/Core/DolphinQt2/Main.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/34cacd4944618229b18cd5ef729cac8f0eb2339b', 'added': [], 'removed': [], 'distinct': True}, {'hash': '96a8fb720db1d8c185bea01e23c2b64433ffa61a', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5819 from JosJuice/qt-analytics-message\n\nDolphinQt2: Reword the analytics message', 'modified': ['Source/Core/DolphinQt2/Main.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/96a8fb720db1d8c185bea01e23c2b64433ffa61a', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '96a8fb720db1d8c185bea01e23c2b64433ffa61a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'c3394c36a47ff1ca8992899796ebea812f335c2e', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T13:52:51.255881	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '20172196f5c4958ba65026ae03f402f77f93ee56', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Let game properties show names for WADs', 'modified': ['Source/Core/DolphinQt2/Config/InfoWidget.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/20172196f5c4958ba65026ae03f402f77f93ee56', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'c3394c36a47ff1ca8992899796ebea812f335c2e', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5820 from JosJuice/qt-wad-name\n\nDolphinQt2: Let game properties show names for WADs', 'modified': ['Source/Core/DolphinQt2/Config/InfoWidget.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c3394c36a47ff1ca8992899796ebea812f335c2e', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'c3394c36a47ff1ca8992899796ebea812f335c2e', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'e60cde942fc2b6607c3153d98ef7714de692b21b', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T09:32:13.167443	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '5316df9130aeb45fd6aff897e591c864cae8c926', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'gettextize: extract arguments to QT_TR_NOOP', 'modified': ['Languages/gettextize'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5316df9130aeb45fd6aff897e591c864cae8c926', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'e60cde942fc2b6607c3153d98ef7714de692b21b', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Merge pull request #5816 from ligfx/gettextizeqttrnoop\n\ngettextize: extract arguments to QT_TR_NOOP', 'modified': ['Languages/gettextize'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e60cde942fc2b6607c3153d98ef7714de692b21b', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'e60cde942fc2b6607c3153d98ef7714de692b21b', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '9237137c3a23938ab8c3fd98d1864a5cf8f0af5a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'JosJuice'}
2017-07-23T07:13:24.712482	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '9357fa35144b333cf109d7433cd798d8fd7c7544', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'Qt/AboutDialog: Fix the copyright string', 'modified': ['Source/Core/DolphinQt2/AboutDialog.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/9357fa35144b333cf109d7433cd798d8fd7c7544', 'added': [], 'removed': [], 'distinct': True}, {'hash': '9237137c3a23938ab8c3fd98d1864a5cf8f0af5a', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5815 from leoetlino/about\n\nQt/AboutDialog: Fix the copyright string', 'modified': ['Source/Core/DolphinQt2/AboutDialog.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/9237137c3a23938ab8c3fd98d1864a5cf8f0af5a', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '9237137c3a23938ab8c3fd98d1864a5cf8f0af5a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '673210afea7626b98bea161efff5f15ce61418ff', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T06:48:40.241674	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '03f26ec5b37faab0b6dfdc0eb8f5db9ea7a29af6', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': "Remove CFBundleLocalizations from Info.plist\n\nIt's only needed for apps that don't use .lproj folders.", 'modified': ['Source/Core/DolphinQt2/Info.plist.in', 'Source/Core/DolphinWX/Info.plist.in'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/03f26ec5b37faab0b6dfdc0eb8f5db9ea7a29af6', 'added': [], 'removed': [], 'distinct': True}, {'hash': '673210afea7626b98bea161efff5f15ce61418ff', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5814 from ligfx/macremovecfbundlelocalizations\n\nRemove CFBundleLocalizations from Info.plist', 'modified': ['Source/Core/DolphinQt2/Info.plist.in', 'Source/Core/DolphinWX/Info.plist.in'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/673210afea7626b98bea161efff5f15ce61418ff', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '673210afea7626b98bea161efff5f15ce61418ff', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '2c3598312633994704527b1aa67a4404655bd99e', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T06:47:33.516191	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '41917cb43ca85cb54259ef5ffb1432eb7d101739', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Wx: make GameListCtrl fallback to sorting by title\n\nFixes an issue with game items moving around randomly when resorted.', 'modified': ['Source/Core/DolphinWX/GameListCtrl.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/41917cb43ca85cb54259ef5ffb1432eb7d101739', 'added': [], 'removed': [], 'distinct': True}, {'hash': '2c3598312633994704527b1aa67a4404655bd99e', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5787 from ligfx/wxsortfallbacktotitle\n\nWx: make GameListCtrl fallback to sorting by title', 'modified': ['Source/Core/DolphinWX/GameListCtrl.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/2c3598312633994704527b1aa67a4404655bd99e', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '2c3598312633994704527b1aa67a4404655bd99e', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '81abecbf4684dfdf3d2bb57d65aec43e1f35ecf3', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T06:47:12.659773	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '5cbbe2dda24e1a099003e2c95641c4e86a914725', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'IOSC: Add support for importing decrypted keys directly', 'modified': ['Source/Core/Core/IOS/IOSC.cpp', 'Source/Core/Core/IOS/IOSC.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5cbbe2dda24e1a099003e2c95641c4e86a914725', 'added': [], 'removed': [], 'distinct': True}, {'hash': '5b09657a1fee073d6290105fefcf538b10b05fd6', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'ESFormats: Add entry for unknown title flag', 'modified': ['Source/Core/Core/IOS/ES/Formats.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5b09657a1fee073d6290105fefcf538b10b05fd6', 'added': [], 'removed': [], 'distinct': True}, {'hash': '05016e8dcac8b8b7177b72bffe34c96dfd4a5df0', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'EcWii: Add function to get the backup key', 'modified': ['Source/Core/Core/ec_wii.cpp', 'Source/Core/Core/ec_wii.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/05016e8dcac8b8b7177b72bffe34c96dfd4a5df0', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'e608d79f424dae9371ebe0df27fbb0c9e53b9afe', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'IOSC: Load the backup/PRNG key', 'modified': ['Source/Core/Core/IOS/IOSC.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e608d79f424dae9371ebe0df27fbb0c9e53b9afe', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'fbcc6bbd5719e37b8e1dc1a68e3b3bdd5b1cf7a7', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': "IOS/ES: Use the correct key for imports/exports\n\nImports/exports don't always use the title key. Exporting a title and\nimporting it back uses the PRNG key (aka backup key handle or key #5),\nnot the title key (at all).\n\nTo make things even more fun, some versions of IOS have a bug that\ncauses it to use a zeroed key instead of the PRNG key. When Nintendo\ndecided to fix it, they added checks to keep using the zeroed key only\nin affected titles to avoid making existing exports useless.\n(Thanks to tueidj for drawing my attention to this.\nI missed this edge case during the initial implementation.)\n\nThis commit implements these checks so we are using the correct key\nin all of these cases.\n\nWe now also use IOSC for decryption/encryption since built-in key\nhandles are used. And we now reject any invalid common key index,\njust like ES.", 'modified': ['Source/Core/Core/IOS/ES/ES.h', 'Source/Core/Core/IOS/ES/TitleManagement.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/fbcc6bbd5719e37b8e1dc1a68e3b3bdd5b1cf7a7', 'added': [], 'removed': [], 'distinct': True}, {'hash': '81abecbf4684dfdf3d2bb57d65aec43e1f35ecf3', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5739 from leoetlino/correct-key\n\nIOS/ES: Use the correct import/export key (fix DLC)', 'modified': ['Source/Core/Core/IOS/ES/ES.h', 'Source/Core/Core/IOS/ES/Formats.h', 'Source/Core/Core/IOS/ES/TitleManagement.cpp', 'Source/Core/Core/IOS/IOSC.cpp', 'Source/Core/Core/IOS/IOSC.h', 'Source/Core/Core/ec_wii.cpp', 'Source/Core/Core/ec_wii.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/81abecbf4684dfdf3d2bb57d65aec43e1f35ecf3', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '81abecbf4684dfdf3d2bb57d65aec43e1f35ecf3', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '3cbf56a9adb8247eec6787737cfd1388740d2b61', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T06:46:50.633801	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '19dc580a4eed0e48198b1cb5bb453cccbb8e25ee', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Qt: extract ListTabWidget from SettingsWindow', 'modified': ['Source/Core/DolphinQt2/CMakeLists.txt', 'Source/Core/DolphinQt2/Config/SettingsWindow.cpp', 'Source/Core/DolphinQt2/Config/SettingsWindow.h', 'Source/Core/DolphinQt2/DolphinQt2.vcxproj'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/19dc580a4eed0e48198b1cb5bb453cccbb8e25ee', 'added': ['Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp', 'Source/Core/DolphinQt2/QtUtils/ListTabWidget.h'], 'removed': [], 'distinct': True}, {'hash': '2b712bdbaa3cb1ba7c8eec9faa7a4c602209df83', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ListTabWidget: disallow deselecting items', 'modified': ['Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/2b712bdbaa3cb1ba7c8eec9faa7a4c602209df83', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'e1554c04a128477b082cc633a5e2e1d5aa5c2fa3', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': "Qt: implement remainder of 'Options' menu", 'modified': ['Source/Core/DolphinQt2/Config/SettingsWindow.cpp', 'Source/Core/DolphinQt2/Config/SettingsWindow.h', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MainWindow.h', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e1554c04a128477b082cc633a5e2e1d5aa5c2fa3', 'added': [], 'removed': [], 'distinct': True}, {'hash': '3cbf56a9adb8247eec6787737cfd1388740d2b61', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': "Merge pull request #5797 from ligfx/qtoptionsmenu\n\nQt: implement remainder of 'Options' menu", 'modified': ['Source/Core/DolphinQt2/CMakeLists.txt', 'Source/Core/DolphinQt2/Config/SettingsWindow.cpp', 'Source/Core/DolphinQt2/Config/SettingsWindow.h', 'Source/Core/DolphinQt2/DolphinQt2.vcxproj', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MainWindow.h', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3cbf56a9adb8247eec6787737cfd1388740d2b61', 'added': ['Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp', 'Source/Core/DolphinQt2/QtUtils/ListTabWidget.h'], 'removed': [], 'distinct': True}], 'after_sha': '3cbf56a9adb8247eec6787737cfd1388740d2b61', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '55fb6efea320397f58e1dfdef75109646b6bc63a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-07-23T06:35:46.084360	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'e9328e5fa055fa2841eccfb4c68db6abc39e37c4', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': "gettextize: extract arguments to Qt's `tr`", 'modified': ['Languages/gettextize'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e9328e5fa055fa2841eccfb4c68db6abc39e37c4', 'added': [], 'removed': [], 'distinct': True}, {'hash': '4776fdc130f95f7bd4af556f0520698fa03be76d', 'author': {'name': 'Michael Maltese', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Qt/AboutDialog: remove literal UTF-8 characters', 'modified': ['Source/Core/DolphinQt2/AboutDialog.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/4776fdc130f95f7bd4af556f0520698fa03be76d', 'added': [], 'removed': [], 'distinct': True}, {'hash': '55fb6efea320397f58e1dfdef75109646b6bc63a', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': "Merge pull request #5812 from ligfx/gettexttizeqt\n\ngettextize: extract arguments to Qt's `tr`", 'modified': ['Languages/gettextize', 'Source/Core/DolphinQt2/AboutDialog.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/55fb6efea320397f58e1dfdef75109646b6bc63a', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '55fb6efea320397f58e1dfdef75109646b6bc63a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'a7c3d035c882837acfc40b4f1dbb8e165c2420f2', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}

Recent 'internal_log' events

2017-07-28T04:31:47.456095	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:47.453437	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/gcdsp-ida' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:46.951963	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:46.470699	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:46.468372	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/hwtests' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:45.964426	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:45.460172	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:45.457993	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/www' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:44.971715	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:44.441792	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:44.439570	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/sadm' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:43.919185	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:43.439640	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:43.437819	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/redmine' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:42.931350	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:42.410906	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:42.408695	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/fifoci' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:41.892922	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:41.365027	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:41.362736	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/codesearch-ui' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:40.862639	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:40.336898	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:40.334532	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/dolphin' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:39.813859	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-07-28T04:31:39.811075	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 168, 'level': 'INFO', 'args': '()', 'msg': 'Checking watched repositories for webhook presence', 'source': 'logging', 'type': 'internal_log'}

Recent 'irc_message' events

2017-07-28T04:32:39.624855	{'what': '...DolphinWX relies on the order of the event IDs', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:29:59.052980	{'what': 'wait what, why are Boot to Pause and Automatic Start handled in OnCPUMode() (which handles events for the CPU mode and JIT items)?', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:20:18.421083	{'what': 'leoetlino: Maybe', 'who': 'HdkR', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:16:17.744060	{'what': "eh, it's really minor", 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:15:27.843089	{'what': 'Thanks for catching that', 'who': 'ligfx', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:14:26.961496	{'what': 'would it be worth doing the same thing for the other options?', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:13:48.062141	{'what': 'oh, DolphinWX disables the menu option unless the core is paused, I see...', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:13:01.584375	{'what': "HdkR: huh, I'm surprised the UI doesn't already do that", 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:12:30.716588	{'what': 'https://github.com/dolphin-emu/dolphin/pull/5770/files#diff-e4b1d956ee6261b8e6bf15d1bdb1c711R133', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:12:29.610542	{'what': 'Agh oh no!', 'who': 'ligfx', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:12:23.636046	{'what': "Personally my main issue with that was I wasn't sure where to put the ConfigInfo objects", 'who': 'ligfx', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:12:05.209011	{'what': "there's a typo somewhere", 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:11:56.777051	{'what': 'What was the comment going to be?', 'who': 'ligfx', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T04:11:25.308173	{'what': 'ligfx: well I was in the middle of reviewing it and had one (very minor) pending comment, but went to bed before submitting it *shrug*', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T03:16:44.968608	{'what': 'hey leoetlino. Can you make it so the "Clear JIT Cache" option in the debug UI with the RunAsCPUThread routine so you don\'t have to do a pause+clear+unpause dance in the UI?', 'who': 'HdkR', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:59:09.733610	{'what': 'So technically when talking you\'d have to say "OpenGL on this and that OS"', 'who': 'ZexaronS', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:58:23.484482	{'what': 'You know, we all talk about the API ... but what about OS-driver-model specific drivers, small differences can lead to big ones in practise', 'who': 'ZexaronS', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:57:22.458742	{'what': 'I finally got the energy to tweak the crap out of it, took me 3 days, but got it done, maybe AMD hardware might behave better on Win10', 'who': 'ZexaronS', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:56:01.130171	{'what': "So I technially have both, but I won't be using Win10 for practical work except gaming, I set up DCS there and maybe I could set up Dolphin there as well ", 'who': 'ZexaronS', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:55:51.032429	{'what': 'So we can drop it entirely if we ship the dll ;)', 'who': 'Stenzek', 'type': 'irc_message', 'modes': {'o', 'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:55:44.563856	{'what': 'It should be a warning', 'who': 'Stenzek', 'type': 'irc_message', 'modes': {'o', 'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:55:42.099843	{'what': 'I would have had to look in the logs', 'who': 'MayImilae', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:55:37.388220	{'what': 'there was no warning pop up', 'who': 'MayImilae', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:55:34.248483	{'what': 'an yes, that', 'who': 'MayImilae', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-07-28T02:55:29.339835	{'what': "Except it's a notice not a warning", 'who': 'Stenzek', 'type': 'irc_message', 'modes': {'o', 'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}

Recent 'issue' events

2017-07-27T12:06:04.477341	{'update': 2, 'author': 'Stenzek', 'issue': 10386, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan does not save shader cache without a /Cache/Shaders folder'}
2017-07-27T12:04:05.091879	{'update': 1, 'author': 'Stenzek', 'issue': 10409, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': '[Feature Request] Loading DDS BC7 Custom Textures'}
2017-07-25T07:37:01.194925	{'update': 1, 'author': 'JMC4789', 'issue': 10415, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Wireframe not clearing after each frame'}
2017-07-25T06:01:37.236769	{'update': 0, 'author': 'roket_gamer', 'issue': 10415, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Wireframe not clearing after each frame'}
2017-07-24T20:30:58.519691	{'update': 1, 'author': 'JosJuice', 'issue': 10414, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': '[Short description of your bug here (~10 words)]'}
2017-07-24T20:25:34.853486	{'update': 0, 'author': 'PeterNjeim', 'issue': 10414, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': '[Short description of your bug here (~10 words)]'}
2017-07-24T15:55:04.518637	{'update': 1, 'author': 'JosJuice', 'issue': 10412, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'ES_Launch not working with Bluetooth Passthrough. '}
2017-07-24T15:54:35.068355	{'update': 2, 'author': 'JosJuice', 'issue': 10413, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Two step launching not working with Bluetooth Passthrough'}
2017-07-24T15:48:14.369228	{'update': 1, 'author': 'purechoass', 'issue': 10413, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Two step launching not working with Bluetooth Passthrough'}
2017-07-24T15:47:21.552542	{'update': 0, 'author': 'purechoass', 'issue': 10413, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Two step launching not working with Bluetooth Passthrough'}
2017-07-24T15:46:57.785135	{'update': 0, 'author': 'purechoass', 'issue': 10412, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Two Step Launcher Games not Working  with Bluetooth Passthrough. '}
2017-07-24T13:39:08.456174	{'update': 5, 'author': 'ytrezq', 'issue': 10410, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature request\xa0: Please support using The Wii classic controller as a controller for the Gamecube.'}
2017-07-24T13:38:13.675285	{'update': 4, 'author': 'ytrezq', 'issue': 10410, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature request\xa0: Please support using The Wii classic controller as a controller for the Gamecube.'}
2017-07-24T07:55:58.074388	{'update': 13, 'author': 'JosJuice', 'issue': 10355, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Ultimate Spider-Man crashes Dolphin'}
2017-07-24T07:55:40.706912	{'update': 30, 'author': 'JosJuice', 'issue': 10171, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Paper mario ttyd broken save files'}
2017-07-24T07:45:34.926318	{'update': 6, 'author': 'leoetlino', 'issue': 10207, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Part of Club Penguin Game Day broken'}
2017-07-24T07:44:49.169726	{'update': 3, 'author': 'leoetlino', 'issue': 10336, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Starting from 5.0-72 Eternal Darkness may freeze and may not freeze at startup'}
2017-07-24T07:40:53.686273	{'update': 8, 'author': 'leoetlino', 'issue': 10370, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'about french game "Qui veut gagner des millions"'}
2017-07-24T06:44:56.146439	{'update': 3, 'author': 'JosJuice', 'issue': 10410, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature request\xa0: Please support using The Wii classic controller as a controller for the Gamecube.'}
2017-07-24T06:18:13.872623	{'update': 2, 'author': 'leoetlino', 'issue': 10377, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Bugs when viewing save data on wii menu'}
2017-07-24T06:15:02.470495	{'update': 3, 'author': 'leoetlino', 'issue': 10389, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Wii console nickname is not saved'}
2017-07-24T06:12:22.674913	{'update': 2, 'author': 'leoetlino', 'issue': 10410, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature request\xa0: Please support using The Wii classic controller as a controller for the Gamecube.'}
2017-07-24T06:10:51.751516	{'update': 1, 'author': 'leoetlino', 'issue': 10410, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature request\xa0: Please support using The Wii classic controller as a controller for the Gamecube.'}
2017-07-23T20:34:46.775181	{'update': 0, 'author': 'LuismaSP', 'issue': 10411, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Vulkan crashes in some games such Trivial pursuit and Monopoly Streets'}
2017-07-21T14:43:14.231807	{'update': 0, 'author': 'ytrezq', 'issue': 10410, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Feature request\xa0: Please support using The Wii classic controller as a controller for the Gamecube.'}

Recent 'raw_bb_hook' events

2017-07-28T04:31:08.274815	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 2, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/16/builds/73', 'builderid': 16, 'buildid': 4862, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1686, 'builderid': 16, 'priority': 0, 'complete_at': None, 'buildrequestid': 6497, 'claimed_at': 1501216118, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501216268, 'buildrequestid': 6497, 'builder': {'masterids': [1], 'name': 'fifoci-sw-lin-mesa', 'builderid': 16, 'description': None, 'tags': []}, 'started_at': 1501215687, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['fifoci-sw-lin-mesa', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['arch64', 'Worker'], 'shortrev': ['5.0-4833', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/fifoci-sw-lin-mesa', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['fifoci-lin', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215687, 'parent_buildid': 4859, 'bsid': 1686, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:29:57.262157	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 2, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/36/builds/73', 'builderid': 36, 'buildid': 4861, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1686, 'builderid': 36, 'priority': 0, 'complete_at': None, 'buildrequestid': 6501, 'claimed_at': 1501216118, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501216197, 'buildrequestid': 6501, 'builder': {'masterids': [1], 'name': 'fifoci-ogl-lin-mesa', 'builderid': 36, 'description': None, 'tags': []}, 'started_at': 1501215687, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['fifoci-ogl-lin-mesa', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['arch64', 'Worker'], 'shortrev': ['5.0-4833', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/fifoci-ogl-lin-mesa', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['fifoci-lin', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215687, 'parent_buildid': 4859, 'bsid': 1686, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:27:02.619109	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 11, 'url': 'https://buildbot.dolphin-emu.org/#builders/12/builds/73', 'builderid': 12, 'buildid': 4865, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1686, 'builderid': 12, 'priority': 0, 'complete_at': None, 'buildrequestid': 6496, 'claimed_at': 1501216022, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6496, 'builder': {'masterids': [1], 'name': 'fifoci-ogl-lin-intel', 'builderid': 12, 'description': None, 'tags': []}, 'started_at': 1501216022, 'properties': {'codebase': ['', 'Build'], 'buildername': ['fifoci-ogl-lin-intel', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Trigger'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['fifoci-lin', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215687, 'parent_buildid': 4859, 'bsid': 1686, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:27:02.172983	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 339, 'results': 2, 'workerid': 11, 'url': 'https://buildbot.dolphin-emu.org/#builders/4/builds/339', 'builderid': 4, 'buildid': 4852, 'buildrequest': {'results': -1, 'submitted_at': 1501215339, 'claimed_by_masterid': 1, 'buildsetid': 1679, 'builderid': 4, 'priority': 0, 'complete_at': None, 'buildrequestid': 6484, 'claimed_at': 1501215518, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501216022, 'buildrequestid': 6484, 'builder': {'masterids': [1], 'name': 'pr-fifoci-ogl-lin-intel', 'builderid': 4, 'description': None, 'tags': []}, 'started_at': 1501215340, 'properties': {'codebase': ['', 'Build'], 'slavename': ['delroth-nuc', 'Worker (deprecated)'], 'buildername': ['pr-fifoci-ogl-lin-intel', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-5836', 'Trigger'], 'headrev': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'Trigger'], 'workername': ['delroth-nuc', 'Worker'], 'shortrev': ['2f9322', 'Trigger'], 'builddir': ['/data/buildslave/buildslave/pr-fifoci-ogl-lin-intel', 'worker'], 'warnings-count': [4, 'WarningCountingShellCommand'], 'pr_id': [5836, 'Trigger'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'buildnumber': [339, 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'Build'], 'got_revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'GitNoBranch'], 'branch': ['refs/pull/5836/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215339, 'parent_buildid': 4849, 'bsid': 1679, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/5836/head', 'repository': '', 'created_at': 1501215340, 'ssid': 503, 'project': '', 'revision': '2f932273bbf43c1784e3ad6d7113ed4623f2450c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:24:57.611569	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 0, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/25/builds/73', 'builderid': 25, 'buildid': 4864, 'buildrequest': {'results': -1, 'submitted_at': 1501215799, 'claimed_by_masterid': 1, 'buildsetid': 1689, 'builderid': 25, 'priority': 0, 'complete_at': None, 'buildrequestid': 6504, 'claimed_at': 1501215799, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215898, 'buildrequestid': 6504, 'builder': {'masterids': [1], 'name': 'debug-win-x64', 'builderid': 25, 'description': None, 'tags': []}, 'started_at': 1501215799, 'properties': {'codebase': ['', 'Build'], 'slavename': ['windows', 'Worker (deprecated)'], 'buildername': ['debug-win-x64', 'Builder'], 'project': ['', 'Build'], 'build_url': ['https://dl.dolphin-emu.org/builds/dolphin-master-5.0-4833-dbg-x64.7z', 'SetProperty'], 'workername': ['windows', 'Worker'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['C:\\buildbot\\debug-win-x64', 'worker'], 'author': ['Leo Lam', 'Change'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['win64-debug', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': 'downstream', 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215799, 'parent_buildid': None, 'bsid': 1689, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:24:42.904849	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 338, 'results': 2, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/338', 'builderid': 30, 'buildid': 4851, 'buildrequest': {'results': -1, 'submitted_at': 1501215339, 'claimed_by_masterid': 1, 'buildsetid': 1679, 'builderid': 30, 'priority': 0, 'complete_at': None, 'buildrequestid': 6488, 'claimed_at': 1501215518, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215883, 'buildrequestid': 6488, 'builder': {'masterids': [1], 'name': 'pr-fifoci-ogl-lin-mesa', 'builderid': 30, 'description': None, 'tags': []}, 'started_at': 1501215340, 'properties': {'codebase': ['', 'Build'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-5836', 'Trigger'], 'headrev': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'Trigger'], 'workername': ['arch64', 'Worker'], 'shortrev': ['2f9322', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/pr-fifoci-ogl-lin-mesa', 'worker'], 'warnings-count': [4, 'WarningCountingShellCommand'], 'pr_id': [5836, 'Trigger'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'buildnumber': [338, 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'Build'], 'got_revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'GitNoBranch'], 'branch': ['refs/pull/5836/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215339, 'parent_buildid': 4849, 'bsid': 1679, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/5836/head', 'repository': '', 'created_at': 1501215340, 'ssid': 503, 'project': '', 'revision': '2f932273bbf43c1784e3ad6d7113ed4623f2450c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:24:10.115041	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 338, 'results': 2, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/338', 'builderid': 17, 'buildid': 4850, 'buildrequest': {'results': -1, 'submitted_at': 1501215339, 'claimed_by_masterid': 1, 'buildsetid': 1679, 'builderid': 17, 'priority': 0, 'complete_at': None, 'buildrequestid': 6486, 'claimed_at': 1501215518, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215850, 'buildrequestid': 6486, 'builder': {'masterids': [1], 'name': 'pr-fifoci-sw-lin-mesa', 'builderid': 17, 'description': None, 'tags': []}, 'started_at': 1501215340, 'properties': {'codebase': ['', 'Build'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-5836', 'Trigger'], 'headrev': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'Trigger'], 'workername': ['arch64', 'Worker'], 'shortrev': ['2f9322', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/pr-fifoci-sw-lin-mesa', 'worker'], 'warnings-count': [4, 'WarningCountingShellCommand'], 'pr_id': [5836, 'Trigger'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'buildnumber': [338, 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'Build'], 'got_revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'GitNoBranch'], 'branch': ['refs/pull/5836/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215339, 'parent_buildid': 4849, 'bsid': 1679, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/5836/head', 'repository': '', 'created_at': 1501215340, 'ssid': 503, 'project': '', 'revision': '2f932273bbf43c1784e3ad6d7113ed4623f2450c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:23:19.691407	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/25/builds/73', 'builderid': 25, 'buildid': 4864, 'buildrequest': {'results': -1, 'submitted_at': 1501215799, 'claimed_by_masterid': 1, 'buildsetid': 1689, 'builderid': 25, 'priority': 0, 'complete_at': None, 'buildrequestid': 6504, 'claimed_at': 1501215799, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6504, 'builder': {'masterids': [1], 'name': 'debug-win-x64', 'builderid': 25, 'description': None, 'tags': []}, 'started_at': 1501215799, 'properties': {'codebase': ['', 'Build'], 'buildername': ['debug-win-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['win64-debug', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': 'downstream', 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215799, 'parent_buildid': None, 'bsid': 1689, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:23:18.952732	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 74, 'results': 0, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/15/builds/74', 'builderid': 15, 'buildid': 4858, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1683, 'builderid': 15, 'priority': 0, 'complete_at': None, 'buildrequestid': 6494, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215799, 'buildrequestid': 6494, 'builder': {'masterids': [1], 'name': 'release-win-x64', 'builderid': 15, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'codebase': ['', 'Build'], 'slavename': ['windows', 'Worker (deprecated)'], 'buildername': ['release-win-x64', 'Builder'], 'project': ['', 'Build'], 'build_url': ['https://dl.dolphin-emu.org/builds/dolphin-master-5.0-4833-x64.7z', 'SetProperty'], 'workername': ['windows', 'Worker'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['C:\\buildbot\\release-win-x64', 'worker'], 'author': ['Leo Lam', 'Change'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [74, 'Build'], 'scheduler': ['win64-release', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'win64-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1683, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:22:02.985757	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 75, 'results': 0, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/1/builds/75', 'builderid': 1, 'buildid': 4863, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1687, 'builderid': 1, 'priority': 0, 'complete_at': None, 'buildrequestid': 6502, 'claimed_at': 1501215687, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215723, 'buildrequestid': 6502, 'builder': {'masterids': [1], 'name': 'release-android', 'builderid': 1, 'description': None, 'tags': []}, 'started_at': 1501215688, 'properties': {'codebase': ['', 'Build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'buildername': ['release-android', 'Builder'], 'project': ['', 'Build'], 'workername': ['ubuntu', 'Worker'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['/var/lib/buildbot/slave/release-android', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [75, 'Build'], 'scheduler': ['android-release', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': 'downstream', 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215687, 'parent_buildid': None, 'bsid': 1687, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:56.276389	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 0, 'workerid': 1, 'url': 'https://buildbot.dolphin-emu.org/#builders/31/builds/73', 'builderid': 31, 'buildid': 4857, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1685, 'builderid': 31, 'priority': 0, 'complete_at': None, 'buildrequestid': 6495, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215716, 'buildrequestid': 6495, 'builder': {'masterids': [1], 'name': 'release-osx-x64', 'builderid': 31, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'slavename': ['osx', 'Worker (deprecated)'], 'buildername': ['release-osx-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['osx', 'Worker'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['/Users/osxguest/buildslave/release-osx-x64', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['osx-release', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'osx-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1685, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:48.689523	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 0, 'workerid': 8, 'url': 'https://buildbot.dolphin-emu.org/#builders/9/builds/73', 'builderid': 9, 'buildid': 4860, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1682, 'builderid': 9, 'priority': 0, 'complete_at': None, 'buildrequestid': 6492, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215709, 'buildrequestid': 6492, 'builder': {'masterids': [1], 'name': 'release-freebsd-x64', 'builderid': 9, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'slavename': ['freebsd', 'Worker (deprecated)'], 'buildername': ['release-freebsd-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['freebsd', 'Worker'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['/usr/home/buildbot/freebsd/release-freebsd-x64', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['freebsd-release', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'freebsd-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1682, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:40.956990	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 0, 'workerid': 12, 'url': 'https://buildbot.dolphin-emu.org/#builders/11/builds/73', 'builderid': 11, 'buildid': 4856, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1681, 'builderid': 11, 'priority': 0, 'complete_at': None, 'buildrequestid': 6491, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215701, 'buildrequestid': 6491, 'builder': {'masterids': [1], 'name': 'release-deb-x64', 'builderid': 11, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'slavename': ['debian', 'Worker (deprecated)'], 'buildername': ['release-deb-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['debian', 'Worker'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['/home/delroth/buildslave/release-deb-x64', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['deb64-release', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'deb64-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1681, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:27.801263	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 75, 'results': None, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/1/builds/75', 'builderid': 1, 'buildid': 4863, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1687, 'builderid': 1, 'priority': 0, 'complete_at': None, 'buildrequestid': 6502, 'claimed_at': 1501215687, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6502, 'builder': {'masterids': [1], 'name': 'release-android', 'builderid': 1, 'description': None, 'tags': []}, 'started_at': 1501215688, 'properties': {'codebase': ['', 'Build'], 'buildername': ['release-android', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [75, 'Build'], 'scheduler': ['android-release', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': 'downstream', 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215687, 'parent_buildid': None, 'bsid': 1687, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:27.549782	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/16/builds/73', 'builderid': 16, 'buildid': 4862, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1686, 'builderid': 16, 'priority': 0, 'complete_at': None, 'buildrequestid': 6497, 'claimed_at': 1501215687, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6497, 'builder': {'masterids': [1], 'name': 'fifoci-sw-lin-mesa', 'builderid': 16, 'description': None, 'tags': []}, 'started_at': 1501215687, 'properties': {'codebase': ['', 'Build'], 'buildername': ['fifoci-sw-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Trigger'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['fifoci-lin', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215687, 'parent_buildid': 4859, 'bsid': 1686, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:27.525812	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/36/builds/73', 'builderid': 36, 'buildid': 4861, 'buildrequest': {'results': -1, 'submitted_at': 1501215687, 'claimed_by_masterid': 1, 'buildsetid': 1686, 'builderid': 36, 'priority': 0, 'complete_at': None, 'buildrequestid': 6501, 'claimed_at': 1501215687, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6501, 'builder': {'masterids': [1], 'name': 'fifoci-ogl-lin-mesa', 'builderid': 36, 'description': None, 'tags': []}, 'started_at': 1501215687, 'properties': {'codebase': ['', 'Build'], 'buildername': ['fifoci-ogl-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Trigger'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['fifoci-lin', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1501215687, 'parent_buildid': 4859, 'bsid': 1686, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:27.426019	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 73, 'results': 0, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/37/builds/73', 'builderid': 37, 'buildid': 4859, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1684, 'builderid': 37, 'priority': 0, 'complete_at': None, 'buildrequestid': 6493, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215687, 'buildrequestid': 6493, 'builder': {'masterids': [1], 'name': 'release-ubu-x64', 'builderid': 37, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'buildername': ['release-ubu-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['ubuntu', 'Worker'], 'shortrev': ['5.0-4833', 'Change'], 'builddir': ['/var/lib/buildbot/slave/release-ubu-x64', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['ubu64-release', 'Scheduler'], 'got_revision': ['41e8a36befe934f25db550db565da011a708050c', 'GitNoBranch'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'ubu64-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1684, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:10.588254	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 8, 'url': 'https://buildbot.dolphin-emu.org/#builders/9/builds/73', 'builderid': 9, 'buildid': 4860, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1682, 'builderid': 9, 'priority': 0, 'complete_at': None, 'buildrequestid': 6492, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6492, 'builder': {'masterids': [1], 'name': 'release-freebsd-x64', 'builderid': 9, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'codebase': ['', 'Build'], 'buildername': ['release-freebsd-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['freebsd-release', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'freebsd-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1682, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:10.502354	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/37/builds/73', 'builderid': 37, 'buildid': 4859, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1684, 'builderid': 37, 'priority': 0, 'complete_at': None, 'buildrequestid': 6493, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6493, 'builder': {'masterids': [1], 'name': 'release-ubu-x64', 'builderid': 37, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'codebase': ['', 'Build'], 'buildername': ['release-ubu-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['ubu64-release', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'ubu64-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1684, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:10.457485	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 74, 'results': None, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/15/builds/74', 'builderid': 15, 'buildid': 4858, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1683, 'builderid': 15, 'priority': 0, 'complete_at': None, 'buildrequestid': 6494, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6494, 'builder': {'masterids': [1], 'name': 'release-win-x64', 'builderid': 15, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'codebase': ['', 'Build'], 'buildername': ['release-win-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [74, 'Build'], 'scheduler': ['win64-release', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'win64-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1683, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:10.431584	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 1, 'url': 'https://buildbot.dolphin-emu.org/#builders/31/builds/73', 'builderid': 31, 'buildid': 4857, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1685, 'builderid': 31, 'priority': 0, 'complete_at': None, 'buildrequestid': 6495, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6495, 'builder': {'masterids': [1], 'name': 'release-osx-x64', 'builderid': 31, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'codebase': ['', 'Build'], 'buildername': ['release-osx-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['osx-release', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'osx-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1685, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:21:10.429242	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 73, 'results': None, 'workerid': 12, 'url': 'https://buildbot.dolphin-emu.org/#builders/11/builds/73', 'builderid': 11, 'buildid': 4856, 'buildrequest': {'results': -1, 'submitted_at': 1501215669, 'claimed_by_masterid': 1, 'buildsetid': 1681, 'builderid': 11, 'priority': 0, 'complete_at': None, 'buildrequestid': 6491, 'claimed_at': 1501215670, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6491, 'builder': {'masterids': [1], 'name': 'release-deb-x64', 'builderid': 11, 'description': None, 'tags': []}, 'started_at': 1501215670, 'properties': {'codebase': ['', 'Build'], 'buildername': ['release-deb-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['5.0-4833', 'Change'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [73, 'Build'], 'scheduler': ['deb64-release', 'Scheduler'], 'revision': ['41e8a36befe934f25db550db565da011a708050c', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The AnyBranchScheduler scheduler named 'deb64-release' triggered this build", 'external_idstring': None, 'parent_relationship': None, 'submitted_at': 1501215669, 'parent_buildid': None, 'bsid': 1681, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1501215670, 'ssid': 504, 'project': '', 'revision': '41e8a36befe934f25db550db565da011a708050c'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:19:54.890411	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 345, 'results': 0, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/345', 'builderid': 7, 'buildid': 4855, 'buildrequest': {'results': -1, 'submitted_at': 1501215319, 'claimed_by_masterid': 1, 'buildsetid': 1678, 'builderid': 7, 'priority': 0, 'complete_at': None, 'buildrequestid': 6477, 'claimed_at': 1501215518, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215595, 'buildrequestid': 6477, 'builder': {'masterids': [1], 'name': 'pr-win-dbg-x64', 'builderid': 7, 'description': None, 'tags': []}, 'started_at': 1501215468, 'properties': {'slavename': ['windows', 'Worker (deprecated)'], 'baserev': ['97ea97564fecac7759e33347ed50d61ad5c5d550', 'try build'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'branchname': ['pr-5836', 'try build'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-5836-dolphin-latest-dbg-x64.7z', 'SetProperty'], 'workername': ['windows', 'Worker'], 'shortrev': ['2f9322', 'try build'], 'builddir': ['C:\\buildbot\\pr-win-dbg-x64', 'worker'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'pr_id': [5836, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'buildnumber': [345, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'GitNoBranch'], 'headrev': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'try build'], 'branch': ['refs/pull/5836/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: ligfx)", 'external_idstring': '5836-2f9322', 'parent_relationship': None, 'submitted_at': 1501215319, 'parent_buildid': None, 'bsid': 1678, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/5836/head', 'repository': '', 'created_at': 1501215319, 'ssid': 502, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:17:48.674776	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 345, 'results': None, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/345', 'builderid': 7, 'buildid': 4855, 'buildrequest': {'results': -1, 'submitted_at': 1501215319, 'claimed_by_masterid': 1, 'buildsetid': 1678, 'builderid': 7, 'priority': 0, 'complete_at': None, 'buildrequestid': 6477, 'claimed_at': 1501215468, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 6477, 'builder': {'masterids': [1], 'name': 'pr-win-dbg-x64', 'builderid': 7, 'description': None, 'tags': []}, 'started_at': 1501215468, 'properties': {'codebase': ['', 'Build'], 'baserev': ['97ea97564fecac7759e33347ed50d61ad5c5d550', 'try build'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['2f9322', 'try build'], 'headrev': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'try build'], 'buildnumber': [345, 'Build'], 'pr_id': [5836, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-5836', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/5836/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: ligfx)", 'external_idstring': '5836-2f9322', 'parent_relationship': None, 'submitted_at': 1501215319, 'parent_buildid': None, 'bsid': 1678, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/5836/head', 'repository': '', 'created_at': 1501215319, 'ssid': 502, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-07-28T04:17:48.389072	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 347, 'results': 0, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/347', 'builderid': 20, 'buildid': 4848, 'buildrequest': {'results': -1, 'submitted_at': 1501215319, 'claimed_by_masterid': 1, 'buildsetid': 1678, 'builderid': 20, 'priority': 0, 'complete_at': None, 'buildrequestid': 6479, 'claimed_at': 1501215319, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1501215468, 'buildrequestid': 6479, 'builder': {'masterids': [1], 'name': 'pr-win-x64', 'builderid': 20, 'description': None, 'tags': []}, 'started_at': 1501215320, 'properties': {'slavename': ['windows', 'Worker (deprecated)'], 'baserev': ['97ea97564fecac7759e33347ed50d61ad5c5d550', 'try build'], 'buildername': ['pr-win-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'branchname': ['pr-5836', 'try build'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-5836-dolphin-latest-x64.7z', 'SetProperty'], 'workername': ['windows', 'Worker'], 'shortrev': ['2f9322', 'try build'], 'builddir': ['C:\\buildbot\\pr-win-x64', 'worker'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'pr_id': [5836, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'buildnumber': [347, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'GitNoBranch'], 'headrev': ['2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'try build'], 'branch': ['refs/pull/5836/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: ligfx)", 'external_idstring': '5836-2f9322', 'parent_relationship': None, 'submitted_at': 1501215319, 'parent_buildid': None, 'bsid': 1678, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/5836/head', 'repository': '', 'created_at': 1501215319, 'ssid': 502, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}

Recent 'raw_gh_hook' events

2017-07-28T04:23:19.638151	{'gh_type': 'issue_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/sadm', 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87', 'labels_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87', 'milestone': None, 'locked': False, 'id': 246169985, 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/comments', 'assignees': [], 'created_at': '2017-07-27T21:09:18Z', 'body': 'Makes sure the baserev exists locally, in an attempt to fix the `invalid symmetric difference expression` errors. GitHub\'s "baserev" property is the current base branch head, which isn\'t guaranteed to exist in the PR branch (e.g. if it hasn\'t been rebased)!', 'events_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 87, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-28T04:23:18Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/sadm/pull/87.diff', 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87', 'patch_url': 'https://github.com/dolphin-emu/sadm/pull/87.patch', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87'}, 'labels': [], 'title': 'buildbot: fetch base rev before linting against it'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87', 'created_at': '2017-07-28T04:23:18Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'updated_at': '2017-07-28T04:23:18Z', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/comments/318555699', 'body': "Yeah, that's what I had assumed too! I'm guessing that that's not possible / useful information in some more complicated cases (commits with multiple parents?).", 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87#issuecomment-318555699', 'id': 318555699}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/sadm/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/sadm/releases{/id}', 'created_at': '2013-07-19T22:07:05Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/sadm/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/sadm/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/sadm.git', 'html_url': 'https://github.com/dolphin-emu/sadm', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/sadm/hooks', 'homepage': None, 'watchers_count': 12, 'svn_url': 'https://github.com/dolphin-emu/sadm', 'description': 'Scripts and configurations for the Dolphin Emulator infrastructure', 'full_name': 'dolphin-emu/sadm', 'branches_url': 'https://api.github.com/repos/dolphin-emu/sadm/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/sadm/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/sadm.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/sadm/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/sadm/{archive_format}{/ref}', 'name': 'sadm', 'pushed_at': '2017-07-27T21:10:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/sadm/assignees{/user}', 'updated_at': '2017-06-29T20:19:22Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/sadm/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 16, 'private': False, 'forks_count': 24, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/sadm/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/sadm/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/sadm/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/sadm', 'languages_url': 'https://api.github.com/repos/dolphin-emu/sadm/languages', 'id': 11538142, 'merges_url': 'https://api.github.com/repos/dolphin-emu/sadm/merges', 'clone_url': 'https://github.com/dolphin-emu/sadm.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/sadm/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/sadm/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/sadm/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/sadm/contents/{+path}', 'language': 'Python', 'has_pages': False, 'size': 383, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/trees{/sha}', 'open_issues': 16, 'stargazers_count': 12, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/sadm/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/sadm/notifications{?since,all,participating}', 'watchers': 12, 'forks': 24, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/events{/number}', 'has_issues': True}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T04:20:04.567832	{'gh_type': 'push', 'raw': {'after': '41e8a36befe934f25db550db565da011a708050c', 'forced': False, 'head_commit': {'modified': ['Source/Core/Common/Logging/LogManager.cpp'], 'timestamp': '2017-07-28T12:20:02+08:00', 'tree_id': '6214c83e29f2ed9fe9404bb604cf51436f21c6c8', 'committer': {'name': 'GitHub', 'username': 'web-flow', 'email': 'noreply@github.com'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/41e8a36befe934f25db550db565da011a708050c', 'added': [], 'removed': [], 'distinct': True, 'id': '41e8a36befe934f25db550db565da011a708050c', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'commits': [{'modified': ['Source/Core/Common/Logging/LogManager.cpp'], 'timestamp': '2017-07-27T21:15:05-07:00', 'tree_id': '6214c83e29f2ed9fe9404bb604cf51436f21c6c8', 'committer': {'name': 'GitHub', 'username': 'web-flow', 'email': 'noreply@github.com'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'added': [], 'removed': [], 'distinct': True, 'id': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'author': {'name': 'ligfx', 'username': 'ligfx', 'email': 'ligfx@users.noreply.github.com'}, 'message': 'LogManager: remove stand-alone semicolon\n\nMy bad!'}, {'modified': ['Source/Core/Common/Logging/LogManager.cpp'], 'timestamp': '2017-07-28T12:20:02+08:00', 'tree_id': '6214c83e29f2ed9fe9404bb604cf51436f21c6c8', 'committer': {'name': 'GitHub', 'username': 'web-flow', 'email': 'noreply@github.com'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/41e8a36befe934f25db550db565da011a708050c', 'added': [], 'removed': [], 'distinct': True, 'id': '41e8a36befe934f25db550db565da011a708050c', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5836 from ligfx/patch-1\n\nLogManager: remove stand-alone semicolon'}], 'ref': 'refs/heads/master', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'compare': 'https://github.com/dolphin-emu/dolphin/compare/97ea97564fec...41e8a36befe9', 'deleted': False, 'pusher': {'name': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': 1374484077, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': 1501215603, 'organization': 'dolphin-emu', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'stargazers': 3479, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'name': 'dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'email': '', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'url': 'https://api.github.com/users/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'type': 'Organization'}, 'url': 'https://github.com/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'master_branch': 'master', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'before': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'base_ref': None, 'created': False}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T04:20:04.098535	{'gh_type': 'pull_request', 'raw': {'action': 'closed', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-28T04:20:03Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'number': 5836, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': '41e8a36befe934f25db550db565da011a708050c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836', 'commits': 1, 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5836', 'id': 132891925, 'milestone': None, 'maintainer_can_modify': False, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836', 'assignees': [], 'created_at': '2017-07-28T04:15:15Z', 'body': 'My bad!', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'rebaseable': None, 'review_comments': 0, 'merged': True, 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-28T04:20:03Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': '2017-07-28T04:20:03Z', 'closed_at': '2017-07-28T04:20:03Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 5836, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-28T04:20:03Z', 'state': 'closed', 'head': {'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'ref': 'patch-1', 'sha': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'label': 'ligfx:patch-1', 'repo': {'compare_url': 'https://api.github.com/repos/ligfx/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/ligfx/dolphin/releases{/id}', 'created_at': '2016-08-08T16:31:32Z', 'labels_url': 'https://api.github.com/repos/ligfx/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/ligfx/dolphin/statuses/{sha}', 'git_url': 'git://github.com/ligfx/dolphin.git', 'html_url': 'https://github.com/ligfx/dolphin', 'subscribers_url': 'https://api.github.com/repos/ligfx/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/ligfx/dolphin/hooks', 'homepage': 'https://github.com/dolphin-emu/dolphin', 'watchers_count': 0, 'svn_url': 'https://github.com/ligfx/dolphin', 'description': 'Personal development branch of dolphin-emu/dolphin.', 'full_name': 'ligfx/dolphin', 'branches_url': 'https://api.github.com/repos/ligfx/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/ligfx/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/ligfx/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:ligfx/dolphin.git', 'pulls_url': 'https://api.github.com/repos/ligfx/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/ligfx/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/ligfx/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-28T04:15:06Z', 'assignees_url': 'https://api.github.com/repos/ligfx/dolphin/assignees{/user}', 'updated_at': '2017-05-17T22:06:54Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/ligfx/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/ligfx/dolphin/keys{/key_id}', 'default_branch': 'ligfx', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/ligfx/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/ligfx/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/ligfx/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/ligfx/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/ligfx/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/ligfx/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/ligfx/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/ligfx/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/ligfx/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/ligfx/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/ligfx/dolphin', 'languages_url': 'https://api.github.com/repos/ligfx/dolphin/languages', 'id': 65220721, 'merges_url': 'https://api.github.com/repos/ligfx/dolphin/merges', 'clone_url': 'https://github.com/ligfx/dolphin.git', 'comments_url': 'https://api.github.com/repos/ligfx/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/ligfx/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/ligfx/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/ligfx/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/ligfx/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 307011, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/ligfx/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/ligfx/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/ligfx/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/ligfx/dolphin/issues/events{/number}', 'has_issues': False}}, 'additions': 0, 'deletions': 1, 'mergeable': None, 'merged_by': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'changed_files': 1, 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5836.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2f932273bbf43c1784e3ad6d7113ed4623f2450c'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5836'}}, 'mergeable_state': 'unknown', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5836.patch', 'title': 'LogManager: remove stand-alone semicolon'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T04:19:50.102995	{'gh_type': 'pull_request_review', 'raw': {'action': 'submitted', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/sadm/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/sadm/releases{/id}', 'created_at': '2013-07-19T22:07:05Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/sadm/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/sadm/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/sadm.git', 'html_url': 'https://github.com/dolphin-emu/sadm', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/sadm/hooks', 'homepage': None, 'watchers_count': 12, 'svn_url': 'https://github.com/dolphin-emu/sadm', 'description': 'Scripts and configurations for the Dolphin Emulator infrastructure', 'full_name': 'dolphin-emu/sadm', 'branches_url': 'https://api.github.com/repos/dolphin-emu/sadm/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/sadm/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/sadm.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/sadm/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/sadm/{archive_format}{/ref}', 'name': 'sadm', 'pushed_at': '2017-07-27T21:10:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/sadm/assignees{/user}', 'updated_at': '2017-06-29T20:19:22Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/sadm/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 16, 'private': False, 'forks_count': 24, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/sadm/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/sadm/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/sadm/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/sadm', 'languages_url': 'https://api.github.com/repos/dolphin-emu/sadm/languages', 'id': 11538142, 'merges_url': 'https://api.github.com/repos/dolphin-emu/sadm/merges', 'clone_url': 'https://github.com/dolphin-emu/sadm.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/sadm/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/sadm/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/sadm/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/sadm/contents/{+path}', 'language': 'Python', 'has_pages': False, 'size': 383, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/trees{/sha}', 'open_issues': 16, 'stargazers_count': 12, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/sadm/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/sadm/notifications{?since,all,participating}', 'watchers': 12, 'forks': 24, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/events{/number}', 'has_issues': True}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'review': {'commit_id': 'c990886e4c87b595353f6f858f6f799e54fdbc8a', '_links': {'html': {'href': 'https://github.com/dolphin-emu/sadm/pull/87#pullrequestreview-52841107'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87'}}, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'state': 'approved', 'submitted_at': '2017-07-28T04:19:48Z', 'body': 'My bad, thought "baserev" would be the merge base or what the PR is based on, not master.', 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87#pullrequestreview-52841107', 'id': 52841107, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/comments{/number}', 'merge_commit_sha': 'fa76ab4d810cfd66833f31729086be39b3d96a7c', 'url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/sadm/pull/87', 'id': 132846397, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87', 'assignees': [], 'created_at': '2017-07-27T21:09:18Z', 'body': 'Makes sure the baserev exists locally, in an attempt to fix the `invalid symmetric difference expression` errors. GitHub\'s "baserev" property is the current base branch head, which isn\'t guaranteed to exist in the PR branch (e.g. if it hasn\'t been rebased)!', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/sadm/statuses/c990886e4c87b595353f6f858f6f799e54fdbc8a', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': 'ca777b98b3877e529ca709d4c77dcdc9fe06a4a8', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/sadm/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/sadm/releases{/id}', 'created_at': '2013-07-19T22:07:05Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/sadm/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/sadm/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/sadm.git', 'html_url': 'https://github.com/dolphin-emu/sadm', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/sadm/hooks', 'homepage': None, 'watchers_count': 12, 'svn_url': 'https://github.com/dolphin-emu/sadm', 'description': 'Scripts and configurations for the Dolphin Emulator infrastructure', 'full_name': 'dolphin-emu/sadm', 'branches_url': 'https://api.github.com/repos/dolphin-emu/sadm/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/sadm/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/sadm.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/sadm/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/sadm/{archive_format}{/ref}', 'name': 'sadm', 'pushed_at': '2017-07-27T21:10:29Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/sadm/assignees{/user}', 'updated_at': '2017-06-29T20:19:22Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/sadm/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 16, 'private': False, 'forks_count': 24, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/sadm/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/sadm/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/sadm/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/sadm/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/sadm', 'languages_url': 'https://api.github.com/repos/dolphin-emu/sadm/languages', 'id': 11538142, 'merges_url': 'https://api.github.com/repos/dolphin-emu/sadm/merges', 'clone_url': 'https://github.com/dolphin-emu/sadm.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/sadm/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/sadm/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/sadm/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/sadm/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/sadm/contents/{+path}', 'language': 'Python', 'has_pages': False, 'size': 383, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/sadm/git/trees{/sha}', 'open_issues': 16, 'stargazers_count': 12, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/sadm/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/sadm/notifications{?since,all,participating}', 'watchers': 12, 'forks': 24, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/sadm/issues/events{/number}', 'has_issues': True}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 87, 'assignee': None, 'updated_at': '2017-07-28T04:19:48Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'ref': 'lintfetch', 'sha': 'c990886e4c87b595353f6f858f6f799e54fdbc8a', 'label': 'ligfx:lintfetch', 'repo': {'compare_url': 'https://api.github.com/repos/ligfx/sadm/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/ligfx/sadm/releases{/id}', 'created_at': '2016-10-25T21:39:42Z', 'labels_url': 'https://api.github.com/repos/ligfx/sadm/labels{/name}', 'statuses_url': 'https://api.github.com/repos/ligfx/sadm/statuses/{sha}', 'git_url': 'git://github.com/ligfx/sadm.git', 'html_url': 'https://github.com/ligfx/sadm', 'subscribers_url': 'https://api.github.com/repos/ligfx/sadm/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/ligfx/sadm/hooks', 'homepage': None, 'watchers_count': 0, 'svn_url': 'https://github.com/ligfx/sadm', 'description': 'Scripts and configurations for the Dolphin Emulator infrastructure', 'full_name': 'ligfx/sadm', 'branches_url': 'https://api.github.com/repos/ligfx/sadm/branches{/branch}', 'events_url': 'https://api.github.com/repos/ligfx/sadm/events', 'issue_comment_url': 'https://api.github.com/repos/ligfx/sadm/issues/comments{/number}', 'ssh_url': 'git@github.com:ligfx/sadm.git', 'pulls_url': 'https://api.github.com/repos/ligfx/sadm/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/ligfx/sadm/deployments', 'archive_url': 'https://api.github.com/repos/ligfx/sadm/{archive_format}{/ref}', 'name': 'sadm', 'pushed_at': '2017-07-27T21:10:28Z', 'assignees_url': 'https://api.github.com/repos/ligfx/sadm/assignees{/user}', 'updated_at': '2016-10-25T21:39:43Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/ligfx/sadm/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/ligfx/sadm/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/ligfx/sadm/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/ligfx/sadm/forks', 'git_commits_url': 'https://api.github.com/repos/ligfx/sadm/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/ligfx/sadm/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/ligfx/sadm/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/ligfx/sadm/subscription', 'blobs_url': 'https://api.github.com/repos/ligfx/sadm/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/ligfx/sadm/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/ligfx/sadm/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/ligfx/sadm/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/ligfx/sadm', 'languages_url': 'https://api.github.com/repos/ligfx/sadm/languages', 'id': 71941290, 'merges_url': 'https://api.github.com/repos/ligfx/sadm/merges', 'clone_url': 'https://github.com/ligfx/sadm.git', 'comments_url': 'https://api.github.com/repos/ligfx/sadm/comments{/number}', 'downloads_url': 'https://api.github.com/repos/ligfx/sadm/downloads', 'contributors_url': 'https://api.github.com/repos/ligfx/sadm/contributors', 'collaborators_url': 'https://api.github.com/repos/ligfx/sadm/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/ligfx/sadm/contents/{+path}', 'language': 'Python', 'has_pages': False, 'size': 375, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/ligfx/sadm/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/ligfx/sadm/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/ligfx/sadm/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/ligfx/sadm/issues/events{/number}', 'has_issues': False}}, 'diff_url': 'https://github.com/dolphin-emu/sadm/pull/87.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/statuses/c990886e4c87b595353f6f858f6f799e54fdbc8a'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/sadm/issues/87/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/sadm/pull/87'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/sadm/pulls/87/commits', 'patch_url': 'https://github.com/dolphin-emu/sadm/pull/87.patch', 'title': 'buildbot: fetch base rev before linting against it'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T04:15:16.347328	{'gh_type': 'pull_request', 'raw': {'action': 'opened', 'sender': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 151, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 151, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'number': 5836, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': None, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836', 'commits': 1, 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5836', 'id': 132891925, 'milestone': None, 'maintainer_can_modify': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836', 'assignees': [], 'created_at': '2017-07-28T04:15:15Z', 'body': 'My bad!', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'rebaseable': None, 'review_comments': 0, 'merged': False, 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '97ea97564fecac7759e33347ed50d61ad5c5d550', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 151, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 151, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 5836, 'assignee': None, 'comments': 0, 'updated_at': '2017-07-28T04:15:15Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'ref': 'patch-1', 'sha': '2f932273bbf43c1784e3ad6d7113ed4623f2450c', 'label': 'ligfx:patch-1', 'repo': {'compare_url': 'https://api.github.com/repos/ligfx/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/ligfx/dolphin/releases{/id}', 'created_at': '2016-08-08T16:31:32Z', 'labels_url': 'https://api.github.com/repos/ligfx/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/ligfx/dolphin/statuses/{sha}', 'git_url': 'git://github.com/ligfx/dolphin.git', 'html_url': 'https://github.com/ligfx/dolphin', 'subscribers_url': 'https://api.github.com/repos/ligfx/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/ligfx/dolphin/hooks', 'homepage': 'https://github.com/dolphin-emu/dolphin', 'watchers_count': 0, 'svn_url': 'https://github.com/ligfx/dolphin', 'description': 'Personal development branch of dolphin-emu/dolphin.', 'full_name': 'ligfx/dolphin', 'branches_url': 'https://api.github.com/repos/ligfx/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/ligfx/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/ligfx/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:ligfx/dolphin.git', 'pulls_url': 'https://api.github.com/repos/ligfx/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/ligfx/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/ligfx/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-28T04:15:06Z', 'assignees_url': 'https://api.github.com/repos/ligfx/dolphin/assignees{/user}', 'updated_at': '2017-05-17T22:06:54Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/ligfx/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/ligfx/dolphin/keys{/key_id}', 'default_branch': 'ligfx', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/ligfx/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/ligfx/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/ligfx/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/ligfx/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/ligfx/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/ligfx/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/ligfx/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/ligfx/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/ligfx/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/ligfx/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/ligfx/dolphin', 'languages_url': 'https://api.github.com/repos/ligfx/dolphin/languages', 'id': 65220721, 'merges_url': 'https://api.github.com/repos/ligfx/dolphin/merges', 'clone_url': 'https://github.com/ligfx/dolphin.git', 'comments_url': 'https://api.github.com/repos/ligfx/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/ligfx/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/ligfx/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/ligfx/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/ligfx/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 307011, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/ligfx/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/ligfx/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/ligfx/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/ligfx/dolphin/issues/events{/number}', 'has_issues': False}}, 'additions': 0, 'deletions': 1, 'mergeable': None, 'merged_by': None, 'changed_files': 1, 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5836.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2f932273bbf43c1784e3ad6d7113ed4623f2450c'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5836/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5836'}}, 'mergeable_state': 'unknown', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5836/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5836.patch', 'title': 'LogManager: remove stand-alone semicolon'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T02:45:14.436663	{'gh_type': 'pull_request_review', 'raw': {'action': 'submitted', 'sender': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'review': {'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52833159'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'state': 'approved', 'submitted_at': '2017-07-28T02:45:11Z', 'body': 'Glossed over some things (GLInterface and some shaders) but largely this is really solid code.  Great job Stenzek!', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52833159', 'id': 52833159, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': '36b35086dba13ef6c3d6395897a0dc9010e75164', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 127615246, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'updated_at': '2017-07-28T02:45:11Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'ref': 'ubershaders', 'sha': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'label': 'stenzek:ubershaders', 'repo': {'compare_url': 'https://api.github.com/repos/stenzek/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/stenzek/dolphin/releases{/id}', 'created_at': '2015-11-24T08:34:41Z', 'labels_url': 'https://api.github.com/repos/stenzek/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/stenzek/dolphin/statuses/{sha}', 'git_url': 'git://github.com/stenzek/dolphin.git', 'html_url': 'https://github.com/stenzek/dolphin', 'subscribers_url': 'https://api.github.com/repos/stenzek/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/stenzek/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 6, 'svn_url': 'https://github.com/stenzek/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'stenzek/dolphin', 'branches_url': 'https://api.github.com/repos/stenzek/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/stenzek/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/stenzek/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:stenzek/dolphin.git', 'pulls_url': 'https://api.github.com/repos/stenzek/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/stenzek/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/stenzek/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T12:00:45Z', 'assignees_url': 'https://api.github.com/repos/stenzek/dolphin/assignees{/user}', 'updated_at': '2017-05-30T22:35:50Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/stenzek/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/stenzek/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 1, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/stenzek/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/stenzek/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/stenzek/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/stenzek/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/stenzek/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/stenzek/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/stenzek/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/stenzek/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/stenzek/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/stenzek/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/stenzek/dolphin', 'languages_url': 'https://api.github.com/repos/stenzek/dolphin/languages', 'id': 46777992, 'merges_url': 'https://api.github.com/repos/stenzek/dolphin/merges', 'clone_url': 'https://github.com/stenzek/dolphin.git', 'comments_url': 'https://api.github.com/repos/stenzek/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/stenzek/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/stenzek/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/stenzek/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/stenzek/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 308782, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/stenzek/dolphin/git/trees{/sha}', 'open_issues': 1, 'stargazers_count': 6, 'milestones_url': 'https://api.github.com/repos/stenzek/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/stenzek/dolphin/notifications{?since,all,participating}', 'watchers': 6, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/stenzek/dolphin/issues/events{/number}', 'has_issues': False}}, 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'title': 'Ubershaders 2.0'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T02:40:34.072838	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'changes': {'body': {'from': "Not a biggied but it'd be nice to have cleaned these up with c++ style casts"}}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -194,18 +194,21 @@ void VertexManagerBase::Flush()\n \n #if defined(_DEBUG) || defined(DEBUGFAST)\n   PRIM_LOG("frame%d:\\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d",\n-           g_ActiveConfig.iSaveTargetId, xfmem.numTexGen.numTexGens, xfmem.numChan.numColorChans,\n-           xfmem.dualTexTrans.enabled, bpmem.ztex2.op, (int)bpmem.blendmode.colorupdate,\n-           (int)bpmem.blendmode.alphaupdate, (int)bpmem.zmode.updateenable);\n+           g_ActiveConfig.iSaveTargetId, (int)xfmem.numTexGen.numTexGens,', 'created_at': '2017-07-28T02:40:26Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002156', 'position': 7, 'pull_request_review_id': 52832764, 'updated_at': '2017-07-28T02:40:26Z', 'id': 130002156, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 7, 'body': "Not a biggied but it'd be nice to have cleaned these up with c++ style casts", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002156'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/VertexManagerBase.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': '36b35086dba13ef6c3d6395897a0dc9010e75164', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 127615246, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'updated_at': '2017-07-28T02:40:33Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'ref': 'ubershaders', 'sha': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'label': 'stenzek:ubershaders', 'repo': {'compare_url': 'https://api.github.com/repos/stenzek/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/stenzek/dolphin/releases{/id}', 'created_at': '2015-11-24T08:34:41Z', 'labels_url': 'https://api.github.com/repos/stenzek/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/stenzek/dolphin/statuses/{sha}', 'git_url': 'git://github.com/stenzek/dolphin.git', 'html_url': 'https://github.com/stenzek/dolphin', 'subscribers_url': 'https://api.github.com/repos/stenzek/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/stenzek/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 6, 'svn_url': 'https://github.com/stenzek/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'stenzek/dolphin', 'branches_url': 'https://api.github.com/repos/stenzek/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/stenzek/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/stenzek/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:stenzek/dolphin.git', 'pulls_url': 'https://api.github.com/repos/stenzek/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/stenzek/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/stenzek/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T12:00:45Z', 'assignees_url': 'https://api.github.com/repos/stenzek/dolphin/assignees{/user}', 'updated_at': '2017-05-30T22:35:50Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/stenzek/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/stenzek/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 1, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/stenzek/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/stenzek/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/stenzek/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/stenzek/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/stenzek/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/stenzek/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/stenzek/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/stenzek/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/stenzek/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/stenzek/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/stenzek/dolphin', 'languages_url': 'https://api.github.com/repos/stenzek/dolphin/languages', 'id': 46777992, 'merges_url': 'https://api.github.com/repos/stenzek/dolphin/merges', 'clone_url': 'https://github.com/stenzek/dolphin.git', 'comments_url': 'https://api.github.com/repos/stenzek/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/stenzek/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/stenzek/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/stenzek/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/stenzek/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 308782, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/stenzek/dolphin/git/trees{/sha}', 'open_issues': 1, 'stargazers_count': 6, 'milestones_url': 'https://api.github.com/repos/stenzek/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/stenzek/dolphin/notifications{?since,all,participating}', 'watchers': 6, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/stenzek/dolphin/issues/events{/number}', 'has_issues': False}}, 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'title': 'Ubershaders 2.0'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T02:40:27.726489	{'gh_type': 'pull_request_review', 'raw': {'action': 'submitted', 'sender': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'review': {'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52832764'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'state': 'commented', 'submitted_at': '2017-07-28T02:40:26Z', 'body': None, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#pullrequestreview-52832764', 'id': 52832764, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': '36b35086dba13ef6c3d6395897a0dc9010e75164', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 127615246, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'updated_at': '2017-07-28T02:40:26Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'ref': 'ubershaders', 'sha': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'label': 'stenzek:ubershaders', 'repo': {'compare_url': 'https://api.github.com/repos/stenzek/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/stenzek/dolphin/releases{/id}', 'created_at': '2015-11-24T08:34:41Z', 'labels_url': 'https://api.github.com/repos/stenzek/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/stenzek/dolphin/statuses/{sha}', 'git_url': 'git://github.com/stenzek/dolphin.git', 'html_url': 'https://github.com/stenzek/dolphin', 'subscribers_url': 'https://api.github.com/repos/stenzek/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/stenzek/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 6, 'svn_url': 'https://github.com/stenzek/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'stenzek/dolphin', 'branches_url': 'https://api.github.com/repos/stenzek/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/stenzek/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/stenzek/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:stenzek/dolphin.git', 'pulls_url': 'https://api.github.com/repos/stenzek/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/stenzek/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/stenzek/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T12:00:45Z', 'assignees_url': 'https://api.github.com/repos/stenzek/dolphin/assignees{/user}', 'updated_at': '2017-05-30T22:35:50Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/stenzek/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/stenzek/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 1, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/stenzek/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/stenzek/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/stenzek/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/stenzek/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/stenzek/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/stenzek/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/stenzek/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/stenzek/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/stenzek/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/stenzek/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/stenzek/dolphin', 'languages_url': 'https://api.github.com/repos/stenzek/dolphin/languages', 'id': 46777992, 'merges_url': 'https://api.github.com/repos/stenzek/dolphin/merges', 'clone_url': 'https://github.com/stenzek/dolphin.git', 'comments_url': 'https://api.github.com/repos/stenzek/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/stenzek/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/stenzek/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/stenzek/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/stenzek/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 308782, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/stenzek/dolphin/git/trees{/sha}', 'open_issues': 1, 'stargazers_count': 6, 'milestones_url': 'https://api.github.com/repos/stenzek/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/stenzek/dolphin/notifications{?since,all,participating}', 'watchers': 6, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/stenzek/dolphin/issues/events{/number}', 'has_issues': False}}, 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'title': 'Ubershaders 2.0'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T02:40:26.872223	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -194,18 +194,21 @@ void VertexManagerBase::Flush()\n \n #if defined(_DEBUG) || defined(DEBUGFAST)\n   PRIM_LOG("frame%d:\\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d",\n-           g_ActiveConfig.iSaveTargetId, xfmem.numTexGen.numTexGens, xfmem.numChan.numColorChans,\n-           xfmem.dualTexTrans.enabled, bpmem.ztex2.op, (int)bpmem.blendmode.colorupdate,\n-           (int)bpmem.blendmode.alphaupdate, (int)bpmem.zmode.updateenable);\n+           g_ActiveConfig.iSaveTargetId, (int)xfmem.numTexGen.numTexGens,', 'created_at': '2017-07-28T02:40:26Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002156', 'position': 7, 'pull_request_review_id': 52832764, 'updated_at': '2017-07-28T02:40:26Z', 'id': 130002156, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 7, 'body': "Not a biggied but it'd be nice to have cleaned these up with c++ style casts", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002156'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002156'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/VertexManagerBase.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': '36b35086dba13ef6c3d6395897a0dc9010e75164', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 127615246, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'number': 5702, 'assignee': None, 'updated_at': '2017-07-28T02:40:26Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'ref': 'ubershaders', 'sha': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'label': 'stenzek:ubershaders', 'repo': {'compare_url': 'https://api.github.com/repos/stenzek/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/stenzek/dolphin/releases{/id}', 'created_at': '2015-11-24T08:34:41Z', 'labels_url': 'https://api.github.com/repos/stenzek/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/stenzek/dolphin/statuses/{sha}', 'git_url': 'git://github.com/stenzek/dolphin.git', 'html_url': 'https://github.com/stenzek/dolphin', 'subscribers_url': 'https://api.github.com/repos/stenzek/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/stenzek/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 6, 'svn_url': 'https://github.com/stenzek/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'stenzek/dolphin', 'branches_url': 'https://api.github.com/repos/stenzek/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/stenzek/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/stenzek/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:stenzek/dolphin.git', 'pulls_url': 'https://api.github.com/repos/stenzek/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/stenzek/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/stenzek/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T12:00:45Z', 'assignees_url': 'https://api.github.com/repos/stenzek/dolphin/assignees{/user}', 'updated_at': '2017-05-30T22:35:50Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/stenzek/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/stenzek/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 1, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/stenzek/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/stenzek/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/stenzek/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/stenzek/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/stenzek/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/stenzek/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/stenzek/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/stenzek/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/stenzek/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/stenzek/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'url': 'https://api.github.com/users/stenzek', 'gravatar_id': '', 'html_url': 'https://github.com/stenzek', 'id': 11288319, 'repos_url': 'https://api.github.com/users/stenzek/repos', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'login': 'stenzek', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'followers_url': 'https://api.github.com/users/stenzek/followers', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/stenzek/dolphin', 'languages_url': 'https://api.github.com/repos/stenzek/dolphin/languages', 'id': 46777992, 'merges_url': 'https://api.github.com/repos/stenzek/dolphin/merges', 'clone_url': 'https://github.com/stenzek/dolphin.git', 'comments_url': 'https://api.github.com/repos/stenzek/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/stenzek/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/stenzek/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/stenzek/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/stenzek/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 308782, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/stenzek/dolphin/git/trees{/sha}', 'open_issues': 1, 'stargazers_count': 6, 'milestones_url': 'https://api.github.com/repos/stenzek/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/stenzek/dolphin/notifications{?since,all,participating}', 'watchers': 6, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/stenzek/dolphin/issues/events{/number}', 'has_issues': False}}, 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5702.patch', 'title': 'Ubershaders 2.0'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-07-28T02:38:48.317279	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3479, 'forks': 900, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'diff_hunk': '@@ -0,0 +1,446 @@\n+// Copyright 2015 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "VideoCommon/UberShaderVertex.h"\n+#include "VideoCommon/DriverDetails.h"\n+#include "VideoCommon/NativeVertexFormat.h"\n+#include "VideoCommon/UberShaderCommon.h"\n+#include "VideoCommon/VertexShaderGen.h"\n+#include "VideoCommon/VideoConfig.h"\n+#include "VideoCommon/XFMemory.h"\n+\n+namespace UberShader\n+{\n+VertexShaderUid GetVertexShaderUid()\n+{\n+  VertexShaderUid out;\n+  vertex_ubershader_uid_data* uid_data = out.GetUidData<vertex_ubershader_uid_data>();\n+  memset(uid_data, 0, sizeof(*uid_data));\n+  uid_data->num_texgens = xfmem.numTexGen.numTexGens;\n+  return out;\n+}\n+\n+static void GenVertexShaderTexGens(APIType ApiType, u32 numTexgen, ShaderCode& out);\n+\n+ShaderCode GenVertexShader(APIType ApiType, const ShaderHostConfig& host_config,\n+                           const vertex_ubershader_uid_data* uid_data)\n+{\n+  const bool msaa = host_config.msaa;\n+  const bool ssaa = host_config.ssaa;\n+  const bool per_pixel_lighting = host_config.per_pixel_lighting;\n+  const u32 numTexgen = uid_data->num_texgens;\n+  ShaderCode out;\n+\n+  out.Write("// Vertex UberShader\\n\\n");\n+  out.Write("%s", s_lighting_struct);\n+\n+  // uniforms\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+    out.Write("UBO_BINDING(std140, 2) uniform VSBlock {\\n");\n+  else\n+    out.Write("cbuffer VSBlock {\\n");\n+  out.Write(s_shader_uniforms);\n+  out.Write("};\\n");\n+\n+  out.Write("struct VS_OUTPUT {\\n");\n+  GenerateVSOutputMembers(out, ApiType, numTexgen, per_pixel_lighting, "");\n+  out.Write("};\\n\\n");\n+\n+  WriteUberShaderCommonHeader(out, ApiType, host_config);\n+  WriteLightingFunction(out);\n+\n+  if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)\n+  {\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawpos;\\n", SHADER_POSITION_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in uint4 posmtx;\\n", SHADER_POSMTX_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm0;\\n", SHADER_NORM0_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm1;\\n", SHADER_NORM1_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm2;\\n", SHADER_NORM2_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawcolor0;\\n", SHADER_COLOR0_ATTRIB);\n+    out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawcolor1;\\n", SHADER_COLOR1_ATTRIB);\n+    for (int i = 0; i < 8; ++i)\n+      out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawtex%d;\\n", SHADER_TEXTURE0_ATTRIB + i, i);\n+\n+    // We need to always use output blocks for Vulkan, but geometry shaders are also optional.\n+    if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan)\n+    {\n+      out.Write("VARYING_LOCATION(0) out VertexData {\\n");\n+      GenerateVSOutputMembers(out, ApiType, numTexgen, per_pixel_lighting,\n+                              GetInterpolationQualifier(msaa, ssaa, true, false));\n+      out.Write("} vs;\\n");\n+    }\n+    else\n+    {\n+      // Let\'s set up attributes\n+      for (u32 i = 0; i < numTexgen; ++i)\n+        out.Write("%s out float3 tex%u;\\n", GetInterpolationQualifier(msaa, ssaa), i);\n+\n+      out.Write("%s out float4 clipPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      if (per_pixel_lighting)\n+      {\n+        out.Write("%s out float3 Normal;\\n", GetInterpolationQualifier(msaa, ssaa));\n+        out.Write("%s out float3 WorldPos;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      }\n+      out.Write("%s out float4 colors_0;\\n", GetInterpolationQualifier(msaa, ssaa));\n+      out.Write("%s out float4 colors_1;\\n", GetInterpolationQualifier(msaa, ssaa));\n+    }\n+\n+    out.Write("void main()\\n{\\n");\n+  }\n+  else  // D3D\n+  {\n+    out.Write("VS_OUTPUT main(\\n");\n+\n+    // inputs\n+    out.Write("  float3 rawnorm0 : NORMAL0,\\n");\n+    out.Write("  float3 rawnorm1 : NORMAL1,\\n");\n+    out.Write("  float3 rawnorm2 : NORMAL2,\\n");\n+    out.Write("  float4 rawcolor0 : COLOR0,\\n");\n+    out.Write("  float4 rawcolor1 : COLOR1,\\n");\n+    for (int i = 0; i < 8; ++i)\n+      out.Write("  float3 rawtex%d : TEXCOORD%d,\\n", i, i);\n+    out.Write("  uint posmtx : BLENDINDICES,\\n");\n+    out.Write("  float4 rawpos : POSITION) {\\n");\n+  }\n+\n+  out.Write("VS_OUTPUT o;\\n"\n+            "\\n");\n+\n+  // Transforms\n+  out.Write("// Position matrix\\n"\n+            "float4 P0;\\n"\n+            "float4 P1;\\n"\n+            "float4 P2;\\n"\n+            "\\n"\n+            "// Normal matrix\\n"\n+            "float3 N0;\\n"\n+            "float3 N1;\\n"\n+            "float3 N2;\\n"\n+            "\\n"\n+            "if ((components & %uu) != 0u) {// VB_HAS_POSMTXIDX\\n",\n+            VB_HAS_POSMTXIDX);\n+  out.Write("  // Vertex format has a per-vertex matrix\\n"\n+            "  int posidx = int(posmtx.r);\\n"\n+            "  P0 = " I_TRANSFORMMATRICES "[posidx];\\n"\n+            "  P1 = " I_TRANSFORMMATRICES "[posidx+1];\\n"\n+            "  P2 = " I_TRANSFORMMATRICES "[posidx+2];\\n"\n+            "\\n"\n+            "  int normidx = posidx >= 32 ? (posidx - 32) : posidx;\\n"\n+            "  N0 = " I_NORMALMATRICES "[normidx].xyz;\\n"\n+            "  N1 = " I_NORMALMATRICES "[normidx+1].xyz;\\n"\n+            "  N2 = " I_NORMALMATRICES "[normidx+2].xyz;\\n"\n+            "} else {\\n"\n+            "  // One shared matrix\\n"\n+            "  P0 = " I_POSNORMALMATRIX "[0];\\n"\n+            "  P1 = " I_POSNORMALMATRIX "[1];\\n"\n+            "  P2 = " I_POSNORMALMATRIX "[2];\\n"\n+            "  N0 = " I_POSNORMALMATRIX "[3].xyz;\\n"\n+            "  N1 = " I_POSNORMALMATRIX "[4].xyz;\\n"\n+            "  N2 = " I_POSNORMALMATRIX "[5].xyz;\\n"\n+            "}\\n"\n+            "\\n"\n+            "float4 pos = float4(dot(P0, rawpos), dot(P1, rawpos), dot(P2, rawpos), 1.0);\\n"\n+            "o.pos = float4(dot(" I_PROJECTION "[0], pos), dot(" I_PROJECTION\n+            "[1], pos), dot(" I_PROJECTION "[2], pos), dot(" I_PROJECTION "[3], pos));\\n"\n+            "\\n"\n+            "// Only the first normal gets normalized (TODO: why?)\\n"\n+            "float3 _norm0 = float3(0.0, 0.0, 0.0);\\n"\n+            "if ((components & %uu) != 0u) // VB_HAS_NRM0\\n",\n+            VB_HAS_NRM0);\n+  out.Write(\n+      "  _norm0 = normalize(float3(dot(N0, rawnorm0), dot(N1, rawnorm0), dot(N2, rawnorm0)));\\n"\n+      "\\n"\n+      "float3 _norm1 = float3(0.0, 0.0, 0.0);\\n"\n+      "if ((components & %uu) != 0u) // VB_HAS_NRM1\\n",\n+      VB_HAS_NRM1);\n+  out.Write("  _norm1 = float3(dot(N0, rawnorm1), dot(N1, rawnorm1), dot(N2, rawnorm1));\\n"\n+            "\\n"\n+            "float3 _norm2 = float3(0.0, 0.0, 0.0);\\n"\n+            "if ((components & %uu) != 0u) // VB_HAS_NRM2\\n",\n+            VB_HAS_NRM2);\n+  out.Write("  _norm2 = float3(dot(N0, rawnorm2), dot(N1, rawnorm2), dot(N2, rawnorm2));\\n"\n+            "\\n");\n+\n+  // Hardware Lighting\n+  WriteVertexLighting(out, ApiType, "pos.xyz", "_norm0", "rawcolor0", "rawcolor1", "o.colors_0",\n+                      "o.colors_1");\n+\n+  // Texture Coordinates\n+  if (numTexgen > 0)\n+    GenVertexShaderTexGens(ApiType, numTexgen, out);\n+\n+  // clipPos/w needs to be done in pixel shader, not here\n+  out.Write("o.clipPos = o.pos;\\n");\n+\n+  if (per_pixel_lighting)\n+  {\n+    out.Write("o.Normal = _norm0;\\n");\n+    out.Write("o.WorldPos = pos.xyz;\\n");\n+    out.Write("if ((components & %uu) != 0u) // VB_HAS_COL0\\n", VB_HAS_COL0);\n+    out.Write("  o.colors_0 = rawcolor0;\\n");\n+    out.Write("if ((components & %uu) != 0u) // VB_HAS_COL1\\n", VB_HAS_COL1);\n+    out.Write("  o.colors_1 = rawcolor1;\\n");\n+  }\n+\n+  // If we can disable the incorrect depth clipping planes using depth clamping, then we can do\n+  // our own depth clipping and calculate the depth range before the perspective divide if\n+  // necessary.\n+  if (host_config.backend_depth_clamp)\n+  {\n+    // Since we\'re adjusting z for the depth range before the perspective divide, we have to do our\n+    // own clipping. We want to clip so that -w <= z <= 0, which matches the console -1..0 range.\n+    // We adjust our depth value for clipping purposes to match the perspective projection in the\n+    // software backend, which is a hack to fix Sonic Adventure and Unleashed games.\n+    out.Write("float clipDepth = o.pos.z * (1.0 - 1e-7);\\n");\n+    out.Write("o.clipDist0 = clipDepth + o.pos.w;\\n");  // Near: z < -w\n+    out.Write("o.clipDist1 = -clipDepth;\\n");           // Far: z > 0\n+  }\n+\n+  // Write the true depth value. If the game uses depth textures, then the pixel shader will\n+  // override it with the correct values if not then early z culling will improve speed.\n+  // There are two different ways to do this, when the depth range is oversized, we process\n+  // the depth range in the vertex shader, if not we let the host driver handle it.\n+  //\n+  // Adjust z for the depth range. We\'re using an equation which incorperates a depth inversion,\n+  // so we can map the console -1..0 range to the 0..1 range used in the depth buffer.\n+  // We have to handle the depth range in the vertex shader instead of after the perspective\n+  // divide, because some games will use a depth range larger than what is allowed by the\n+  // graphics API. These large depth ranges will still be clipped to the 0..1 range, so these\n+  // games effectively add a depth bias to the values written to the depth buffer.\n+  out.Write("o.pos.z = o.pos.w * " I_PIXELCENTERCORRECTION ".w - "\n+            "o.pos.z * " I_PIXELCENTERCORRECTION ".z;\\n");\n+\n+  if (!host_config.backend_clip_control)\n+  {\n+    // If the graphics API doesn\'t support a depth range of 0..1, then we need to map z to\n+    // the -1..1 range. Unfortunately we have to use a substraction, which is a lossy floating-point\n+    // operation that can introduce a round-trip error.\n+    out.Write("o.pos.z = o.pos.z * 2.0 - o.pos.w;\\n");\n+  }\n+\n+  // Correct for negative viewports by mirroring all vertices. We need to negate the height here,\n+  // since the viewport height is already negated by the render backend.\n+  out.Write("o.pos.xy *= sign(" I_PIXELCENTERCORRECTION ".xy * float2(1.0, -1.0));\\n");\n+\n+  // The console GPU places the pixel center at 7/12 in screen space unless\n+  // antialiasing is enabled, while D3D and OpenGL place it at 0.5. This results\n+  // in some primitives being placed one pixel too far to the bottom-right,\n+  // which in turn can be critical if it happens for clear quads.\n+  // Hence, we compensate for this pixel center difference so that primitives\n+  // get rasterized correctly.\n+  out.Write("o.pos.xy = o.pos.xy - o.pos.w * " I_PIXELCENTERCORRECTION ".xy;\\n");', 'created_at': '2017-07-28T02:38:46Z', 'user': {'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'url': 'https://api.github.com/users/iwubcode', 'gravatar_id': '', 'html_url': 'https://github.com/iwubcode', 'id': 15224722, 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'login': 'iwubcode', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002036', 'position': 232, 'pull_request_review_id': 52832628, 'updated_at': '2017-07-28T02:38:46Z', 'id': 130002036, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'original_position': 232, 'body': 'Should we include the vertex rounding in uber-shaders?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002036', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5702#discussion_r130002036'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/130002036'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702'}}, 'original_commit_id': '2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'path': 'Source/Core/VideoCommon/UberShaderVertex.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': '36b35086dba13ef6c3d6395897a0dc9010e75164', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5702', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5702', 'id': 127615246, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5702', 'assignees': [], 'created_at': '2017-06-27T05:39:58Z', 'body': '**If users want to test, use this link:** https://dl.dolphin-emu.org/prs/pr-5702-dolphin-latest-x64.7z\r\n\r\nThis pull request completes the implemention of ubershaders in the graphics backends, started by @phire. Most of the hard work was done already by them, I just had to write the vertex ubershaders, integrate it into the backends, and fix bugs.\r\n\r\nLast time I checked, ubershaders are fifoci regression-free on GL. Haven\'t tried D3D or Vulkan.\r\n\r\nIn the graphics options under the enhancements tab, there is a new drop-down field, "Ubershader mode". The options are:\r\n\r\n- **Disabled:** "Classic" mode with normal shader generation. Stuttering will still exist, same as before. Recommended for low-end systems.\r\n- **Hybrid:** Compiles specialized shaders asynchronously, while this occurs, ubershaders will be used. Best balance of performance and stuttering.  **This is not the same as the Ishiiruka async shaders!** Game objects will continue to render as normal while shaders are being compiled. Not guaranteed to remove stuttering completely, as drivers often defer some work to the first time a program is used, and/or GL_LINK_STATUS is checked (*cough* NVIDIA), which we do on the main thread.\r\n- **Exclusive:** Only use ubershaders for rendering. Largest performance hit. Don\'t expect to hit full speed at high resolutions, even on high-end systems. Least possible amount of compilation "stutter".\r\n\r\nThere\'s also a few hidden options, which you can modify via the ini:\r\n\r\n- **BackgroundShaderCompiling:** Enables aforementioned "hybrid" mode.\r\n- **DisableSpecializedShaders:** Enables aforementioned "exclusive" mode.\r\n- **PrecompileUberShaders:** Precompiles all ubershader combinations at boot time. For drivers that support a shader cache, this will only take time on the first boot, subsequent boots should be very fast. You want to leave this enabled for the best experience, as the ubershader compile time is much longer than the specialized shader compile time.\r\n- **ShaderCompilerThreads:** Sets the number of worker threads created for asynchronous shader compilation. Most drivers have some sort of lock involved in shader creation, so this will only scale up to a certain point. It defaults to 1, as this hopefully should be sufficient for background compiling in most cases, as well as not oversubscribing those with fewer CPU cores. This can be also be set to -1, which determines the number of threads based on system it is running, or 0, which disables asynchronous compilation.\r\n- **ForceVertexUberShaders:** Replaces specialized vertex shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n- **ForcePixelUberShaders:** Replaces specialized pixel shaders with uber shaders. Only really useful for debugging issues in the uber shaders.\r\n\r\n**Feel free to report bugs at this point.** Please attach a fifolog where possible, and provide as much detail as you can, as this will allow me to get the issue fixed faster.\r\n\r\nFor the best experience depending on your operating system and GPU vendor:\r\n\r\n- **Intel** on **Windows**\r\n  - Use **D3D** for *Exclusive* or *Hybrid* modes.\r\n  - Driver generates variants with OpenGL -> suttering.\r\n  - The Vulkan driver only supports Skylake+, and is buggy anyway.\r\n- **Intel** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - anv works quite well.\r\n  - i965 doesn\'t share compiled code between contexts, which means the main context will always recompile and stutter.\r\n- **AMD** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode.\r\n  - Use **D3D** or **Vulkan** for *Exclusive* mode.\r\n  - The AMD GL driver is just slow in general.\r\n  - Vulkan doesn\'t work too badly, but the shader cache is ineffective, leading to long boot times.\r\n- **AMD** on **Linux**\r\n  - Use **Vulkan** for *Exclusive* or *Hybrid* modes.\r\n  - I haven\'t tested radeonsi, but radv likely behaves similarly to anv. If radeonsi shares GPU code between contexts, GL may be an option.\r\n- **NVIDIA** on **Windows**\r\n  - Use **D3D** for *Hybrid* mode. **GL** isn\'t too bad with the latest changes, but may still have some stutter.\r\n  - Use **D3D** or **GL** or **Vulkan** for *Exclusive* mode. D3D will get you the best performance.\r\n- **NVIDIA** on **Linux**\r\n  - Use **GL** for *Hybrid* mode.\r\n  - Use **GL** or **Vulkan** for *Exclusive* mode. GL performs slightly better.\r\n\r\nFew notes:\r\n\r\n- **There is a large performance hit when using ubershaders.** This is most noticeable in the exclusive mode. In the hybrid mode, ubershaders likely aren\'t used for every object being rendered, meaning the overall performance hit will be lower. There\'s still room for optimizations, but these can come later.\r\n- **Per-pixel lighting is not currently compatible with ubershaders.** If you enable per-pixel lighting, ubershaders won\'t be used, and you will still experience compilation stutter.\r\n- The ubershader caches are shared between games, hence the dependency on PR #5679. The compile times can be pretty long, so it makes sense to share them where possible.\r\n- **D3D11 currently offers the best experience in regards to compilation stutter.** The NV GL driver still generates variants behind our back, which sometimes creates a noticeable hitch.\r\n- AMD\'s Vulkan driver is garbage and doesn\'t use a pipeline cache, so every variant is expensive to create. This means when we generate ubershader variants, it\'ll still stutter. Not much we can do about this, unless they implement derived pipelines, which we could potentially make use of. They also fail at arrays in shader input/output interfaces, forcing an ugly workaround.\r\n- Progress dialogs for shader compilation at boot are implemented for D3D, and Vulkan only.\r\n- OpenGL asynchronous compilation is currently done via the ARB_parallel_shader_compile extension, currently only implemented by NVIDIA. We may consider a multi-context approach in the future, but for other vendors, you may wish to use one of the other backends.\r\n', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/2458ab1e279cbf7a2d4197a0b31fd1c561746d86', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '7a51b0bcec891b95b3ea98b03e239ec7937ceb13', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3479, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-07-27T21:10:11Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-07-27T23:15:37Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 150, 'private': False, 'forks_count': 900, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 344433, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 150, 'stargazers_count': 3479, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}'