mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-01-31 01:15:24 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
559e4e75eb | ||
|
|
8ae84614d5 | ||
|
|
18a7e8b22c | ||
|
|
01120f6120 | ||
|
|
07be6bb5ae | ||
|
|
39b4905ef1 | ||
|
|
6c49a5aa9d | ||
|
|
aaeff2ea0f | ||
|
|
cd48e78667 | ||
|
|
f2ab4e840e | ||
|
|
9a476f8283 | ||
|
|
8e24ad724c |
411
.github/workflows/scripts/releases/generate-release-notes/package-lock.json
generated
vendored
411
.github/workflows/scripts/releases/generate-release-notes/package-lock.json
generated
vendored
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -28,7 +28,7 @@ const char* QtHost::GetDefaultThemeName()
|
||||
#ifdef __APPLE__
|
||||
return "";
|
||||
#else
|
||||
return "darkfusion";
|
||||
return "darkfusionblue";
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -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 '{}'.</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 '{}'.</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 '{}'.</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 '{2}'</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 '{}'.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -14779,190 +14784,190 @@ Swap chain: see Microsoft'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 '{}'.</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 '{}'.</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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -16,5 +16,6 @@ namespace Sessions
|
||||
}
|
||||
|
||||
virtual bool WillRecive(PacketReader::IP::IP_Address parDestIP) = 0;
|
||||
virtual void ForceClose() { RaiseEventConnectionClosed(); };
|
||||
};
|
||||
} // namespace Sessions
|
||||
|
||||
193
pcsx2/DEV9/Sessions/UDP_Session/UDP_Common.cpp
Normal file
193
pcsx2/DEV9/Sessions/UDP_Session/UDP_Common.cpp
Normal 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
|
||||
31
pcsx2/DEV9/Sessions/UDP_Session/UDP_Common.h
Normal file
31
pcsx2/DEV9/Sessions/UDP_Session/UDP_Common.h
Normal 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
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user