Compare commits

...

12 Commits

Author SHA1 Message Date
EXtremeExploit
559e4e75eb GameDB: Add memcard filters for Mortal Kombat Armageddon Premium 2025-04-18 10:10:16 -04:00
TheLastRar
8ae84614d5 SDLInputSource: Support auto mapping pressure sense buttons
Also provide UI strings and icons
2025-04-18 10:09:48 -04:00
TheLastRar
18a7e8b22c SDLInputSource: Enable support for the Sixaxis driver on Windows 2025-04-18 10:09:48 -04:00
Immersion95
01120f6120 GameDB: Adds Software FMV hack to Soulcalibur 2/3 Games
Fixes https://github.com/PCSX2/pcsx2/issues/2852
2025-04-18 02:44:08 +02:00
TheLastRar
07be6bb5ae DEV9: Ignore UDP socket ICMP errors on recv
These where already ignored on send
2025-04-18 02:39:06 +02:00
TheLastRar
39b4905ef1 DEV9: Fix race condition when handling closed socket connections 2025-04-18 02:39:06 +02:00
TheLastRar
6c49a5aa9d DEV9: Fix race condition in UDP sockets 2025-04-18 02:39:06 +02:00
TheLastRar
aaeff2ea0f DEV9: Deduplicate some UDP sockets code 2025-04-18 02:39:06 +02:00
PCSX2 Bot
cd48e78667 [ci skip] Qt: Update Base Translation. 2025-04-18 02:28:36 +02:00
KamFretoZ
f2ab4e840e Qt: Change Default Theme 2025-04-18 02:28:15 +02:00
dependabot[bot]
9a476f8283 Bump @octokit/request and @octokit/plugin-throttling
Bumps [@octokit/request](https://github.com/octokit/request.js) to 9.2.2 and updates ancestor dependency [@octokit/plugin-throttling](https://github.com/octokit/plugin-throttling.js). These dependencies need to be updated together.


Updates `@octokit/request` from 5.6.2 to 9.2.2
- [Release notes](https://github.com/octokit/request.js/releases)
- [Commits](https://github.com/octokit/request.js/compare/v5.6.2...v9.2.2)

Updates `@octokit/plugin-throttling` from 3.5.2 to 9.6.0
- [Release notes](https://github.com/octokit/plugin-throttling.js/releases)
- [Commits](https://github.com/octokit/plugin-throttling.js/compare/v3.5.2...v9.6.0)

---
updated-dependencies:
- dependency-name: "@octokit/request"
  dependency-version: 9.2.2
  dependency-type: indirect
- dependency-name: "@octokit/plugin-throttling"
  dependency-version: 9.6.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-17 19:32:38 -04:00
lightningterror
8e24ad724c CDVD: Adjust ram requirements when precaching. 2025-04-17 18:59:14 -04:00
20 changed files with 757 additions and 587 deletions

View File

@@ -9,123 +9,11 @@
"license": "ISC",
"dependencies": {
"@octokit/plugin-retry": "^3.0.9",
"@octokit/plugin-throttling": "^3.5.2",
"@octokit/plugin-throttling": "^9.6.0",
"@octokit/rest": "^21.1.1"
}
},
"node_modules/@octokit/auth-token": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
"peer": true,
"dependencies": {
"@octokit/types": "^6.0.3"
}
},
"node_modules/@octokit/core": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
"integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
"peer": true,
"dependencies": {
"@octokit/auth-token": "^2.4.4",
"@octokit/graphql": "^4.5.8",
"@octokit/request": "^5.6.0",
"@octokit/request-error": "^2.0.5",
"@octokit/types": "^6.0.3",
"before-after-hook": "^2.2.0",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/endpoint": {
"version": "6.0.12",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
"peer": true,
"dependencies": {
"@octokit/types": "^6.0.3",
"is-plain-object": "^5.0.0",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/graphql": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
"peer": true,
"dependencies": {
"@octokit/request": "^5.6.0",
"@octokit/types": "^6.0.3",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/openapi-types": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.1.0.tgz",
"integrity": "sha512-dWZfYvCCdjZzDYA3lIAMF72Q0jld8xidqCq5Ryw09eBJXZdcM6he0vWBTvw/b5UnGYqexxOyHWgfrsTlUJL3Gw=="
},
"node_modules/@octokit/plugin-retry": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz",
"integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==",
"dependencies": {
"@octokit/types": "^6.0.3",
"bottleneck": "^2.15.3"
}
},
"node_modules/@octokit/plugin-throttling": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.5.2.tgz",
"integrity": "sha512-Eu7kfJxU8vmHqWGNszWpg+GVp2tnAfax3XQV5CkYPEE69C+KvInJXW9WajgSeW+cxYe0UVdouzCtcreGNuJo7A==",
"dependencies": {
"@octokit/types": "^6.0.1",
"bottleneck": "^2.15.3"
},
"peerDependencies": {
"@octokit/core": "^3.5.0"
}
},
"node_modules/@octokit/request": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz",
"integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==",
"peer": true,
"dependencies": {
"@octokit/endpoint": "^6.0.1",
"@octokit/request-error": "^2.1.0",
"@octokit/types": "^6.16.1",
"is-plain-object": "^5.0.0",
"node-fetch": "^2.6.1",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/request-error": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
"peer": true,
"dependencies": {
"@octokit/types": "^6.0.3",
"deprecation": "^2.0.0",
"once": "^1.4.0"
}
},
"node_modules/@octokit/rest": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz",
"integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==",
"license": "MIT",
"dependencies": {
"@octokit/core": "^6.1.4",
"@octokit/plugin-paginate-rest": "^11.4.2",
"@octokit/plugin-request-log": "^5.3.1",
"@octokit/plugin-rest-endpoint-methods": "^13.3.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
"integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==",
@@ -134,7 +22,7 @@
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/core": {
"node_modules/@octokit/core": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz",
"integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==",
@@ -152,7 +40,22 @@
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
"node_modules/@octokit/core/node_modules/@octokit/openapi-types": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"license": "MIT"
},
"node_modules/@octokit/core/node_modules/@octokit/types": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^24.2.0"
}
},
"node_modules/@octokit/endpoint": {
"version": "10.1.3",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz",
"integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==",
@@ -165,7 +68,22 @@
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/graphql": {
"node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"license": "MIT"
},
"node_modules/@octokit/endpoint/node_modules/@octokit/types": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^24.2.0"
}
},
"node_modules/@octokit/graphql": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz",
"integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==",
@@ -179,6 +97,139 @@
"node": ">= 18"
}
},
"node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"license": "MIT"
},
"node_modules/@octokit/graphql/node_modules/@octokit/types": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^24.2.0"
}
},
"node_modules/@octokit/openapi-types": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.1.0.tgz",
"integrity": "sha512-dWZfYvCCdjZzDYA3lIAMF72Q0jld8xidqCq5Ryw09eBJXZdcM6he0vWBTvw/b5UnGYqexxOyHWgfrsTlUJL3Gw=="
},
"node_modules/@octokit/plugin-retry": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz",
"integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==",
"dependencies": {
"@octokit/types": "^6.0.3",
"bottleneck": "^2.15.3"
}
},
"node_modules/@octokit/plugin-throttling": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.6.0.tgz",
"integrity": "sha512-zn7m1N3vpJDaVzLqjCRdJ0cRzNiekHEWPi8Ww9xyPNrDt5PStHvVE0eR8wy4RSU8Eg7YO8MHyvn6sv25EGVhhg==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^13.7.0",
"bottleneck": "^2.15.3"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"@octokit/core": "^6.1.3"
}
},
"node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"license": "MIT"
},
"node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^24.2.0"
}
},
"node_modules/@octokit/request": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz",
"integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==",
"license": "MIT",
"dependencies": {
"@octokit/endpoint": "^10.1.3",
"@octokit/request-error": "^6.1.7",
"@octokit/types": "^13.6.2",
"fast-content-type-parse": "^2.0.0",
"universal-user-agent": "^7.0.2"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/request-error": {
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz",
"integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^13.6.2"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"license": "MIT"
},
"node_modules/@octokit/request-error/node_modules/@octokit/types": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^24.2.0"
}
},
"node_modules/@octokit/request/node_modules/@octokit/openapi-types": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"license": "MIT"
},
"node_modules/@octokit/request/node_modules/@octokit/types": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^24.2.0"
}
},
"node_modules/@octokit/rest": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz",
"integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==",
"license": "MIT",
"dependencies": {
"@octokit/core": "^6.1.4",
"@octokit/plugin-paginate-rest": "^11.4.2",
"@octokit/plugin-request-log": "^5.3.1",
"@octokit/plugin-rest-endpoint-methods": "^13.3.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
@@ -227,34 +278,6 @@
"@octokit/core": ">=6"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/request": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz",
"integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==",
"license": "MIT",
"dependencies": {
"@octokit/endpoint": "^10.1.3",
"@octokit/request-error": "^6.1.7",
"@octokit/types": "^13.6.2",
"fast-content-type-parse": "^2.0.0",
"universal-user-agent": "^7.0.2"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/request-error": {
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz",
"integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^13.6.2"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/types": {
"version": "13.8.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
@@ -264,18 +287,6 @@
"@octokit/openapi-types": "^23.0.1"
}
},
"node_modules/@octokit/rest/node_modules/before-after-hook": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
"integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
"license": "Apache-2.0"
},
"node_modules/@octokit/rest/node_modules/universal-user-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
"integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
"license": "ISC"
},
"node_modules/@octokit/types": {
"version": "6.33.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.33.0.tgz",
@@ -285,22 +296,16 @@
}
},
"node_modules/before-after-hook": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
"integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==",
"peer": true
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
"integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
"license": "Apache-2.0"
},
"node_modules/bottleneck": {
"version": "2.19.5",
"resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
},
"node_modules/deprecation": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
"peer": true
},
"node_modules/fast-content-type-parse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
@@ -317,77 +322,11 @@
],
"license": "MIT"
},
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"peer": true,
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"peer": true,
"dependencies": {
"wrappy": "1"
}
},
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
"peer": true
},
"node_modules/universal-user-agent": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
"integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
"peer": true
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
"peer": true
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
"peer": true,
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"peer": true
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
"integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
"license": "ISC"
}
}
}

View File

@@ -11,7 +11,7 @@
"license": "ISC",
"dependencies": {
"@octokit/plugin-retry": "^3.0.9",
"@octokit/plugin-throttling": "^3.5.2",
"@octokit/plugin-throttling": "^9.6.0",
"@octokit/rest": "^21.1.1"
}
}

View File

@@ -1413,6 +1413,8 @@ SCAJ-20023:
region: "NTSC-Unk"
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SCAJ-20024:
@@ -2206,10 +2208,11 @@ SCAJ-20158:
SCAJ-20159:
name: "SoulCalibur III"
region: "NTSC-C"
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -4212,10 +4215,11 @@ SCED-53662:
SCED-53674:
name: "SoulCalibur III [Demo]"
region: "PAL-E"
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -5888,10 +5892,11 @@ SCES-53312:
name: "SoulCalibur III"
region: "PAL-M5"
compat: 5
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -7023,6 +7028,8 @@ SCKA-20016:
compat: 5
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SCKA-20017:
@@ -7324,10 +7331,11 @@ SCKA-20059:
name: "SoulCalibur III"
region: "NTSC-K"
compat: 5
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -13189,6 +13197,8 @@ SLED-51901:
region: "PAL-E"
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SLED-51902:
@@ -17965,6 +17975,8 @@ SLES-51799:
compat: 5
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SLES-51800:
@@ -35040,10 +35052,11 @@ SLPM-61133:
name-sort: "そうるきゃりばー3 [たいけんばん]"
name-en: "SoulCalibur III [Trial]"
region: "NTSC-J"
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -56345,6 +56358,8 @@ SLPS-25230:
compat: 5
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SLPS-25231:
@@ -58389,10 +58404,11 @@ SLPS-25577:
name-en: "SoulCalibur III"
region: "NTSC-J"
compat: 5
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -64797,6 +64813,8 @@ SLUS-20643:
compat: 5
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SLUS-20644:
@@ -68110,10 +68128,11 @@ SLUS-21216:
name: "SoulCalibur III"
region: "NTSC-U"
compat: 5
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- EETimingHack # Fixes bad colours on character select when in Progressive Scan.
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
nativeScaling: 2 # Fixes misaligned bloom.
@@ -69502,6 +69521,9 @@ SLUS-21410:
name: "Mortal Kombat - Armageddon"
region: "NTSC-U"
compat: 5
memcardFilters: # Saves from the non-Premium can be imported
- "SLUS-21410"
- "SLUS-21543"
SLUS-21411:
name: "M2 Rock"
region: "NTSC-U"
@@ -70144,6 +70166,9 @@ SLUS-21543:
name: "Mortal Kombat - Armageddon [Premium Edition]"
region: "NTSC-U"
compat: 5
memcardFilters: # Saves from the non-Premium can be imported
- "SLUS-21543"
- "SLUS-21410"
SLUS-21544:
name: "Fantastic 4 - Rise of Silver Surfer"
region: "NTSC-U"
@@ -72749,6 +72774,8 @@ SLUS-29058:
region: "NTSC-U"
clampModes:
vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters.
gameFixes:
- SoftwareRendererFMVHack # Horizontal bottom line in FMV.
gsHWFixes:
alignSprite: 1 # Fixes vertical lines.
SLUS-29059:

View File

@@ -181,6 +181,10 @@ private:
extern u64 GetTickFrequency();
extern u64 GetCPUTicks();
extern u64 GetPhysicalMemory();
#ifdef _WIN32
// TODO: Someone do linux/mac.
extern u64 GetAvailablePhysicalMemory();
#endif
/// Spin for a short period of time (call while spinning waiting for a lock)
/// Returns the approximate number of ns that passed
extern u32 ShortSpin();

View File

@@ -57,6 +57,14 @@ u64 GetPhysicalMemory()
return status.ullTotalPhys;
}
u64 GetAvailablePhysicalMemory()
{
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
return status.ullAvailPhys;
}
// Calculates the Windows OS Version and processor architecture, and returns it as a
// human-readable string. :)
std::string GetOSVersionString()

View File

@@ -28,7 +28,7 @@ const char* QtHost::GetDefaultThemeName()
#ifdef __APPLE__
return "";
#else
return "darkfusion";
return "darkfusionblue";
#endif
}

View File

@@ -2392,7 +2392,12 @@ Leaderboard Position: {1} of {2}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/CDVD/ThreadedFileReader.cpp" line="276"/>
<location filename="../../pcsx2/CDVD/ThreadedFileReader.cpp" line="279"/>
<source>Not enough free memory available for precaching, ({}GB) required.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/CDVD/ThreadedFileReader.cpp" line="292"/>
<source>Required memory ({}GB) is the above the maximum allowed ({}GB).</source>
<translation type="unfinished"></translation>
</message>
@@ -10789,77 +10794,77 @@ Do you want to load this save and continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="537"/>
<location filename="../../pcsx2/GS/GS.cpp" line="546"/>
<source>Failed to change window after update. The log may contain more information.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1065"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1074"/>
<source>Upscale multiplier set to {}x.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="441"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="432"/>
<source>Saving screenshot to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="453"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="444"/>
<source>Saved screenshot to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="460"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="451"/>
<source>Failed to save screenshot to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="531"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="522"/>
<source>Host GPU device encountered an error and was recovered. This may have broken rendering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="636"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="627"/>
<source>CAS is not available, your graphics driver does not support the required functionality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="691"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="682"/>
<source>with no compression</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="698"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="689"/>
<source>with LZMA compression</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="705"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="696"/>
<source>with Zstandard compression</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="711"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="702"/>
<source>Saving {0} GS dump {1} to &apos;{2}&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="712"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="703"/>
<source>single frame</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="712"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="703"/>
<source>multi-frame</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="732"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="723"/>
<source>Failed to render/download screenshot.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="743"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="734"/>
<source>Saved GS dump to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
@@ -14779,190 +14784,190 @@ Swap chain: see Microsoft&apos;s Terminology Portal.</extracomment>
<context>
<name>Hotkeys</name>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1086"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1094"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1114"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1121"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1095"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1103"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1123"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1130"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1136"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1142"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1148"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1153"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1166"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1179"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1207"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1219"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1233"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1139"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1145"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1151"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1157"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1162"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1175"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1188"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1216"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1228"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1242"/>
<source>Graphics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1087"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1096"/>
<source>Save Screenshot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1094"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1103"/>
<source>Toggle Video Capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1114"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1123"/>
<source>Save Single Frame GS Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1121"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1130"/>
<source>Save Multi Frame GS Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1131"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1140"/>
<source>Toggle Software Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1137"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1146"/>
<source>Increase Upscale Multiplier</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1143"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1152"/>
<source>Decrease Upscale Multiplier</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1148"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1157"/>
<source>Toggle On-Screen Display</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1153"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1162"/>
<source>Cycle Aspect Ratio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1162"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1171"/>
<source>Aspect ratio set to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1166"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1175"/>
<source>Toggle Hardware Mipmapping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1173"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1182"/>
<source>Hardware mipmapping is now enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1174"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1183"/>
<source>Hardware mipmapping is now disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1179"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1188"/>
<source>Cycle Deinterlace Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1185"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1194"/>
<source>Automatic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1186"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1195"/>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1187"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1196"/>
<source>Weave (Top Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1188"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1197"/>
<source>Weave (Bottom Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1189"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1198"/>
<source>Bob (Top Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1190"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1199"/>
<source>Bob (Bottom Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1191"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1200"/>
<source>Blend (Top Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1192"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1201"/>
<source>Blend (Bottom Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1193"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1202"/>
<source>Adaptive (Top Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1194"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1203"/>
<source>Adaptive (Bottom Field First)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1201"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1210"/>
<source>Deinterlace mode set to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1207"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1216"/>
<source>Toggle Texture Dumping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1213"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1222"/>
<source>Texture dumping is now enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1214"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1223"/>
<source>Texture dumping is now disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1220"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1229"/>
<source>Toggle Texture Replacements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1227"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1236"/>
<source>Texture replacements are now enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1228"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1237"/>
<source>Texture replacements are now disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1234"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1243"/>
<source>Reload Texture Replacements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1241"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1250"/>
<source>Texture replacements are not enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/GS.cpp" line="1246"/>
<location filename="../../pcsx2/GS/GS.cpp" line="1255"/>
<source>Reloading texture replacements...</source>
<translation type="unfinished"></translation>
</message>

View File

@@ -266,10 +266,26 @@ bool ThreadedFileReader::Precache2(ProgressCallback* progress, Error* error)
bool ThreadedFileReader::CheckAvailableMemoryForPrecaching(u64 required_size, Error* error)
{
#ifdef _WIN32
// We want to check available physical memory instead of total.
const u64 memory_available = GetAvailablePhysicalMemory();
// Reserve 2GB of available memory for headroom.
constexpr u64 memory_reserve = 2147483648;
const u64 max_precache_size = std::max(0LL, static_cast<s64>(memory_available - memory_reserve));
if (required_size > max_precache_size)
{
Error::SetStringFmt(error,
TRANSLATE_FS("CDVD", "Not enough free memory available for precaching, ({}GB) required."),
(required_size + memory_reserve) / _1gb);
return false;
}
#else
// Don't allow precaching to use more than 50% of system memory.
// Hopefully nobody's running 2-4GB potatoes anymore....
const u64 memory_size = GetPhysicalMemory();
const u64 max_precache_size = memory_size / 2;
if (required_size > max_precache_size)
{
Error::SetStringFmt(error,
@@ -277,6 +293,7 @@ bool ThreadedFileReader::CheckAvailableMemoryForPrecaching(u64 required_size, Er
required_size / _1gb, max_precache_size / _1gb);
return false;
}
#endif
return true;
}

View File

@@ -309,6 +309,7 @@ set(pcsx2DEV9Sources
DEV9/Sessions/TCP_Session/TCP_Session.cpp
DEV9/Sessions/TCP_Session/TCP_Session_In.cpp
DEV9/Sessions/TCP_Session/TCP_Session_Out.cpp
DEV9/Sessions/UDP_Session/UDP_Common.cpp
DEV9/Sessions/UDP_Session/UDP_FixedPort.cpp
DEV9/Sessions/UDP_Session/UDP_Session.cpp
DEV9/smap.cpp
@@ -354,6 +355,7 @@ set(pcsx2DEV9Headers
DEV9/Sessions/BaseSession.h
DEV9/Sessions/ICMP_Session/ICMP_Session.h
DEV9/Sessions/TCP_Session/TCP_Session.h
DEV9/Sessions/UDP_Session/UDP_Common.h
DEV9/Sessions/UDP_Session/UDP_FixedPort.h
DEV9/Sessions/UDP_Session/UDP_BaseSession.h
DEV9/Sessions/UDP_Session/UDP_Session.h

View File

@@ -16,5 +16,6 @@ namespace Sessions
}
virtual bool WillRecive(PacketReader::IP::IP_Address parDestIP) = 0;
virtual void ForceClose() { RaiseEventConnectionClosed(); };
};
} // namespace Sessions

View File

@@ -0,0 +1,193 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include <bit>
#include "common/Console.h"
#ifdef __POSIX__
#define SOCKET_ERROR -1
#define INVALID_SOCKET -1
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <netinet/in.h>
#endif
#ifdef _WIN32
#include "common/RedtapeWindows.h"
#include <winsock2.h>
#else
#include <unistd.h>
#endif
#include "UDP_Common.h"
#include "DEV9/PacketReader/IP/UDP/UDP_Packet.h"
using namespace PacketReader;
using namespace PacketReader::IP;
using namespace PacketReader::IP::UDP;
namespace Sessions::UDP_Common
{
#ifdef _WIN32
SOCKET CreateSocket(IP_Address adapterIP, std::optional<u16> port)
{
SOCKET client = INVALID_SOCKET;
#elif defined(__POSIX__)
int CreateSocket(IP_Address adapterIP, std::optional<u16> port)
{
int client = INVALID_SOCKET;
#endif
int ret;
client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (client == INVALID_SOCKET)
{
Console.Error("DEV9: UDP: Failed to open socket. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
return INVALID_SOCKET;
}
constexpr int reuseAddress = true; // BOOL on Windows
ret = setsockopt(client, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<const char*>(&reuseAddress), sizeof(reuseAddress));
if (ret == SOCKET_ERROR)
Console.Error("DEV9: UDP: Failed to set SO_REUSEADDR. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
if (port.has_value() || adapterIP != IP_Address{{{0, 0, 0, 0}}})
{
sockaddr_in endpoint{};
endpoint.sin_family = AF_INET;
endpoint.sin_addr = std::bit_cast<in_addr>(adapterIP);
if (port.has_value())
endpoint.sin_port = htons(port.value());
ret = bind(client, reinterpret_cast<const sockaddr*>(&endpoint), sizeof(endpoint));
if (ret == SOCKET_ERROR)
Console.Error("DEV9: UDP: Failed to bind socket. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
}
return client;
}
#ifdef _WIN32
std::tuple<std::optional<ReceivedPayload>, bool> RecvFrom(SOCKET client, u16 port)
#elif defined(__POSIX__)
std::tuple<std::optional<ReceivedPayload>, bool> RecvFrom(int client, u16 port)
#endif
{
int ret;
fd_set sReady;
fd_set sExcept;
// not const Linux
timeval nowait{};
FD_ZERO(&sReady);
FD_ZERO(&sExcept);
FD_SET(client, &sReady);
FD_SET(client, &sExcept);
ret = select(client + 1, &sReady, nullptr, &sExcept, &nowait);
if (ret == SOCKET_ERROR)
{
Console.Error("DEV9: UDP: select failed. Error code: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
return {std::nullopt, true};
}
else if (FD_ISSET(client, &sExcept))
{
#ifdef _WIN32
int len = sizeof(ret);
if (getsockopt(client, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&ret), &len) < 0)
{
Console.Error("DEV9: UDP: Unknown UDP connection error (getsockopt error: %d)", WSAGetLastError());
}
#elif defined(__POSIX__)
socklen_t len = sizeof(ret);
if (getsockopt(client, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&ret), &len) < 0)
Console.Error("DEV9: UDP: Unknown UDP connection error (getsockopt error: %d)", errno);
#endif
else
Console.Error("DEV9: UDP: Socket error: %d", ret);
// All socket errors assumed fatal.
return {std::nullopt, false};
}
else if (FD_ISSET(client, &sReady))
{
unsigned long available = 0;
PayloadData* recived = nullptr;
std::unique_ptr<u8[]> buffer;
sockaddr_in endpoint{};
// FIONREAD returns total size of all available messages
// however, we only read one message at a time
#ifdef _WIN32
ret = ioctlsocket(client, FIONREAD, &available);
#elif defined(__POSIX__)
ret = ioctl(client, FIONREAD, &available);
#endif
if (ret != SOCKET_ERROR)
{
buffer = std::make_unique<u8[]>(available);
#ifdef _WIN32
int fromlen = sizeof(endpoint);
#elif defined(__POSIX__)
socklen_t fromlen = sizeof(endpoint);
#endif
ret = recvfrom(client, reinterpret_cast<char*>(buffer.get()), available, 0, reinterpret_cast<sockaddr*>(&endpoint), &fromlen);
}
if (ret == SOCKET_ERROR)
{
#ifdef _WIN32
ret = WSAGetLastError();
#elif defined(__POSIX__)
ret = errno;
#endif
Console.Error("DEV9: UDP: recvfrom error: %d", ret);
/*
* We can receive an ICMP Port Unreacable error as a WSAECONNRESET/ECONNREFUSED error
* Ignore the error, recv will be retried next loop
*/
return {std::nullopt,
#ifdef _WIN32
ret == WSAECONNRESET};
#elif defined(__POSIX__)
ret == ECONNREFUSED};
#endif
}
recived = new PayloadData(ret);
memcpy(recived->data.get(), buffer.get(), ret);
std::unique_ptr<UDP_Packet> iRet = std::make_unique<UDP_Packet>(recived);
iRet->destinationPort = port;
iRet->sourcePort = ntohs(endpoint.sin_port);
return {ReceivedPayload{std::bit_cast<IP_Address>(endpoint.sin_addr), std::move(iRet)}, true};
}
return {std::nullopt, true};
}
} // namespace Sessions::UDP_Common

View File

@@ -0,0 +1,31 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#pragma once
#include <tuple>
#ifdef _WIN32
#include <winsock2.h>
#elif defined(__POSIX__)
#include <sys/socket.h>
#endif
#include "common/Pcsx2Defs.h"
#include "DEV9/Sessions/BaseSession.h"
namespace Sessions::UDP_Common
{
// Binds the socket when provided with an IP
#ifdef _WIN32
SOCKET CreateSocket(PacketReader::IP::IP_Address adapterIP, std::optional<u16> port);
#elif defined(__POSIX__)
int CreateSocket(PacketReader::IP::IP_Address adapterIP, std::optional<u16> port);
#endif
// Receives from the client and packages the data into ReceivedPayload
// port is the local port to be written to the UDP header in ReceivedPayload
#ifdef _WIN32
std::tuple<std::optional<ReceivedPayload>, bool> RecvFrom(SOCKET client, u16 port);
#elif defined(__POSIX__)
std::tuple<std::optional<ReceivedPayload>, bool> RecvFrom(int client, u16 port);
#endif
} // namespace Sessions::UDP_Common

View File

@@ -21,6 +21,7 @@
#include <unistd.h>
#endif
#include "UDP_Common.h"
#include "UDP_FixedPort.h"
#include "DEV9/PacketReader/IP/UDP/UDP_Packet.h"
@@ -51,33 +52,15 @@ namespace Sessions
void UDP_FixedPort::Init()
{
int ret;
client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
client = UDP_Common::CreateSocket(adapterIP, port);
if (client == INVALID_SOCKET)
{
Console.Error("DEV9: UDP: Failed to open socket. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
RaiseEventConnectionClosed();
return;
}
constexpr int reuseAddress = true; // BOOL on Windows
ret = setsockopt(client, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<const char*>(&reuseAddress), sizeof(reuseAddress));
if (ret == SOCKET_ERROR)
Console.Error("DEV9: UDP: Failed to set SO_REUSEADDR. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
constexpr int broadcastEnable = true; // BOOL on Windows
ret = setsockopt(client, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char*>(&broadcastEnable), sizeof(broadcastEnable));
const int ret = setsockopt(client, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char*>(&broadcastEnable), sizeof(broadcastEnable));
if (ret == SOCKET_ERROR)
Console.Error("DEV9: UDP: Failed to set SO_BROADCAST. Error: %d",
@@ -87,25 +70,6 @@ namespace Sessions
errno);
#endif
sockaddr_in endpoint{};
endpoint.sin_family = AF_INET;
endpoint.sin_addr = std::bit_cast<in_addr>(adapterIP);
endpoint.sin_port = htons(port);
ret = bind(client, reinterpret_cast<const sockaddr*>(&endpoint), sizeof(endpoint));
if (ret == SOCKET_ERROR)
{
Console.Error("DEV9: UDP: Failed to bind socket. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
RaiseEventConnectionClosed();
return;
}
open.store(true);
}
@@ -114,102 +78,45 @@ namespace Sessions
if (!open.load())
return std::nullopt;
int ret;
fd_set sReady;
fd_set sExcept;
std::optional<ReceivedPayload> ret;
bool success;
std::tie(ret, success) = UDP_Common::RecvFrom(client, port);
timeval nowait{};
FD_ZERO(&sReady);
FD_ZERO(&sExcept);
FD_SET(client, &sReady);
FD_SET(client, &sExcept);
ret = select(client + 1, &sReady, nullptr, &sExcept, &nowait);
bool hasData;
if (ret == SOCKET_ERROR)
if (!success)
{
hasData = false;
Console.Error("DEV9: UDP: select failed. Error code: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
}
else if (FD_ISSET(client, &sExcept))
{
hasData = false;
int error = 0;
#ifdef _WIN32
int len = sizeof(error);
if (getsockopt(client, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&error), &len) < 0)
Console.Error("DEV9: UDP: Unknown UDP connection error (getsockopt error: %d)", WSAGetLastError());
#elif defined(__POSIX__)
socklen_t len = sizeof(error);
if (getsockopt(client, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&error), &len) < 0)
Console.Error("DEV9: UDP: Unknown UDP connection error (getsockopt error: %d)", errno);
#endif
else
Console.Error("DEV9: UDP: Recv error: %d", error);
}
else
hasData = FD_ISSET(client, &sReady);
if (hasData)
{
unsigned long available = 0;
PayloadData* recived = nullptr;
std::unique_ptr<u8[]> buffer;
sockaddr_in endpoint{};
// FIONREAD returns total size of all available messages
// however, we only read one message at a time
#ifdef _WIN32
ret = ioctlsocket(client, FIONREAD, &available);
#elif defined(__POSIX__)
ret = ioctl(client, FIONREAD, &available);
#endif
if (ret != SOCKET_ERROR)
// See Reset() for why we copy the vector.
std::vector<UDP_BaseSession*> connectionsCopy;
{
buffer = std::make_unique<u8[]>(available);
#ifdef _WIN32
int fromlen = sizeof(endpoint);
#elif defined(__POSIX__)
socklen_t fromlen = sizeof(endpoint);
#endif
ret = recvfrom(client, reinterpret_cast<char*>(buffer.get()), available, 0, reinterpret_cast<sockaddr*>(&endpoint), &fromlen);
std::lock_guard numberlock(connectionSentry);
open.store(false);
connectionsCopy = connections;
}
if (ret == SOCKET_ERROR)
if (connectionsCopy.size() == 0)
{
Console.Error("DEV9: UDP: UDP recv error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
// Can close immediately.
RaiseEventConnectionClosed();
return std::nullopt;
}
else
{
// Need to wait for child connections to close.
for (size_t i = 0; i < connectionsCopy.size(); i++)
connectionsCopy[i]->ForceClose();
recived = new PayloadData(ret);
memcpy(recived->data.get(), buffer.get(), ret);
std::unique_ptr<UDP_Packet> iRet = std::make_unique<UDP_Packet>(recived);
iRet->destinationPort = port;
iRet->sourcePort = ntohs(endpoint.sin_port);
IP_Address srvIP = std::bit_cast<IP_Address>(endpoint.sin_addr);
return std::nullopt;
}
}
else if (ret.has_value())
{
{
std::lock_guard numberlock(connectionSentry);
for (size_t i = 0; i < connections.size(); i++)
{
UDP_BaseSession* s = connections[i];
if (s->WillRecive(srvIP))
return ReceivedPayload{srvIP, std::move(iRet)};
if (s->WillRecive(ret.value().sourceIP))
return ret;
}
}
Console.Error("DEV9: UDP: Unexpected packet, dropping");
@@ -225,10 +132,12 @@ namespace Sessions
void UDP_FixedPort::Reset()
{
// Reseting a session may cause that session to close itself,
// when that happens, the connections vector gets modified via our close handler.
// Duplicate the vector to avoid iterating over a modified collection,
// this also avoids the issue of recursive locking when our close handler takes a lock.
/*
* Reseting a session may cause that session to close itself,
* when that happens, the connections vector gets modified via our close handler.
* Duplicate the vector to avoid iterating over a modified collection,
* this also avoids the issue of recursive locking when our close handler takes a lock.
*/
std::vector<UDP_BaseSession*> connectionsCopy;
{
std::lock_guard numberlock(connectionSentry);
@@ -241,16 +150,15 @@ namespace Sessions
UDP_Session* UDP_FixedPort::NewClientSession(ConnectionKey parNewKey, bool parIsBrodcast, bool parIsMulticast)
{
// Lock the whole function so we can't race between the open check and creating the session
std::lock_guard numberlock(connectionSentry);
if (!open.load())
return nullptr;
UDP_Session* s = new UDP_Session(parNewKey, adapterIP, parIsBrodcast, parIsMulticast, client);
s->AddConnectionClosedHandler([&](BaseSession* session) { HandleChildConnectionClosed(session); });
{
std::lock_guard numberlock(connectionSentry);
connections.push_back(s);
}
connections.push_back(s);
return s;
}
@@ -272,6 +180,8 @@ namespace Sessions
UDP_FixedPort::~UDP_FixedPort()
{
DevCon.WriteLn("DEV9: Socket: UDPFixedPort %d had %d child connections", port, connections.size());
open.store(false);
if (client != INVALID_SOCKET)
{

View File

@@ -20,6 +20,7 @@
#endif
#include "UDP_Session.h"
#include "UDP_Common.h"
#include "DEV9/PacketReader/IP/UDP/UDP_Packet.h"
using namespace PacketReader;
@@ -75,97 +76,17 @@ namespace Sessions
return std::nullopt;
}
int ret;
fd_set sReady;
fd_set sExcept;
std::optional<ReceivedPayload> ret;
bool success;
std::tie(ret, success) = UDP_Common::RecvFrom(client, srcPort);
timeval nowait{};
FD_ZERO(&sReady);
FD_ZERO(&sExcept);
FD_SET(client, &sReady);
FD_SET(client, &sExcept);
ret = select(client + 1, &sReady, nullptr, &sExcept, &nowait);
bool hasData;
if (ret == SOCKET_ERROR)
if (!success)
{
hasData = false;
Console.Error("DEV9: UDP: Select failed. Error code: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
}
else if (FD_ISSET(client, &sExcept))
{
hasData = false;
int error = 0;
#ifdef _WIN32
int len = sizeof(error);
if (getsockopt(client, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&error), &len) < 0)
Console.Error("DEV9: UDP: Unknown UDP connection error (getsockopt error: %d)", WSAGetLastError());
#elif defined(__POSIX__)
socklen_t len = sizeof(error);
if (getsockopt(client, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&error), &len) < 0)
Console.Error("DEV9: UDP: Unknown UDP connection error (getsockopt error: %d)", errno);
#endif
else
Console.Error("DEV9: UDP: Recv error: %d", error);
}
else
hasData = FD_ISSET(client, &sReady);
if (hasData)
{
unsigned long available = 0;
PayloadData* recived = nullptr;
std::unique_ptr<u8[]> buffer;
sockaddr_in endpoint{};
// FIONREAD returns total size of all available messages
// however, we only read one message at a time
#ifdef _WIN32
ret = ioctlsocket(client, FIONREAD, &available);
#elif defined(__POSIX__)
ret = ioctl(client, FIONREAD, &available);
#endif
if (ret != SOCKET_ERROR)
{
buffer = std::make_unique<u8[]>(available);
#ifdef _WIN32
int fromlen = sizeof(endpoint);
#elif defined(__POSIX__)
socklen_t fromlen = sizeof(endpoint);
#endif
ret = recvfrom(client, reinterpret_cast<char*>(buffer.get()), available, 0, reinterpret_cast<sockaddr*>(&endpoint), &fromlen);
}
if (ret == SOCKET_ERROR)
{
Console.Error("DEV9: UDP: Recv error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
RaiseEventConnectionClosed();
return std::nullopt;
}
recived = new PayloadData(ret);
memcpy(recived->data.get(), buffer.get(), ret);
std::unique_ptr<UDP_Packet> iRet = std::make_unique<UDP_Packet>(recived);
iRet->destinationPort = srcPort;
iRet->sourcePort = destPort;
deathClockStart.store(std::chrono::steady_clock::now());
return ReceivedPayload{destIP, std::move(iRet)};
RaiseEventConnectionClosed();
return std::nullopt;
}
else if (ret.has_value())
return ret;
if (std::chrono::steady_clock::now() - deathClockStart.load() > MAX_IDLE)
{
@@ -211,54 +132,19 @@ namespace Sessions
destPort = udp.destinationPort;
srcPort = udp.sourcePort;
int ret;
client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
client = UDP_Common::CreateSocket(adapterIP, std::nullopt);
if (client == INVALID_SOCKET)
{
Console.Error("DEV9: UDP: Failed to open socket. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
RaiseEventConnectionClosed();
return false;
}
constexpr int reuseAddress = true; // BOOL on Windows
ret = setsockopt(client, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<const char*>(&reuseAddress), sizeof(reuseAddress));
if (ret == SOCKET_ERROR)
Console.Error("DEV9: UDP: Failed to set SO_REUSEADDR. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
if (adapterIP.integer != 0)
{
sockaddr_in endpoint{};
endpoint.sin_family = AF_INET;
endpoint.sin_addr = std::bit_cast<in_addr>(adapterIP);
ret = bind(client, reinterpret_cast<const sockaddr*>(&endpoint), sizeof(endpoint));
if (ret == SOCKET_ERROR)
Console.Error("DEV9: UDP: Failed to bind socket. Error: %d",
#ifdef _WIN32
WSAGetLastError());
#elif defined(__POSIX__)
errno);
#endif
}
sockaddr_in endpoint{};
endpoint.sin_family = AF_INET;
endpoint.sin_addr = std::bit_cast<in_addr>(destIP);
endpoint.sin_port = htons(destPort);
ret = connect(client, reinterpret_cast<const sockaddr*>(&endpoint), sizeof(endpoint));
const int ret = connect(client, reinterpret_cast<const sockaddr*>(&endpoint), sizeof(endpoint));
if (ret == SOCKET_ERROR)
{

View File

@@ -203,14 +203,19 @@ bool SocketAdapter::recv(NetPacket* pkt)
ScopedGuard cleanup([&]() {
// Garbage collect closed connections
for (BaseSession* s : deleteQueueRecvThread)
delete s;
deleteQueueRecvThread.clear();
if (deleteQueueRecvThread.size() != 0)
{
std::lock_guard deletelock(deleteRecvSentry);
for (BaseSession* s : deleteQueueRecvThread)
delete s;
deleteQueueRecvThread.clear();
}
});
EthernetFrame* bFrame;
if (!vRecBuffer.Dequeue(&bFrame))
{
std::lock_guard deletelock(deleteSendSentry);
std::vector<ConnectionKey> keys = connections.GetKeys();
for (size_t i = 0; i < keys.size(); i++)
{
@@ -259,9 +264,13 @@ bool SocketAdapter::send(NetPacket* pkt)
pxAssert(std::this_thread::get_id() == sendThreadId);
ScopedGuard cleanup([&]() {
// Garbage collect closed connections
for (BaseSession* s : deleteQueueSendThread)
delete s;
deleteQueueSendThread.clear();
if (deleteQueueSendThread.size() != 0)
{
std::lock_guard deletelock(deleteSendSentry);
for (BaseSession* s : deleteQueueSendThread)
delete s;
deleteQueueSendThread.clear();
}
});
EthernetFrame frame(pkt);
@@ -375,6 +384,7 @@ bool SocketAdapter::SendIP(IP_Packet* ipPkt)
Key.ip = ipPkt->destinationIP;
Key.protocol = ipPkt->protocol;
std::lock_guard deletelock(deleteRecvSentry);
switch (ipPkt->protocol) //(Prase Payload)
{
case (u8)IP_Type::ICMP:

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#pragma once
#include <mutex>
#include <vector>
#include "net.h"
@@ -23,14 +24,17 @@ class SocketAdapter : public NetAdapter
bool initialized = false;
PacketReader::IP::IP_Address adapterIP;
//Sentrys replaced by the requirment for each session class to have thread safe destructor
ThreadSafeMap<Sessions::ConnectionKey, Sessions::BaseSession*> connections;
ThreadSafeMap<u16, Sessions::BaseSession*> fixedUDPPorts;
std::thread::id sendThreadId;
std::vector<Sessions::BaseSession*> deleteQueueSendThread;
std::vector<Sessions::BaseSession*> deleteQueueRecvThread;
//Mutex to be held when processing the delete queue.
//The Send thread will lock the RecvSentry to prevent the recv thread
//from deleting a session the send thread might be currently working on.
std::mutex deleteSendSentry;
std::mutex deleteRecvSentry;
public:
SocketAdapter();

View File

@@ -60,6 +60,25 @@ static const char* const* s_sdl_trigger_names_list[] = {
// Switch
};
static constexpr const char* s_sdl_ps3_sxs_pressure_names[] = {
nullptr, // JoyAxis0
nullptr, // JoyAxis1
nullptr, // JoyAxis2
nullptr, // JoyAxis3
nullptr, // JoyAxis4
nullptr, // JoyAxis5
"Cross (Pressure)", // JoyAxis6
"Circle (Pressure)", // JoyAxis7
"Square (Pressure)", // JoyAxis8
"Triangle (Pressure)", // JoyAxis9
"L1 (Pressure)", // JoyAxis10
"R1 (Pressure)", // JoyAxis11
"D-Pad Up (Pressure)", // JoyAxis12
"D-Pad Down (Pressure)", // JoyAxis13
"D-Pad Left (Pressure)", // JoyAxis14
"D-Pad Right (Pressure)", // JoyAxis15
};
static constexpr const char* s_sdl_axis_icons[][2] = {
{ICON_PF_LEFT_ANALOG_LEFT, ICON_PF_LEFT_ANALOG_RIGHT}, // SDL_GAMEPAD_AXIS_LEFTX
{ICON_PF_LEFT_ANALOG_UP, ICON_PF_LEFT_ANALOG_DOWN}, // SDL_GAMEPAD_AXIS_LEFTY
@@ -87,6 +106,25 @@ static const char* const* s_sdl_trigger_icons_list[] = {
// Switch
};
static constexpr const char* s_sdl_ps3_pressure_icons[] = {
nullptr, // JoyAxis0
nullptr, // JoyAxis1
nullptr, // JoyAxis2
nullptr, // JoyAxis3
nullptr, // JoyAxis4
nullptr, // JoyAxis5
"P" ICON_PF_BUTTON_CROSS, // JoyAxis6
"P" ICON_PF_BUTTON_CIRCLE, // JoyAxis7
"P" ICON_PF_BUTTON_SQUARE, // JoyAxis8
"P" ICON_PF_BUTTON_TRIANGLE, // JoyAxis9
"P" ICON_PF_LEFT_SHOULDER_L1, // JoyAxis10
"P" ICON_PF_RIGHT_SHOULDER_R1, // JoyAxis11
"P" ICON_PF_DPAD_UP, // JoyAxis12
"P" ICON_PF_DPAD_DOWN, // JoyAxis13
"P" ICON_PF_DPAD_LEFT, // JoyAxis14
"P" ICON_PF_DPAD_RIGHT, // JoyAxis15
};
static constexpr const GenericInputBinding s_sdl_generic_binding_axis_mapping[][2] = {
{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // SDL_GAMEPAD_AXIS_LEFTX
{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // SDL_GAMEPAD_AXIS_LEFTY
@@ -95,6 +133,24 @@ static constexpr const GenericInputBinding s_sdl_generic_binding_axis_mapping[][
{GenericInputBinding::Unknown, GenericInputBinding::L2}, // SDL_GAMEPAD_AXIS_LEFT_TRIGGER
{GenericInputBinding::Unknown, GenericInputBinding::R2}, // SDL_GAMEPAD_AXIS_RIGHT_TRIGGER
};
static constexpr const GenericInputBinding s_sdl_ps3_binding_pressure_mapping[] = {
GenericInputBinding::Unknown, // JoyAxis0
GenericInputBinding::Unknown, // JoyAxis1
GenericInputBinding::Unknown, // JoyAxis2
GenericInputBinding::Unknown, // JoyAxis3
GenericInputBinding::Unknown, // JoyAxis4
GenericInputBinding::Unknown, // JoyAxis5
GenericInputBinding::Cross, // JoyAxis6
GenericInputBinding::Circle, // JoyAxis7
GenericInputBinding::Square, // JoyAxis8
GenericInputBinding::Triangle, // JoyAxis9
GenericInputBinding::L1, // JoyAxis10
GenericInputBinding::R1, // JoyAxis11
GenericInputBinding::DPadUp, // JoyAxis12
GenericInputBinding::DPadDown, // JoyAxis13
GenericInputBinding::DPadLeft, // JoyAxis14
GenericInputBinding::DPadRight, // JoyAxis15
};
static constexpr const char* s_sdl_button_setting_names[] = {
"FaceSouth", // SDL_GAMEPAD_BUTTON_SOUTH
@@ -265,7 +321,7 @@ static constexpr const char* s_sdl_button_ps3_icons[] = {
ICON_PF_BUTTON_SQUARE, // SDL_GAMEPAD_BUTTON_WEST
ICON_PF_BUTTON_TRIANGLE, // SDL_GAMEPAD_BUTTON_NORTH
ICON_PF_SELECT_SHARE, // SDL_GAMEPAD_BUTTON_BACK
ICON_PF_XBOX, // SDL_GAMEPAD_BUTTON_GUIDE
ICON_PF_PLAYSTATION, // SDL_GAMEPAD_BUTTON_GUIDE
ICON_PF_START, // SDL_GAMEPAD_BUTTON_START
ICON_PF_LEFT_ANALOG_CLICK, // SDL_GAMEPAD_BUTTON_LEFT_STICK
ICON_PF_RIGHT_ANALOG_CLICK, // SDL_GAMEPAD_BUTTON_RIGHT_STICK
@@ -360,12 +416,17 @@ static constexpr const GenericInputBinding s_sdl_generic_binding_button_mapping[
GenericInputBinding::DPadDown, // SDL_GAMEPAD_BUTTON_DPAD_DOWN
GenericInputBinding::DPadLeft, // SDL_GAMEPAD_BUTTON_DPAD_LEFT
GenericInputBinding::DPadRight, // SDL_GAMEPAD_BUTTON_DPAD_RIGHT
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_MISC1
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_LEFT_PADDLE1
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_LEFT_PADDLE2
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_TOUCHPAD
};
static constexpr const GenericInputBinding s_sdl_ps3_binding_button_mapping[] = {
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_SOUTH
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_EAST
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_WEST
GenericInputBinding::Unknown, // SDL_GAMEPAD_BUTTON_NORTH
GenericInputBinding::Select, // SDL_GAMEPAD_BUTTON_BACK
GenericInputBinding::System, // SDL_GAMEPAD_BUTTON_GUIDE
GenericInputBinding::Start, // SDL_GAMEPAD_BUTTON_START
GenericInputBinding::L3, // SDL_GAMEPAD_BUTTON_LEFT_STICK
GenericInputBinding::R3, // SDL_GAMEPAD_BUTTON_RIGHT_STICK
};
static constexpr const char* s_sdl_hat_direction_names[] = {
@@ -555,6 +616,11 @@ void SDLInputSource::SetHints()
// Gets us pressure sensitive button support on Linux
// Apparently doesn't work on Windows, so leave it off there
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS3, "1");
#else
// Use the Sixaxis driver (or DsHidMini in SXS mode).
// We don't support DsHidMini's SDF mode as none of the
// PS3 hints allow accessing all the pressure sense axis.
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER, "1");
#endif
#ifdef __APPLE__
@@ -920,7 +986,21 @@ TinyString SDLInputSource::ConvertKeyToString(InputBindingKey key, bool display,
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_trigger_names[trigger_index]);
}
else
ret.format("SDL-{} {}Axis {}{}", static_cast<u32>(key.source_index), modifier, key.data - std::size(s_sdl_axis_setting_names) + 1, key.invert ? "~" : "");
{
bool is_sixaxis = false;
if (it != m_controllers.end())
is_sixaxis = IsControllerSixaxis(*it);
const int joy_axis_Index = key.data - std::size(s_sdl_axis_setting_names);
if (is_sixaxis && key.modifier == InputModifier::FullAxis && key.invert == false &&
joy_axis_Index < std::size(s_sdl_ps3_sxs_pressure_names) && s_sdl_ps3_sxs_pressure_names[joy_axis_Index] != nullptr)
{
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_ps3_sxs_pressure_names[joy_axis_Index]);
}
else
ret.format("SDL-{} {}Axis {}{}", static_cast<u32>(key.source_index), modifier, joy_axis_Index + 1, key.invert ? "~" : "");
}
}
else
{
@@ -1030,6 +1110,13 @@ TinyString SDLInputSource::ConvertKeyToIcon(InputBindingKey key)
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_trigger_icons[trigger_index]);
}
}
else if (it != m_controllers.end() && IsControllerSixaxis(*it) && key.invert == false)
{
const int joy_axis_Index = key.data - std::size(s_sdl_axis_setting_names);
if (joy_axis_Index < std::size(s_sdl_ps3_pressure_icons) && s_sdl_ps3_pressure_icons[joy_axis_Index] != nullptr)
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_ps3_pressure_icons[joy_axis_Index]);
}
}
else if (key.source_subtype == InputSubclass::ControllerButton)
{
@@ -1508,11 +1595,34 @@ bool SDLInputSource::GetGenericBindingMapping(const std::string_view device, Inp
if (positive != GenericInputBinding::Unknown)
mapping->emplace_back(positive, fmt::format("SDL-{}/+{}", pid, s_sdl_axis_setting_names[i]));
}
for (u32 i = 0; i < std::size(s_sdl_generic_binding_button_mapping); i++)
if (IsControllerSixaxis(*it))
{
const GenericInputBinding binding = s_sdl_generic_binding_button_mapping[i];
if (binding != GenericInputBinding::Unknown)
mapping->emplace_back(binding, fmt::format("SDL-{}/{}", pid, s_sdl_button_setting_names[i]));
// PS3 with pressure sensitive support
for (u32 i = 0; i < std::size(s_sdl_ps3_binding_pressure_mapping); i++)
{
const GenericInputBinding binding = s_sdl_ps3_binding_pressure_mapping[i];
if (binding != GenericInputBinding::Unknown)
mapping->emplace_back(binding, fmt::format("SDL-{}/FullJoyAxis{}", pid, i));
}
// PS3 non pressure sensitive buttons
for (u32 i = 0; i < std::size(s_sdl_ps3_binding_button_mapping); i++)
{
const GenericInputBinding binding = s_sdl_ps3_binding_button_mapping[i];
if (binding != GenericInputBinding::Unknown)
mapping->emplace_back(binding, fmt::format("SDL-{}/{}", pid, s_sdl_button_setting_names[i]));
}
}
else
{
// Standard buttons
for (u32 i = 0; i < std::size(s_sdl_generic_binding_button_mapping); i++)
{
const GenericInputBinding binding = s_sdl_generic_binding_button_mapping[i];
if (binding != GenericInputBinding::Unknown)
mapping->emplace_back(binding, fmt::format("SDL-{}/{}", pid, s_sdl_button_setting_names[i]));
}
}
if (it->use_gamepad_rumble || it->haptic_left_right_effect)
@@ -1624,3 +1734,16 @@ void SDLInputSource::SendRumbleUpdate(ControllerData* cd)
SDL_StopHapticRumble(cd->haptic);
}
}
bool SDLInputSource::IsControllerSixaxis(const ControllerData& cd)
{
const SDL_GamepadType type = SDL_GetRealGamepadType(cd.gamepad);
// We check the number of buttons to exclude DsHidMini's SDF mode (which has 17 buttons??)
// SDF's input layout differs from the sixaxis or linux drivers, we only support the latter layout.
// This differing layout also isn't mapped correctly in SDL, I think due to how L2/R2 are exposed.
// Also see SetHints regarding reading the pressure sense from DsHidMini's SDF mode.
return type == SDL_GAMEPAD_TYPE_PS3 &&
SDL_GetNumJoystickAxes(cd.joystick) == 16 &&
SDL_GetNumJoystickButtons(cd.joystick) == 11;
}

View File

@@ -88,6 +88,8 @@ private:
bool HandleJoystickHatEvent(const SDL_JoyHatEvent* ev);
void SendRumbleUpdate(ControllerData* cd);
bool IsControllerSixaxis(const ControllerData& cd);
ControllerDataVector m_controllers;
// ConvertKeyToString and ConvertKeyToIcon can inspect the

View File

@@ -195,6 +195,7 @@
<ClCompile Include="DEV9\Sessions\TCP_Session\TCP_Session_Out.cpp" />
<ClCompile Include="DEV9\Win32\pcap_io_win32.cpp" />
<ClCompile Include="DEV9\Sessions\BaseSession.cpp" />
<ClCompile Include="DEV9\Sessions\UDP_Session\UDP_Common.cpp" />
<ClCompile Include="DEV9\Sessions\UDP_Session\UDP_FixedPort.cpp" />
<ClCompile Include="DEV9\Sessions\UDP_Session\UDP_Session.cpp" />
<ClCompile Include="DEV9\smap.cpp" />
@@ -636,6 +637,7 @@
<ClInclude Include="DEV9\Sessions\BaseSession.h" />
<ClInclude Include="DEV9\Sessions\ICMP_Session\ICMP_Session.h" />
<ClInclude Include="DEV9\Sessions\TCP_Session\TCP_Session.h" />
<ClInclude Include="DEV9\Sessions\UDP_Session\UDP_Common.h" />
<ClInclude Include="DEV9\Sessions\UDP_Session\UDP_FixedPort.h" />
<ClInclude Include="DEV9\Sessions\UDP_Session\UDP_BaseSession.h" />
<ClInclude Include="DEV9\Sessions\UDP_Session\UDP_Session.h" />

View File

@@ -944,6 +944,9 @@
<ClCompile Include="DEV9\Sessions\TCP_Session\TCP_Session_Out.cpp">
<Filter>System\Ps2\DEV9\Sessions\TCP_Session</Filter>
</ClCompile>
<ClCompile Include="DEV9\Sessions\UDP_Session\UDP_Common.cpp">
<Filter>System\Ps2\DEV9\Sessions\UDP_Session</Filter>
</ClCompile>
<ClCompile Include="DEV9\Sessions\UDP_Session\UDP_FixedPort.cpp">
<Filter>System\Ps2\DEV9\Sessions\UDP_Session</Filter>
</ClCompile>
@@ -1844,6 +1847,9 @@
<ClInclude Include="DEV9\Sessions\TCP_Session\TCP_Session.h">
<Filter>System\Ps2\DEV9\Sessions\TCP_Session</Filter>
</ClInclude>
<ClInclude Include="DEV9\Sessions\UDP_Session\UDP_Common.h">
<Filter>System\Ps2\DEV9\Sessions\UDP_Session</Filter>
</ClInclude>
<ClInclude Include="DEV9\Sessions\UDP_Session\UDP_FixedPort.h">
<Filter>System\Ps2\DEV9\Sessions\UDP_Session</Filter>
</ClInclude>