mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-10-12 10:39:51 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ba2f75bce | ||
|
|
26098fb42d | ||
|
|
d1d0cbccea | ||
|
|
7b4de2f13d | ||
|
|
dfc486fc6b | ||
|
|
6a900d00e6 | ||
|
|
31bd702e39 | ||
|
|
63ad856afa | ||
|
|
cb450d7e8f | ||
|
|
68e0d6021c | ||
|
|
10adf2ec39 | ||
|
|
987129bc91 | ||
|
|
b195c2ff1b | ||
|
|
f9b8c209a3 | ||
|
|
cd4d4e02ec | ||
|
|
d21c0d808d | ||
|
|
52343fa2f3 | ||
|
|
ff91404b7c | ||
|
|
e38d27157e | ||
|
|
0be621eb62 | ||
|
|
78f27eaad6 | ||
|
|
66ba732829 | ||
|
|
8f2fe1a99c | ||
|
|
0be6d12140 | ||
|
|
d6295528d7 | ||
|
|
510f4c243e | ||
|
|
ffa4c71088 | ||
|
|
5e89a0061e | ||
|
|
b26e0cfa91 | ||
|
|
33b2958da5 | ||
|
|
cfd03fc026 | ||
|
|
7c572eb4dd | ||
|
|
4d4c07c18a | ||
|
|
4c7d08582a | ||
|
|
304d544bc1 | ||
|
|
e4694a7a2c | ||
|
|
7f476dad89 | ||
|
|
222754bfd3 | ||
|
|
d064a83d11 | ||
|
|
8ffc512beb | ||
|
|
2bf8677d3c | ||
|
|
ab412d5ddb | ||
|
|
e97200a884 | ||
|
|
cb63cc82ca | ||
|
|
5f8dd1de61 | ||
|
|
479ca74cad | ||
|
|
925fbb2607 | ||
|
|
55a3aff337 | ||
|
|
12178de458 | ||
|
|
8e4659a6cb | ||
|
|
532b6520b4 | ||
|
|
1b90d1c149 | ||
|
|
c7642cb875 | ||
|
|
4dfdda9789 | ||
|
|
191932b854 | ||
|
|
b1e8e74619 | ||
|
|
183597deea | ||
|
|
2ff18d0fae | ||
|
|
3e7477107a | ||
|
|
7877ebe43d | ||
|
|
30ee6cc358 | ||
|
|
3db7c53c67 | ||
|
|
70c8683ae2 | ||
|
|
b240813958 | ||
|
|
c9fe397116 | ||
|
|
2cc650538d | ||
|
|
b444d6ad24 | ||
|
|
ba4a4b561e | ||
|
|
7c3d7c7a23 | ||
|
|
52de29af04 | ||
|
|
43a42d1a86 | ||
|
|
7b99edcfd6 | ||
|
|
7b7983ca1a | ||
|
|
a72c4c319b | ||
|
|
fcbed0bc6d | ||
|
|
32b54f1864 | ||
|
|
193975556d | ||
|
|
d9608bf0f0 | ||
|
|
46aee28f85 | ||
|
|
998298f9a8 | ||
|
|
c673da45f8 | ||
|
|
1ce71092c8 | ||
|
|
0d866154aa | ||
|
|
0374854c80 | ||
|
|
f5edadb2ef | ||
|
|
103d41944c | ||
|
|
a664f405bc | ||
|
|
5da9f4ab32 | ||
|
|
db7d845e09 | ||
|
|
e68ae2d051 | ||
|
|
1814fefb95 | ||
|
|
a1dc53fdf2 | ||
|
|
0ca1c58e75 | ||
|
|
8e245a6e15 | ||
|
|
df7964560b | ||
|
|
7d69855fbb | ||
|
|
2f5c31155a | ||
|
|
40da906c91 | ||
|
|
5298e3b7a1 | ||
|
|
e8b4646145 | ||
|
|
d5213de6dd | ||
|
|
b1f51cfaa6 | ||
|
|
b7f6f4e80f | ||
|
|
1c757181a0 | ||
|
|
5d8efbfeb9 | ||
|
|
dd12be585e | ||
|
|
fc746de37d | ||
|
|
f2b7edff27 | ||
|
|
18f18b305f | ||
|
|
d10658b818 | ||
|
|
b87a56979e | ||
|
|
5df3970a75 | ||
|
|
a3409242ce | ||
|
|
54ab16913e | ||
|
|
2ccc4983fa | ||
|
|
5741d891bb | ||
|
|
4dce4ecbe5 | ||
|
|
a7e274234f | ||
|
|
f1574d7060 | ||
|
|
08b226b8f8 | ||
|
|
373d0ea7f0 | ||
|
|
babeda0ed2 | ||
|
|
c3f3529b98 | ||
|
|
96ccd89cd6 | ||
|
|
0850e0ff5c | ||
|
|
a7cbd46749 | ||
|
|
0e0cdc7c29 | ||
|
|
acb249f057 | ||
|
|
a3dc7e6af4 | ||
|
|
982337435a | ||
|
|
cdc04e0d59 | ||
|
|
7aa2422a07 | ||
|
|
17320679e3 | ||
|
|
1dd70e036e | ||
|
|
53d9522073 | ||
|
|
3b3c7f4f07 | ||
|
|
a5515d2371 | ||
|
|
dfc0542a9f | ||
|
|
4d88114c92 | ||
|
|
81cbf7ba3d | ||
|
|
83b1e07299 | ||
|
|
8307c54cd4 | ||
|
|
805c931d49 | ||
|
|
be69c054ee | ||
|
|
d98d378704 | ||
|
|
d9a59820ba | ||
|
|
a1c6b12311 | ||
|
|
a3232fddee | ||
|
|
71d1a4527d | ||
|
|
5b350ff3e1 | ||
|
|
1c460fdd7f | ||
|
|
53d44aa4a1 | ||
|
|
d42fc3dc41 | ||
|
|
1331e307ce | ||
|
|
058b5fb556 | ||
|
|
7b1d4f98ef | ||
|
|
fd818e7016 | ||
|
|
431b169358 | ||
|
|
38d27036f9 | ||
|
|
da0dc28841 | ||
|
|
a8fabaf570 | ||
|
|
1fe12b7778 | ||
|
|
276ead3cef | ||
|
|
a321a0a18d | ||
|
|
96bb9740bf | ||
|
|
db90035c49 | ||
|
|
2ccdb73a31 | ||
|
|
7390f3dd9a | ||
|
|
f0d2485981 | ||
|
|
be39b3b9f0 | ||
|
|
80567b686b | ||
|
|
fb4a09215a | ||
|
|
dcbc44a399 | ||
|
|
2c961d0614 | ||
|
|
93eefd3820 | ||
|
|
5753d99db1 | ||
|
|
b4e2e9aae6 | ||
|
|
38c6b90d76 | ||
|
|
cf6c06eb66 | ||
|
|
ad7c7a28aa | ||
|
|
00fe384258 | ||
|
|
19ae2e9b23 | ||
|
|
488c71dfd7 | ||
|
|
634c76f0bc | ||
|
|
622771ec00 | ||
|
|
5e4d17e198 | ||
|
|
2ab2c23462 | ||
|
|
3363a48127 | ||
|
|
7ae033756a | ||
|
|
f97106bdc2 | ||
|
|
1cf89b1bda | ||
|
|
2d1ce572be | ||
|
|
b69f207406 | ||
|
|
cefa1285a8 | ||
|
|
c96c2099b7 | ||
|
|
9d52b33805 | ||
|
|
c68b528a73 | ||
|
|
479d5c9c9e | ||
|
|
8d501fb9d4 | ||
|
|
c5d6b85c4c | ||
|
|
7f2e02671e | ||
|
|
3e9d881aa6 | ||
|
|
615f529e65 | ||
|
|
d9a72d6ca7 | ||
|
|
56fabd9760 | ||
|
|
58b3505593 | ||
|
|
52616e0f10 | ||
|
|
6fc79f7ccf | ||
|
|
1707d7fc88 | ||
|
|
5c1ce9cbef | ||
|
|
2d293d8e5a | ||
|
|
105c4988f0 | ||
|
|
9a8a66a29c | ||
|
|
1f080485b9 | ||
|
|
c405227129 | ||
|
|
3fa07db78b | ||
|
|
205a4481f3 | ||
|
|
dad97b9a96 | ||
|
|
8e2d700fab | ||
|
|
77cb9423db | ||
|
|
a1c317a8c4 | ||
|
|
3aab4c5d59 | ||
|
|
063586ea81 | ||
|
|
6d22e2165d | ||
|
|
a70f698569 | ||
|
|
13eaa2b03c | ||
|
|
4514ad6216 | ||
|
|
6e6ffc5058 | ||
|
|
9f696db955 | ||
|
|
7f5f8c4a70 | ||
|
|
e447511a67 | ||
|
|
38eba804f4 | ||
|
|
ef65627338 | ||
|
|
a106fb0ee7 | ||
|
|
fadced35a5 | ||
|
|
3660716e4f | ||
|
|
712ab24775 | ||
|
|
083859b94c | ||
|
|
0c382f4fc9 | ||
|
|
dc3c7327d8 | ||
|
|
c82221f292 | ||
|
|
b5a174e933 | ||
|
|
f9b4d121ea | ||
|
|
c82e598950 | ||
|
|
1e0e352f95 | ||
|
|
56237b6858 | ||
|
|
99a926d278 | ||
|
|
ff40118b94 | ||
|
|
fe9281f44a | ||
|
|
fdffb7d5f9 | ||
|
|
3fa2bf6688 | ||
|
|
c4d834480a | ||
|
|
3efbf060a6 | ||
|
|
d08d568d5e | ||
|
|
c938d3e049 | ||
|
|
e59ed70470 | ||
|
|
accfecd2d1 | ||
|
|
507b395d4b | ||
|
|
7022a322a6 | ||
|
|
71f8a5e09d | ||
|
|
9e86f165d1 | ||
|
|
f4a74819d3 | ||
|
|
8db660b185 | ||
|
|
a90c841b39 | ||
|
|
e76fbf4489 | ||
|
|
92721aedfe | ||
|
|
6c0e2823f8 | ||
|
|
e13ee15791 | ||
|
|
394a9e4b52 | ||
|
|
a659805470 | ||
|
|
e826098bcb | ||
|
|
2d103407f8 | ||
|
|
4b9f2af41f | ||
|
|
ac6dc84e84 | ||
|
|
fb62c6d03a | ||
|
|
be509deda0 | ||
|
|
1b3e02044f | ||
|
|
b7056bc88a | ||
|
|
2868fbe4ed | ||
|
|
c1b1d00b4c | ||
|
|
0646d36708 | ||
|
|
ca522cf84c | ||
|
|
b6bdf0d92d | ||
|
|
ec4b1ae655 | ||
|
|
1b569fde4d | ||
|
|
6c4b749fb8 | ||
|
|
932336ac30 | ||
|
|
b14b6d3cef | ||
|
|
4f11259e58 | ||
|
|
bcd8a09f49 | ||
|
|
c74adaba8e | ||
|
|
12b4d3d50c | ||
|
|
da2153db2c | ||
|
|
e6c3cce5e2 | ||
|
|
41f0ecc17b | ||
|
|
2003f2404f | ||
|
|
726cd2d358 | ||
|
|
c5375ccadf | ||
|
|
43cedf366b | ||
|
|
6ba56a52a4 | ||
|
|
961c86fbbf | ||
|
|
de9184f03c | ||
|
|
48cc1ac0a9 | ||
|
|
954d7968c7 | ||
|
|
028d1e8f4a | ||
|
|
448fa5dd3a | ||
|
|
bcb2d22311 | ||
|
|
8d414937d9 | ||
|
|
99a91bb562 | ||
|
|
c59667b689 | ||
|
|
36eaed481c | ||
|
|
71e9f4ea57 | ||
|
|
09bb101de1 | ||
|
|
973bb520ac | ||
|
|
fb2f1326ad | ||
|
|
9c6df388e8 | ||
|
|
f2ac83f5eb | ||
|
|
a226238355 | ||
|
|
774ff4933d | ||
|
|
17075366c6 | ||
|
|
a89b77c1c5 | ||
|
|
aed242aa3f | ||
|
|
ca223f70bc | ||
|
|
14bc19b7bd | ||
|
|
06d28a5f11 | ||
|
|
ceb1ab0718 | ||
|
|
54014a7de4 | ||
|
|
9a26a70e71 | ||
|
|
5aa23d0276 | ||
|
|
8a78c3ca59 | ||
|
|
9c850a34f2 | ||
|
|
78cb66ecfe | ||
|
|
244491298b | ||
|
|
d55e9fcf22 | ||
|
|
0885cc617e | ||
|
|
b99fbe7bec | ||
|
|
5a43724b44 | ||
|
|
8e92a8d845 | ||
|
|
05b4b10360 | ||
|
|
87676e3632 | ||
|
|
e606570b44 | ||
|
|
b6dc4e8e04 | ||
|
|
284233bc6d | ||
|
|
d7d1d9133b | ||
|
|
c47bbab85f | ||
|
|
ab95783bc9 | ||
|
|
065b490eb4 | ||
|
|
57dd6e763a | ||
|
|
7a953ecf04 | ||
|
|
0ead9328f2 | ||
|
|
1559b15afe | ||
|
|
25f1a9dfca | ||
|
|
2f53c4389f | ||
|
|
de6c1b526d | ||
|
|
33a723affa | ||
|
|
bf949109ad | ||
|
|
fbaaf2b57f | ||
|
|
7be182e33b | ||
|
|
e6235886f1 | ||
|
|
5ab2398b29 | ||
|
|
db543e095e | ||
|
|
645458b0fc | ||
|
|
0a85b394ec | ||
|
|
275c2d4093 | ||
|
|
4cb260c555 | ||
|
|
8ac75b7dc4 | ||
|
|
65c8fb5699 | ||
|
|
df92b1d886 | ||
|
|
0514f521e9 | ||
|
|
cd7d81639a | ||
|
|
216b74426a | ||
|
|
1a907b5659 | ||
|
|
c19594254e | ||
|
|
9bb7e2e749 | ||
|
|
17711f219f | ||
|
|
677e13da42 | ||
|
|
e04198e825 | ||
|
|
4048b7aaef | ||
|
|
83a522a8e1 | ||
|
|
6a5eb794cb | ||
|
|
5955980aea | ||
|
|
7338e1610f | ||
|
|
2893b42a6f | ||
|
|
12619da666 | ||
|
|
a7a3e4fc90 | ||
|
|
42e9eda2c5 | ||
|
|
5e40242bdd | ||
|
|
44a2e4d663 | ||
|
|
a99fde6f5b | ||
|
|
c6e96729cc | ||
|
|
d9799c7f38 | ||
|
|
54993de362 | ||
|
|
0c0614a4df | ||
|
|
c006a7f1a5 | ||
|
|
d267b420f8 | ||
|
|
726263377f | ||
|
|
0c486fb63a | ||
|
|
a8bfc50762 | ||
|
|
85f0cc01ea | ||
|
|
78e70af989 | ||
|
|
3ef20ebb01 | ||
|
|
da5d5e5027 | ||
|
|
e2b2493c7f | ||
|
|
30f56dd404 | ||
|
|
7bd312f128 | ||
|
|
e674414875 | ||
|
|
c85105a7fd | ||
|
|
1d644186f4 | ||
|
|
010bf1753e | ||
|
|
01c59b99a7 | ||
|
|
eb61fc1fbd | ||
|
|
98906eb035 | ||
|
|
48d2b24813 | ||
|
|
42cfad20eb | ||
|
|
85bc1d7074 | ||
|
|
7a4c82aec9 | ||
|
|
0d9afb039e | ||
|
|
71a6aeadcf | ||
|
|
124462fbab | ||
|
|
7d1b67b17a | ||
|
|
6f3df0ba7b | ||
|
|
26209734e3 | ||
|
|
37d64bf887 | ||
|
|
e3585a4ec1 | ||
|
|
ac50c09b9d | ||
|
|
cb53f2c4d6 | ||
|
|
802320ec67 | ||
|
|
27bfd637e6 | ||
|
|
2caa367615 | ||
|
|
34c34504f3 | ||
|
|
5d8862f6dd | ||
|
|
eea763352a | ||
|
|
5b2039d588 | ||
|
|
69ba2e2f14 | ||
|
|
14b71c2e11 | ||
|
|
bbdf5465f9 | ||
|
|
985ac336f5 | ||
|
|
45c42814ef | ||
|
|
f4a2b507f1 | ||
|
|
03d03b2bb4 | ||
|
|
46718dcb33 | ||
|
|
6567a5a2f8 | ||
|
|
11aa943145 | ||
|
|
f2d44c63af | ||
|
|
5d3625b7eb | ||
|
|
2416d65262 | ||
|
|
e8961edf40 | ||
|
|
fdcfded8df | ||
|
|
19b9c2e60b | ||
|
|
bd9c4705f2 | ||
|
|
448cc23fac | ||
|
|
f9a843306f | ||
|
|
85c9fa215b | ||
|
|
8a3061d175 | ||
|
|
9ead7c34b1 | ||
|
|
6a249ffdc9 | ||
|
|
b848546d19 | ||
|
|
3aea3b15dc | ||
|
|
071c9f10f1 | ||
|
|
68f260a698 | ||
|
|
261b467b83 | ||
|
|
9bcd45d70c | ||
|
|
8bbdd3715a | ||
|
|
b8816a1e0e | ||
|
|
5bc2928588 | ||
|
|
e678a8e572 | ||
|
|
3aac7d776d | ||
|
|
8bbcd5936d | ||
|
|
b97f4bd8da | ||
|
|
8fd2ae954d | ||
|
|
243d7db5b5 | ||
|
|
809359cb20 | ||
|
|
bab81aa23e | ||
|
|
8a6c96745a | ||
|
|
358101c47b | ||
|
|
c4eff69711 | ||
|
|
5d2601599e | ||
|
|
e5e280cd3f | ||
|
|
c122edd638 | ||
|
|
d12d8782af | ||
|
|
64da425e81 | ||
|
|
b78bae0b9f | ||
|
|
ca25fbaa5d | ||
|
|
323e2d35a2 | ||
|
|
57ecb42433 | ||
|
|
84ceef9717 | ||
|
|
0dd3d6528c | ||
|
|
ddd82ecada | ||
|
|
7973b8ac6d | ||
|
|
3c15df4e4d | ||
|
|
719cf8a54a | ||
|
|
1b879360b8 | ||
|
|
ad059d03af | ||
|
|
78ba581137 | ||
|
|
cd044148be | ||
|
|
91cd82a0c2 | ||
|
|
e7c3d6ab26 | ||
|
|
a88331bb22 | ||
|
|
6892ee4c2e | ||
|
|
0059e4e92e | ||
|
|
46b7428fad | ||
|
|
582b5ba29e | ||
|
|
cb175278b6 | ||
|
|
82164a54c1 | ||
|
|
6161ecd7aa | ||
|
|
de33fda28c | ||
|
|
f9f88aa9e5 | ||
|
|
3be5aa99cc | ||
|
|
3e68a7f385 | ||
|
|
9a4b849260 | ||
|
|
9a24c8d11f | ||
|
|
0617eff348 | ||
|
|
003b368980 | ||
|
|
6f5f198acd | ||
|
|
107b751a43 | ||
|
|
4475671bbf | ||
|
|
7e35f59997 | ||
|
|
970d745818 | ||
|
|
adec3ae7f9 | ||
|
|
5e2d0eb762 | ||
|
|
26782525f4 | ||
|
|
d0e6d4eefc | ||
|
|
f19d398bec | ||
|
|
6b80ac4805 | ||
|
|
13ceef9f46 | ||
|
|
ffc50905a6 | ||
|
|
cbc7b60ba5 | ||
|
|
47efd770a8 | ||
|
|
f53547b173 | ||
|
|
cb5b866c61 | ||
|
|
2f3c0f04d2 | ||
|
|
3f493fb209 | ||
|
|
f7eb0d8d76 | ||
|
|
fc93d932c8 | ||
|
|
3cbf9b8b6c | ||
|
|
12b1efc266 | ||
|
|
4c63acfb40 | ||
|
|
3f4364fe74 | ||
|
|
ee43ab7362 | ||
|
|
2dc6cf014c | ||
|
|
c285c2fb41 | ||
|
|
c41595e79f | ||
|
|
bf541b5828 | ||
|
|
41e2d101e7 | ||
|
|
c27b38f300 | ||
|
|
5bd7fd7817 | ||
|
|
7f9b8d23cd | ||
|
|
01e3fed466 | ||
|
|
ea0e10e704 | ||
|
|
c2eb11eae6 | ||
|
|
26e37d8c8c | ||
|
|
9b1eb45a47 | ||
|
|
92870a3d4e | ||
|
|
f7cfdc6570 | ||
|
|
a603fbba8c | ||
|
|
db907a2586 | ||
|
|
b9cee7a3a9 | ||
|
|
d7c15851b4 | ||
|
|
a723152dea | ||
|
|
2f4034590f | ||
|
|
7b6a8cc2d6 | ||
|
|
6df35891ad | ||
|
|
eaef23d43a | ||
|
|
8cde4b2153 | ||
|
|
ed3af84437 | ||
|
|
81b85e55e4 | ||
|
|
9af11f5cf1 | ||
|
|
d6d5c60823 | ||
|
|
0230580a88 | ||
|
|
ae98583ed2 | ||
|
|
628ea5ec15 | ||
|
|
400d9a1c24 | ||
|
|
58ef670992 | ||
|
|
de13ae4753 | ||
|
|
f48ca59235 | ||
|
|
804e06356b | ||
|
|
70e3e15e2f | ||
|
|
852407b8cb | ||
|
|
f945ab62c0 | ||
|
|
ec208289fa | ||
|
|
b93c4733a8 | ||
|
|
6d42df0ffc | ||
|
|
502ea1f436 | ||
|
|
8d034a36e8 | ||
|
|
75fea2216b | ||
|
|
3d587726a2 | ||
|
|
f3f52feddf | ||
|
|
652cf60bfe | ||
|
|
96fee314f0 | ||
|
|
a6d07c0e55 | ||
|
|
4214dff35e | ||
|
|
228d04195d | ||
|
|
ee8988ea21 | ||
|
|
efee6e2423 | ||
|
|
c36590bb06 | ||
|
|
daa437904e | ||
|
|
df47950f98 | ||
|
|
2d88aefbba | ||
|
|
7bdd927957 | ||
|
|
f61c0cb5df | ||
|
|
59e59c7de6 | ||
|
|
401cc4ae8f | ||
|
|
9d91ba6168 | ||
|
|
a0bebfa5ca | ||
|
|
d7ed328f4f | ||
|
|
d509eb8664 | ||
|
|
84d5056e44 | ||
|
|
f113e7bb93 | ||
|
|
5295f3ac18 | ||
|
|
cd814f8c92 | ||
|
|
354e1170ae | ||
|
|
ca3e5b268e | ||
|
|
27f0e879d3 | ||
|
|
ed195ef077 | ||
|
|
f1a858f351 | ||
|
|
b57cca4ae4 | ||
|
|
75ec6a8dca | ||
|
|
76de5ba764 | ||
|
|
ff162b9c99 | ||
|
|
5017397c4e | ||
|
|
4c52ab803c | ||
|
|
d277003ef7 | ||
|
|
c2abae56cd | ||
|
|
a5bbb23273 | ||
|
|
a2c78dd32c | ||
|
|
a7fe472583 | ||
|
|
bad72a3844 | ||
|
|
81431604ec | ||
|
|
884652109c | ||
|
|
709016a3ab | ||
|
|
50c78cb0e1 | ||
|
|
d4a37a1dd4 | ||
|
|
cf9133abed | ||
|
|
b6ee57853f | ||
|
|
b778355c68 | ||
|
|
831a078e3f | ||
|
|
0d999c08c4 | ||
|
|
d3abc6eee3 | ||
|
|
942feb64a3 | ||
|
|
5e8ba021ac | ||
|
|
22d9cd0424 | ||
|
|
dbc0ab4821 | ||
|
|
4bd4fc6a5e | ||
|
|
9173ff1657 | ||
|
|
4add14cb72 | ||
|
|
7a3deb649f | ||
|
|
a1deb2921c | ||
|
|
3ac6ce68d4 | ||
|
|
7919f44b9b | ||
|
|
0705c1b0c4 | ||
|
|
709acc39ca | ||
|
|
d3ef2822f8 | ||
|
|
3164e6fe46 | ||
|
|
24fbafdb1d | ||
|
|
428599535b | ||
|
|
79822e1ac5 | ||
|
|
4332190805 | ||
|
|
0e44b93c69 | ||
|
|
7a24caf715 | ||
|
|
04dd333f8d | ||
|
|
969913e3a7 | ||
|
|
2e1e416c35 | ||
|
|
e59af03ae2 | ||
|
|
84b905dd69 | ||
|
|
429f1fbcbb | ||
|
|
22f8cb040a | ||
|
|
88569563d8 | ||
|
|
28b3deaf8e | ||
|
|
9e2b54e6ac | ||
|
|
696fdc3059 | ||
|
|
2484984a31 | ||
|
|
cb4914754a | ||
|
|
b39b7a23dc | ||
|
|
11e147c646 | ||
|
|
1e14e7521b | ||
|
|
a013b60cde | ||
|
|
24ba41a3e1 | ||
|
|
7a90d09cfe | ||
|
|
5ecfc95c13 | ||
|
|
8604f1c5d8 | ||
|
|
8b05c8cc1f | ||
|
|
d75543a5b1 | ||
|
|
2aeb08f929 | ||
|
|
85c59207f7 | ||
|
|
63851f4242 | ||
|
|
ee37ef277d | ||
|
|
357b7d4462 | ||
|
|
8df0fcc0cc | ||
|
|
a7d90852dd | ||
|
|
9b3a916af0 | ||
|
|
0fcb15ab18 | ||
|
|
1d657c4e63 | ||
|
|
5d62ee4b42 | ||
|
|
4e49c5319d | ||
|
|
6f0e78b6b5 | ||
|
|
b35e4434aa | ||
|
|
21d5336753 | ||
|
|
4e2839f3d3 | ||
|
|
45a1da2d89 | ||
|
|
8cc37e036d | ||
|
|
9bf67f0312 | ||
|
|
430984729d | ||
|
|
95da0365a3 | ||
|
|
e9f833a2e8 | ||
|
|
656bc2a92c | ||
|
|
634a41b488 | ||
|
|
53835b294e | ||
|
|
fa418f0dbb | ||
|
|
d0fdd9bb6d | ||
|
|
aec0917a86 | ||
|
|
cdbc43712b | ||
|
|
50df95d6c4 | ||
|
|
1269ebff27 | ||
|
|
bdd28bfa0d | ||
|
|
49b0306b1d | ||
|
|
217769d801 | ||
|
|
9d9f210ddb | ||
|
|
2f7b8a7149 | ||
|
|
2cacaa2da4 | ||
|
|
d755124c48 | ||
|
|
700ca262f4 | ||
|
|
4003b017f5 | ||
|
|
a71d3b8cab | ||
|
|
bb5dc93bec | ||
|
|
5c90bf5865 | ||
|
|
d87cf99b65 | ||
|
|
dc06cac014 | ||
|
|
94977d3545 | ||
|
|
f2820b75db | ||
|
|
cae36151ff | ||
|
|
5434f0b0a4 | ||
|
|
c05832b705 | ||
|
|
8145f24f05 | ||
|
|
88f81381e8 | ||
|
|
5bbce42adc | ||
|
|
9dc9730898 | ||
|
|
11b57268e3 | ||
|
|
95c04556f0 | ||
|
|
99d15190e5 | ||
|
|
d6e813cd72 | ||
|
|
60c9705a7d | ||
|
|
6647c5a2bd | ||
|
|
03647fdb4e | ||
|
|
1b54e8910c | ||
|
|
3f27cb8ff5 | ||
|
|
fa5b899411 | ||
|
|
35f65c2244 | ||
|
|
ed145540a2 | ||
|
|
537ad399bb | ||
|
|
24a1576629 | ||
|
|
f05ece47ce | ||
|
|
b90eef3fa7 | ||
|
|
73d9f34907 | ||
|
|
18fe6eeb71 | ||
|
|
bfada94b9f | ||
|
|
71e5d87a07 | ||
|
|
67ee6c1ab9 | ||
|
|
8c89adf177 | ||
|
|
bec42ea93e | ||
|
|
f5e8a2bfa9 | ||
|
|
2f0daa62fc | ||
|
|
e297c8cc64 | ||
|
|
026077a7f8 | ||
|
|
5b41d5880d | ||
|
|
8eaa3ec9a2 | ||
|
|
635aac8ff3 | ||
|
|
d63273c473 | ||
|
|
cffd02bb35 | ||
|
|
5c55819b57 | ||
|
|
a7fc31f321 | ||
|
|
51b35a7b2f | ||
|
|
aca652e6fd | ||
|
|
09d602fd5a | ||
|
|
87608865b6 | ||
|
|
42242b3c43 | ||
|
|
064365d6fb | ||
|
|
927e2492ef | ||
|
|
c7478d6dcc | ||
|
|
ed6a2f862e | ||
|
|
7b5f3e6921 | ||
|
|
f95a225d63 | ||
|
|
f8c88c3a7a | ||
|
|
2af7b58ce4 | ||
|
|
efc9a1a668 | ||
|
|
8da8c267c6 | ||
|
|
e32d19ffac | ||
|
|
33123bff04 | ||
|
|
c0598f61e7 | ||
|
|
0735c55bfd | ||
|
|
5ee92d2e6c | ||
|
|
8be3a398dc | ||
|
|
860e2a82b1 | ||
|
|
6a15f9dc8e | ||
|
|
a8559a526a | ||
|
|
5758ab11f7 | ||
|
|
c1263eeb79 | ||
|
|
e429f8cf05 | ||
|
|
4d38e69fd9 | ||
|
|
465b845bdf | ||
|
|
6593caff67 | ||
|
|
e5cdae8c5a | ||
|
|
54b8b5399b | ||
|
|
7a4ec42362 | ||
|
|
b8ca6d953f | ||
|
|
5c4be5dd3b | ||
|
|
5e745ac661 | ||
|
|
79616a376f | ||
|
|
fbe9ad0f45 | ||
|
|
a4649475b6 | ||
|
|
c38e8229ed | ||
|
|
00c57be1ed | ||
|
|
ff68a1ea09 | ||
|
|
048b1c3f05 | ||
|
|
06c8a87534 | ||
|
|
41a7cd29f8 | ||
|
|
5bc128e085 | ||
|
|
74f3349b19 | ||
|
|
0fda2dd60f | ||
|
|
4f321eb319 | ||
|
|
4fed5e7b88 | ||
|
|
f1a1f5616c | ||
|
|
9373461d09 | ||
|
|
23b414ac84 | ||
|
|
5252f47a33 | ||
|
|
27b13dff20 | ||
|
|
32a52c0e35 | ||
|
|
3fd8fd0e34 | ||
|
|
16a53dfec7 | ||
|
|
2ce45bd904 | ||
|
|
1492d647f4 | ||
|
|
0b535328c8 | ||
|
|
f32ff351da | ||
|
|
e379fba97d | ||
|
|
57b4687ac2 | ||
|
|
339877ea7d | ||
|
|
e7165cbe99 | ||
|
|
d85f1c7155 | ||
|
|
9e2c41bd48 | ||
|
|
2d1be09180 | ||
|
|
d25972e196 | ||
|
|
62d32ab45e | ||
|
|
1ca995cc96 | ||
|
|
3164d44952 | ||
|
|
546f3082a2 | ||
|
|
8d9abd396b | ||
|
|
8112c7cc19 | ||
|
|
bf85a3fdd9 | ||
|
|
8e370c2cf1 | ||
|
|
6349ea2ee9 | ||
|
|
2f2ac69d60 | ||
|
|
4a92d96cf4 | ||
|
|
9a2243bfcb | ||
|
|
97704e35e0 | ||
|
|
40e9ee5af0 | ||
|
|
3fa1241ac0 | ||
|
|
62747bb40d | ||
|
|
44b33f1962 | ||
|
|
cc999d4210 | ||
|
|
7c2bd56776 | ||
|
|
5fc7450865 | ||
|
|
4ca0f0b11d | ||
|
|
66de4022b1 | ||
|
|
2b9368abf5 | ||
|
|
f8a5a6ad93 | ||
|
|
fa1aa9dcf3 | ||
|
|
883a6889e0 | ||
|
|
1b5a895346 | ||
|
|
2187f8ae51 | ||
|
|
17f1fc31bc | ||
|
|
ecf77ecef0 | ||
|
|
db474c292f | ||
|
|
b08e805020 | ||
|
|
7b540cdb20 | ||
|
|
059e70069d | ||
|
|
9c719a5857 | ||
|
|
375eb21c07 | ||
|
|
1bd246d2d3 | ||
|
|
8c82ce8bed | ||
|
|
eafa6a9a25 | ||
|
|
b9d027a76c | ||
|
|
0a45c84e16 | ||
|
|
a88951baf3 | ||
|
|
66349fcb5b | ||
|
|
c6602f673b | ||
|
|
7c6b3dcdb9 | ||
|
|
c11979d124 | ||
|
|
3058a71d72 | ||
|
|
b41b10a031 | ||
|
|
a87d175295 | ||
|
|
dff29a7864 | ||
|
|
dd81c92a02 | ||
|
|
64ba0dd5e6 | ||
|
|
0a5b88ac38 | ||
|
|
f63a34dcc2 | ||
|
|
d8710c431d | ||
|
|
67464f97df | ||
|
|
190378bc33 | ||
|
|
da599f7286 | ||
|
|
73c8c270a6 | ||
|
|
d7da6a713b | ||
|
|
6a2ad0a0aa | ||
|
|
84b61e3850 | ||
|
|
7e436f9bf1 | ||
|
|
2613d7eee7 | ||
|
|
55e17ccd3b | ||
|
|
f368a56c66 | ||
|
|
79cb35daa6 | ||
|
|
b0c1791a0c | ||
|
|
61a2604824 | ||
|
|
08c926622d | ||
|
|
b533a560e6 | ||
|
|
e4a49cd425 | ||
|
|
fdce82fc24 | ||
|
|
5f00b87a44 | ||
|
|
53180b8141 | ||
|
|
4cc0e4c7fc | ||
|
|
46364856ae | ||
|
|
f5c420994d | ||
|
|
c5ee48f54a | ||
|
|
6f50f0854f | ||
|
|
53d76db753 | ||
|
|
c860aa2107 | ||
|
|
a545fe92a0 | ||
|
|
ee436307cf | ||
|
|
33016742f1 | ||
|
|
320e8d634a | ||
|
|
e52b6ecbbf | ||
|
|
a4712a283f | ||
|
|
6da3021158 | ||
|
|
0064ecb85b | ||
|
|
1d71854c7f | ||
|
|
a9be80da6f | ||
|
|
2387af0854 | ||
|
|
021f16f775 | ||
|
|
fb1c1eeaef | ||
|
|
6fa7efbcc3 | ||
|
|
c534da86c3 | ||
|
|
6b5a2f781a | ||
|
|
cd7cb1cc11 | ||
|
|
c0b358003f | ||
|
|
29b4577fdb | ||
|
|
b34eba2fb3 | ||
|
|
6850e2e5a8 | ||
|
|
3c2815e89c | ||
|
|
4312221498 | ||
|
|
c102d1ec0d | ||
|
|
98e9b3cf30 | ||
|
|
f9ffce76f2 | ||
|
|
e2e1cf02f4 | ||
|
|
026297334f | ||
|
|
4f47fee360 | ||
|
|
9c143d3d45 | ||
|
|
58eb7d2c04 | ||
|
|
2bb533274c | ||
|
|
3fc41b6d66 | ||
|
|
c350c02592 | ||
|
|
9dde2bf04e | ||
|
|
4e160320ef | ||
|
|
ca762d5b84 | ||
|
|
d93f5f9f84 | ||
|
|
ac28c391f6 | ||
|
|
d519571e18 | ||
|
|
99e6b19025 | ||
|
|
3d6773dd25 | ||
|
|
d36a4bd858 | ||
|
|
26db44b3b3 | ||
|
|
a6c3ef350a | ||
|
|
f3d0c3ba28 | ||
|
|
97c7d069ac | ||
|
|
af7ae45888 | ||
|
|
5c4b0a165b | ||
|
|
af2af23306 | ||
|
|
59f54caf08 | ||
|
|
b3ac8127ea | ||
|
|
90ea92d93b | ||
|
|
f694000454 | ||
|
|
b2daaff29f | ||
|
|
d93d9b2c5a | ||
|
|
4f23f5505a | ||
|
|
69bc124930 | ||
|
|
056a8ba1b1 | ||
|
|
350e7b09f5 | ||
|
|
1899b61fa5 | ||
|
|
773808169e | ||
|
|
a6fb0c8931 | ||
|
|
155883ea2a | ||
|
|
ca87d103fd | ||
|
|
5dd7792c3d | ||
|
|
e8cd6f4ef6 | ||
|
|
b6ed4201df | ||
|
|
c25e3e33ac | ||
|
|
a8dd053593 | ||
|
|
66d2bc3dd5 | ||
|
|
d773a3f94e | ||
|
|
4e0995744a | ||
|
|
80c1c5dd6d | ||
|
|
91a8c56c37 | ||
|
|
5144a999b3 | ||
|
|
3b1abec405 | ||
|
|
8b02f46e67 | ||
|
|
41e6cbbb5a | ||
|
|
ed7f1aa17c | ||
|
|
5839ad9c70 | ||
|
|
9c725935dc | ||
|
|
108276c076 | ||
|
|
82a4ff051e | ||
|
|
d1c8073106 | ||
|
|
3829802699 | ||
|
|
46bbbd2056 | ||
|
|
cbbf52878a | ||
|
|
278daddd2a | ||
|
|
48e2d808c9 | ||
|
|
28ab991302 | ||
|
|
d40a4ee04e | ||
|
|
7ea0a96d02 | ||
|
|
985703058b | ||
|
|
14ca11fdf4 | ||
|
|
7bc08d05c6 | ||
|
|
79d0e0eb3c | ||
|
|
570b2bddca | ||
|
|
f3cf1da7b7 | ||
|
|
3c9a4417f2 | ||
|
|
b212935c70 | ||
|
|
e05d359721 | ||
|
|
74bcbd9816 | ||
|
|
b14c76c1c5 | ||
|
|
6d058586c4 | ||
|
|
771837ee55 | ||
|
|
d2fc5a5b81 | ||
|
|
3b21833b8e | ||
|
|
ed02f3a2ce | ||
|
|
7028e85fac | ||
|
|
96f73f4497 | ||
|
|
3ff4f188f4 | ||
|
|
61e1c0f1fb | ||
|
|
631e7ef979 | ||
|
|
7dce197ec4 | ||
|
|
9e0824112f | ||
|
|
e1734b51c3 | ||
|
|
4cac76caad | ||
|
|
077f2a73e1 | ||
|
|
a60734e27b | ||
|
|
3574677b66 | ||
|
|
b3cc01387f | ||
|
|
e26c80c129 | ||
|
|
80b6faef10 | ||
|
|
7d0df300ea | ||
|
|
1ca8ab393a | ||
|
|
3cca094d2d | ||
|
|
a088b18e95 | ||
|
|
e5af69d7b2 | ||
|
|
814821d760 | ||
|
|
7a8c88056a | ||
|
|
b6b043b23d | ||
|
|
c5db9899e4 | ||
|
|
081c094c5a | ||
|
|
b6c8374aa5 | ||
|
|
06a6880c6c | ||
|
|
bd5c10fd48 | ||
|
|
d3804de243 | ||
|
|
36cd81fb5f | ||
|
|
7a4d7aa936 | ||
|
|
aff082e0c1 | ||
|
|
2b144101ab | ||
|
|
d4b7c31ec8 | ||
|
|
6c9445ff28 | ||
|
|
2d6ca912fe | ||
|
|
3b9cc0bc3a | ||
|
|
88175aa84f | ||
|
|
a7c606c8ac | ||
|
|
48acbbe4f5 | ||
|
|
b729772041 | ||
|
|
ea0d8a0d78 | ||
|
|
e79f56bfdc | ||
|
|
a543f38704 | ||
|
|
1cdc401cc5 | ||
|
|
50d6396f99 | ||
|
|
7d41bbdd2b | ||
|
|
d53a6a87f6 | ||
|
|
1e63385dfc | ||
|
|
4ffeee0344 | ||
|
|
0b9c53e254 | ||
|
|
27f857a8fe | ||
|
|
c340eb2f17 | ||
|
|
e43435e152 | ||
|
|
ac3d14cf5c | ||
|
|
426f3c445b | ||
|
|
bbeb7c4cd7 | ||
|
|
6c87413f48 | ||
|
|
b10c742f10 | ||
|
|
9e3e01d8f6 | ||
|
|
bcd9663349 | ||
|
|
72fa4098dc | ||
|
|
6dc95dd078 | ||
|
|
11050a7032 | ||
|
|
f826f95c70 | ||
|
|
934bc34685 | ||
|
|
f463c128e3 | ||
|
|
7168cd566a | ||
|
|
110c786d80 | ||
|
|
fb194241d5 | ||
|
|
09554c43ba | ||
|
|
1b1143094e | ||
|
|
8121bd443c | ||
|
|
a1a140db91 | ||
|
|
e9fb3572f9 | ||
|
|
1d85de6236 | ||
|
|
6981e308a0 | ||
|
|
8e80ddd99f | ||
|
|
beac01d5d1 | ||
|
|
d7f8e25cca | ||
|
|
e0c3df5328 | ||
|
|
59468f1e1e | ||
|
|
8ab0ceaa67 | ||
|
|
b9f05ba71b | ||
|
|
5311f004d0 | ||
|
|
cb276f0da7 | ||
|
|
34c26eff68 | ||
|
|
b700a7abd9 | ||
|
|
c279583f1f | ||
|
|
ce12c29441 | ||
|
|
e95a980651 | ||
|
|
87fc45d661 | ||
|
|
93a2f1edc8 | ||
|
|
22fe8648ef | ||
|
|
f42b09d1fc | ||
|
|
b8e6785789 | ||
|
|
afdb57bee9 | ||
|
|
b22d0a0b4a | ||
|
|
ec989781a3 | ||
|
|
110ef818b3 | ||
|
|
aa841ac332 | ||
|
|
ceb2168375 | ||
|
|
02eb549208 | ||
|
|
13de8233b0 | ||
|
|
ff4444b18e | ||
|
|
555ace0955 | ||
|
|
a03a78dbd2 | ||
|
|
f63b1b5dc1 | ||
|
|
ac104a519e | ||
|
|
bd95c728f0 | ||
|
|
122ccca50e | ||
|
|
83bfbc1399 | ||
|
|
80f972cd38 | ||
|
|
615f416af3 | ||
|
|
1c37f64a58 | ||
|
|
7c9261a461 | ||
|
|
cb3a83cba7 | ||
|
|
b0dbac9a07 | ||
|
|
f92677fa7e | ||
|
|
789bab97be | ||
|
|
3e60bd2aa6 | ||
|
|
6dc06b3ff5 | ||
|
|
a10390e52a | ||
|
|
433110b4d8 | ||
|
|
b94e6d4864 | ||
|
|
44dc29e52b | ||
|
|
ab03d76ed6 | ||
|
|
bd2b2c2747 | ||
|
|
aa7cf5ea15 | ||
|
|
f8fe64ff77 | ||
|
|
1791876eda | ||
|
|
e6204d3c1d | ||
|
|
f0f9ef6f30 | ||
|
|
51ea735cb5 | ||
|
|
069821a2e7 | ||
|
|
0052108e87 | ||
|
|
64c24959cb | ||
|
|
b57390d3cd | ||
|
|
91c136b6d0 | ||
|
|
c00fa2cc8c | ||
|
|
fe3cbde1d3 | ||
|
|
e2dff6bbf8 | ||
|
|
976cd1ce66 | ||
|
|
a4523651c7 | ||
|
|
2702417192 | ||
|
|
72b872df66 | ||
|
|
bb3e2689d4 | ||
|
|
4ced11e533 | ||
|
|
9a0a5a1735 | ||
|
|
e83034624b | ||
|
|
619fe7b14e | ||
|
|
37a07ae545 | ||
|
|
e1eae3ee49 | ||
|
|
49abd6d8e5 | ||
|
|
fbdbf8addf | ||
|
|
2e4ee9c9b6 | ||
|
|
a863e94c25 | ||
|
|
9b6bc7c1b4 | ||
|
|
86b7ea6bf3 | ||
|
|
18bd6d681e | ||
|
|
2dd194d381 | ||
|
|
a8b603dd92 | ||
|
|
a03d4f69f8 | ||
|
|
99bb042bea | ||
|
|
2bcc27d581 | ||
|
|
53c33cd812 | ||
|
|
1d05cf9ce5 | ||
|
|
07f5b0aa5b | ||
|
|
36e1d664ea | ||
|
|
90e2c39015 | ||
|
|
5a90dc0059 | ||
|
|
c19d22ce88 | ||
|
|
5acc263b73 | ||
|
|
bc6e01c422 | ||
|
|
a2eb4fec53 | ||
|
|
32c9c6f515 | ||
|
|
04f7dd02fd | ||
|
|
35907bcfc8 | ||
|
|
61b1bd7ead | ||
|
|
2bad4f47f1 | ||
|
|
5a94adcf26 | ||
|
|
57e37862f4 | ||
|
|
45bae0046a | ||
|
|
a0c91bf96a | ||
|
|
b607993b7b | ||
|
|
1eb72e4b71 | ||
|
|
e5840ab868 | ||
|
|
54999d1507 | ||
|
|
51514f9dc8 | ||
|
|
40229adb14 | ||
|
|
33f8deffbe | ||
|
|
c80e08a642 | ||
|
|
62b2ffd7ca | ||
|
|
cd1d6282b4 | ||
|
|
67f69bb4b3 | ||
|
|
2ba7756c0e | ||
|
|
c6407b37a5 | ||
|
|
410660627d | ||
|
|
852317a071 | ||
|
|
6590f1b55d | ||
|
|
84277f41a1 | ||
|
|
b73c45f1fb | ||
|
|
ddd226f0ea | ||
|
|
3c68c36fa0 | ||
|
|
d54e54b66d | ||
|
|
2f3b66985e | ||
|
|
43799762c7 | ||
|
|
cb501e32ca | ||
|
|
7a7e25f901 | ||
|
|
e690e7e458 | ||
|
|
253d4565f1 | ||
|
|
1f2a935458 | ||
|
|
0c27b63ab4 | ||
|
|
4c106960c5 | ||
|
|
f076d1e1e6 | ||
|
|
7b58340a60 | ||
|
|
5578edf9e4 | ||
|
|
704d8764af | ||
|
|
6523afa69a | ||
|
|
5416f432b5 | ||
|
|
43f3a4816d | ||
|
|
bc0c42b025 | ||
|
|
9f3adb3fc7 | ||
|
|
df6cba6582 | ||
|
|
8cdad0af98 | ||
|
|
801a1e6c38 | ||
|
|
9da088fe29 | ||
|
|
d96f31eda4 | ||
|
|
a5cce58225 | ||
|
|
39e6fc5918 | ||
|
|
2ea344ce3e | ||
|
|
358fbb3ce3 | ||
|
|
aaf441005a | ||
|
|
6e6dd603cb | ||
|
|
22fe14d31d | ||
|
|
2eba7da8e6 | ||
|
|
ca2b7f9b9f | ||
|
|
4780e7c8da | ||
|
|
a318384142 | ||
|
|
53d3f49f45 | ||
|
|
25581ce52f | ||
|
|
6c0c80b7bb | ||
|
|
f9af53f215 | ||
|
|
2fd5b1b4be | ||
|
|
3acf1f6470 | ||
|
|
37f1533dad | ||
|
|
bb652ed840 | ||
|
|
281706fdae | ||
|
|
198fe71cc4 | ||
|
|
b8e2c7060b | ||
|
|
dbb6c87a10 | ||
|
|
7240cbfdab | ||
|
|
7866c7195c | ||
|
|
e26978e664 | ||
|
|
63ed8881a4 | ||
|
|
1be7b9f983 | ||
|
|
471ed347f4 | ||
|
|
cff9b5b65e | ||
|
|
5d28ff5df1 | ||
|
|
7fd0aa95fb | ||
|
|
27ecfaee9c | ||
|
|
ce2afa1d54 | ||
|
|
984c562500 | ||
|
|
f880a00cba | ||
|
|
6cf2cc67d3 | ||
|
|
9e6fecb4ca | ||
|
|
3194bd3fb4 | ||
|
|
fcb5a5c5f8 | ||
|
|
3988eceb8d | ||
|
|
2b2b13273b | ||
|
|
88278ec7c9 | ||
|
|
7d92198ef0 | ||
|
|
23eb67badc | ||
|
|
d5928d99d7 | ||
|
|
3c16105c3b | ||
|
|
5cb688f309 | ||
|
|
7859a5f9d2 | ||
|
|
8b74ea8757 | ||
|
|
2c2ec6e109 | ||
|
|
6c48bd8f93 | ||
|
|
b422cb86f2 | ||
|
|
1fb97734a0 | ||
|
|
7221012593 | ||
|
|
297db8713f | ||
|
|
477ae6c6df | ||
|
|
74fbca8c80 | ||
|
|
433816148a | ||
|
|
5714eb0ba5 | ||
|
|
315f88b0e4 | ||
|
|
8587fca5db | ||
|
|
e2a26f937f | ||
|
|
90ebc7f319 | ||
|
|
67a67feb68 | ||
|
|
9bdacc64aa | ||
|
|
5a921bca46 | ||
|
|
86f453f677 | ||
|
|
7712584bd4 | ||
|
|
bc58dff715 | ||
|
|
0bb6299e39 | ||
|
|
b24524fc75 | ||
|
|
60eb1ce2ec | ||
|
|
9733d8c857 | ||
|
|
5274210ba8 | ||
|
|
1627757608 | ||
|
|
4542020c86 | ||
|
|
b734ceb2e7 | ||
|
|
951d47c94c | ||
|
|
6f07e8453a | ||
|
|
e6cf05cfb7 | ||
|
|
6b6dd6c432 | ||
|
|
ee01d1186f | ||
|
|
2934641237 | ||
|
|
fecb53f86c | ||
|
|
9811e1cc3b | ||
|
|
234f2b4648 | ||
|
|
9e573a9ff2 | ||
|
|
3803c864f7 | ||
|
|
8afa40eaa7 | ||
|
|
c7a576edce | ||
|
|
c72d54bd6a | ||
|
|
040a79ddd1 | ||
|
|
aa094ca948 | ||
|
|
7917520633 | ||
|
|
8651875e59 | ||
|
|
ef70a6e825 | ||
|
|
0869ef421d | ||
|
|
5f86315ae0 | ||
|
|
ab72ce418e | ||
|
|
36cdaac327 | ||
|
|
6d52415d50 | ||
|
|
0603d24a91 | ||
|
|
71f0d5c602 | ||
|
|
763001ee91 | ||
|
|
0f92ea2578 | ||
|
|
e0a0d736c4 | ||
|
|
65320446f0 | ||
|
|
5f6822042d | ||
|
|
302e87c920 | ||
|
|
77cbdd82ab | ||
|
|
41db06b53f | ||
|
|
eeda9c7738 | ||
|
|
c38bf70464 | ||
|
|
43b295892f | ||
|
|
2573cc5fd0 | ||
|
|
4828d4d2d6 | ||
|
|
c5f278ed37 | ||
|
|
b839d4d1a6 | ||
|
|
3616424b26 | ||
|
|
4d6da6542e | ||
|
|
f2aa347608 | ||
|
|
bd7d5faa9f | ||
|
|
a3d09a7427 | ||
|
|
7dad9663b2 | ||
|
|
cae8ae63e3 | ||
|
|
728d84b1fe | ||
|
|
4a51302c58 | ||
|
|
0ea692e9ab | ||
|
|
1e16b338b4 | ||
|
|
14789b536f | ||
|
|
ac30feeddb | ||
|
|
0d80e300a0 | ||
|
|
69384d7bb4 | ||
|
|
4fd2409b8b | ||
|
|
d97851376d | ||
|
|
1c5e30e83f | ||
|
|
414df8432e | ||
|
|
92f63ccc0b | ||
|
|
d75e8b24f7 | ||
|
|
a1af15b907 | ||
|
|
cf5eb22591 | ||
|
|
2f9f79eea2 | ||
|
|
c57d6110c4 | ||
|
|
2a292d1e2e | ||
|
|
f2c8b157ef | ||
|
|
ec00a06caf | ||
|
|
ae6172d86b | ||
|
|
5605cf2141 | ||
|
|
d46ddcee5d | ||
|
|
3750fb2c1f | ||
|
|
86b2773c28 | ||
|
|
11a9011510 | ||
|
|
e66f1fa306 |
@@ -35,7 +35,7 @@ cmake .. \
|
||||
-DUSE_SYSTEM_CURL=ON \
|
||||
-DUSE_SDL=ON \
|
||||
-DUSE_SYSTEM_SDL=ON \
|
||||
-DUSE_SYSTEM_FFMPEG=OFF \
|
||||
-DUSE_SYSTEM_FFMPEG=ON \
|
||||
-DUSE_SYSTEM_OPENCV=ON \
|
||||
-DUSE_DISCORD_RPC=ON \
|
||||
-DOpenGL_GL_PREFERENCE=LEGACY \
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ cmake .. \
|
||||
-DUSE_SYSTEM_CURL=ON \
|
||||
-DUSE_SDL=ON \
|
||||
-DUSE_SYSTEM_SDL=ON \
|
||||
-DUSE_SYSTEM_FFMPEG=OFF \
|
||||
-DUSE_SYSTEM_FFMPEG=ON \
|
||||
-DUSE_SYSTEM_OPENCV=ON \
|
||||
-DUSE_DISCORD_RPC=ON \
|
||||
-DOpenGL_GL_PREFERENCE=LEGACY \
|
||||
|
||||
+12
-61
@@ -9,35 +9,12 @@ AVVER="${COMM_TAG}-${COMM_COUNT}"
|
||||
export LVER="${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}"
|
||||
echo "AVVER=$AVVER" >> .ci/ci-vars.env
|
||||
|
||||
export HOMEBREW_NO_AUTO_UPDATE=1
|
||||
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
|
||||
export HOMEBREW_NO_ENV_HINTS=1
|
||||
export HOMEBREW_NO_INSTALL_CLEANUP=1
|
||||
brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER"
|
||||
brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER"
|
||||
if [ "$AARCH64" -eq 1 ]; then
|
||||
brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk
|
||||
brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf
|
||||
else
|
||||
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet [email protected] opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk
|
||||
arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative
|
||||
fi
|
||||
# Clang depends on LLVM_COMPILER_VER so it needs to be installed here.
|
||||
sudo port install "clang-$LLVM_COMPILER_VER"
|
||||
|
||||
export CXX=clang++
|
||||
export CC=clang
|
||||
|
||||
export BREW_PATH;
|
||||
if [ "$AARCH64" -eq 1 ]; then
|
||||
BREW_PATH="$(brew --prefix)"
|
||||
export BREW_BIN="/opt/homebrew/bin"
|
||||
export BREW_SBIN="/opt/homebrew/sbin"
|
||||
else
|
||||
BREW_PATH="$("/usr/local/bin/brew" --prefix)"
|
||||
export BREW_BIN="/usr/local/bin"
|
||||
export BREW_SBIN="/usr/local/sbin"
|
||||
fi
|
||||
|
||||
export WORKDIR;
|
||||
WORKDIR="$(pwd)"
|
||||
|
||||
@@ -65,28 +42,25 @@ cd "$WORKDIR"
|
||||
ditto "/tmp/Qt/$QT_VER" "qt-downloader/$QT_VER"
|
||||
|
||||
export Qt6_DIR="$WORKDIR/qt-downloader/$QT_VER/clang_64/lib/cmake/Qt$QT_VER_MAIN"
|
||||
export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3"
|
||||
export SDL3_DIR="/opt/local/lib/cmake/SDL3"
|
||||
export OpenCV_DIR="/opt/local/libexec/opencv4"
|
||||
export PATH="/opt/local/libexec/llvm-$LLVM_COMPILER_VER/bin:/$WORKDIR/qt-downloader/$QT_VER/clang_64/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin:$PATH"
|
||||
export LDFLAGS="-L/opt/local/lib -Wl,-rpath,/opt/local/lib"
|
||||
export VULKAN_SDK="/opt/local"
|
||||
export LLVM_DIR="/opt/local/libexec/llvm-$LLVM_COMPILER_VER"
|
||||
|
||||
export PATH="/opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/bin:$PATH"
|
||||
export LDFLAGS="-L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++ -L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind -lunwind"
|
||||
|
||||
export VULKAN_SDK
|
||||
VULKAN_SDK="$BREW_PATH/opt/molten-vk"
|
||||
ln -s "$BREW_PATH/opt/vulkan-loader/lib/libvulkan.dylib" "$VULKAN_SDK/lib/libvulkan.dylib"
|
||||
|
||||
export LLVM_DIR
|
||||
LLVM_DIR="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER"
|
||||
# Pull all the submodules except some
|
||||
# shellcheck disable=SC2046
|
||||
git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules)
|
||||
git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ && !/opencv/ && !/libsdl-org/ && !/feralinteractive/ && !/curl/ && !/zlib/ { print $3 }' .gitmodules)
|
||||
|
||||
mkdir build && cd build || exit 1
|
||||
# The below should be uncommented once bugs with Qt 6 QListWidgets when using the OS 26 visual style are resolved.
|
||||
# sudo xcode-select -switch /Applications/Xcode_26.3.app/Contents/Developer
|
||||
|
||||
if [ "$AARCH64" -eq 1 ]; then
|
||||
cmake .. \
|
||||
-DBUILD_RPCS3_TESTS="${RUN_UNIT_TESTS}" \
|
||||
-DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \
|
||||
-DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \
|
||||
-DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \
|
||||
-DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}" \
|
||||
@@ -101,29 +75,6 @@ cmake .. \
|
||||
-DUSE_SYSTEM_SDL=ON \
|
||||
-DUSE_SYSTEM_OPENCV=ON \
|
||||
-G Ninja
|
||||
else
|
||||
cmake .. \
|
||||
-DBUILD_RPCS3_TESTS=OFF \
|
||||
-DRUN_RPCS3_TESTS=OFF \
|
||||
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
|
||||
-DCMAKE_SYSTEM_PROCESSOR=x86_64 \
|
||||
-DCMAKE_TOOLCHAIN_FILE=buildfiles/cmake/TCDarwinX86_64.cmake \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \
|
||||
-DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \
|
||||
-DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \
|
||||
-DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}"\
|
||||
-DSTATIC_LINK_LLVM=ON \
|
||||
-DUSE_SDL=ON \
|
||||
-DUSE_DISCORD_RPC=ON \
|
||||
-DUSE_AUDIOUNIT=ON \
|
||||
-DUSE_SYSTEM_FFMPEG=OFF \
|
||||
-DUSE_NATIVE_INSTRUCTIONS=OFF \
|
||||
-DUSE_PRECOMPILED_HEADERS=OFF \
|
||||
-DUSE_SYSTEM_MVK=ON \
|
||||
-DUSE_SYSTEM_SDL=ON \
|
||||
-DUSE_SYSTEM_OPENCV=ON \
|
||||
-G Ninja
|
||||
fi
|
||||
|
||||
ninja; build_status=$?;
|
||||
|
||||
|
||||
+5
-2
@@ -19,6 +19,9 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
|
||||
|
||||
APPIMAGE_EXTRACT_AND_RUN=1 linuxdeploy --appdir AppDir --plugin qt --plugin checkrt
|
||||
|
||||
# Restore App Icon
|
||||
ln -sr ./AppDir/rpcs3.svg ./AppDir/.DirIcon
|
||||
|
||||
# Remove libwayland-client because it has platform-dependent exports and breaks other OSes
|
||||
rm -f ./AppDir/usr/lib/libwayland-client.so*
|
||||
|
||||
@@ -34,7 +37,7 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
|
||||
|
||||
# Download translations
|
||||
mkdir -p "./AppDir/usr/translations"
|
||||
ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
ZIP_URL=$(curl -fsSL --retry 3 --retry-delay 60 "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
| grep "browser_download_url" \
|
||||
| grep "RPCS3-languages.zip" \
|
||||
| cut -d '"' -f 4)
|
||||
@@ -42,7 +45,7 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
|
||||
echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations."
|
||||
else
|
||||
echo "Downloading translations from: $ZIP_URL"
|
||||
curl -L -o translations.zip "$ZIP_URL" || {
|
||||
curl -fsSL --retry 3 --retry-delay 60 -o translations.zip "$ZIP_URL" || {
|
||||
echo "Failed to download translations.zip. Continuing without translations."
|
||||
exit 0
|
||||
}
|
||||
|
||||
+19
-29
@@ -5,15 +5,12 @@ cd build || exit 1
|
||||
|
||||
cd bin
|
||||
mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true
|
||||
wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.1/MoltenVK-macos-privateapi.tar
|
||||
wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.2/MoltenVK-macos-privateapi.tar
|
||||
tar -xvf MoltenVK-macos-privateapi.tar
|
||||
cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib" "rpcs3.app/Contents/Frameworks/libMoltenVK.dylib"
|
||||
cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/MoltenVK_icd.json" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
|
||||
sed -i '' "s/.\//..\/..\/..\/Frameworks\//g" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
|
||||
|
||||
cp "$(realpath $BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++abi.1.0.dylib)" "rpcs3.app/Contents/Frameworks/libc++abi.1.dylib"
|
||||
cp "$(realpath $BREW_PATH/opt/gcc/lib/gcc/current/libgcc_s.1.1.dylib)" "rpcs3.app/Contents/Frameworks/libgcc_s.1.1.dylib"
|
||||
|
||||
rm -rf "rpcs3.app/Contents/Frameworks/QtPdf.framework" \
|
||||
"rpcs3.app/Contents/Frameworks/QtQml.framework" \
|
||||
"rpcs3.app/Contents/Frameworks/QtQmlModels.framework" \
|
||||
@@ -21,44 +18,37 @@ rm -rf "rpcs3.app/Contents/Frameworks/QtPdf.framework" \
|
||||
"rpcs3.app/Contents/Frameworks/QtVirtualKeyboard.framework" \
|
||||
"rpcs3.app/Contents/Plugins/platforminputcontexts" \
|
||||
"rpcs3.app/Contents/Plugins/virtualkeyboard" \
|
||||
"rpcs3.app/Contents/Resources/git"
|
||||
"rpcs3.app/Contents/Resources/git" || true
|
||||
|
||||
../../.ci/optimize-mac.sh rpcs3.app
|
||||
|
||||
# Download translations
|
||||
mkdir -p "rpcs3.app/Contents/translations"
|
||||
ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
| grep "browser_download_url" \
|
||||
| grep "RPCS3-languages.zip" \
|
||||
| cut -d '"' -f 4)
|
||||
if [ -z "$ZIP_URL" ]; then
|
||||
echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations."
|
||||
else
|
||||
echo "Downloading translations from: $ZIP_URL"
|
||||
curl -L -o translations.zip "$ZIP_URL" || {
|
||||
echo "Failed to download translations.zip. Continuing without translations."
|
||||
exit 0
|
||||
}
|
||||
unzip -o translations.zip -d "rpcs3.app/Contents/translations" >/dev/null 2>&1 || \
|
||||
mkdir -p "rpcs3.app/Contents/Resources/translations"
|
||||
ZIP_URL="https://github.com/RPCS3/rpcs3_translations/releases/latest/download/RPCS3-languages.zip"
|
||||
echo "Downloading translations from: $ZIP_URL"
|
||||
if curl -fsSL --retry 3 --retry-delay 60 "$ZIP_URL" -o "translations.zip"; then
|
||||
echo "Successfully downloaded translations."
|
||||
if unzip -o translations.zip -d "rpcs3.app/Contents/Resources/translations" >/dev/null 2>&1; then
|
||||
rm -f translations.zip
|
||||
else
|
||||
echo "Failed to extract translations.zip. Continuing without translations."
|
||||
rm -f translations.zip
|
||||
rm -f translations.zip
|
||||
fi
|
||||
else
|
||||
echo "Warning: Failed to download translations. Skipping..."
|
||||
fi
|
||||
|
||||
# Copy Qt translations manually
|
||||
QT_TRANS="$WORKDIR/qt-downloader/$QT_VER/clang_64/translations"
|
||||
cp $QT_TRANS/qt_*.qm rpcs3.app/Contents/translations
|
||||
cp $QT_TRANS/qtbase_*.qm rpcs3.app/Contents/translations
|
||||
cp $QT_TRANS/qtmultimedia_*.qm rpcs3.app/Contents/translations
|
||||
rm -f rpcs3.app/Contents/translations/qt_help_*.qm
|
||||
cp $QT_TRANS/qt_*.qm rpcs3.app/Contents/Resources/translations
|
||||
cp $QT_TRANS/qtbase_*.qm rpcs3.app/Contents/Resources/translations
|
||||
cp $QT_TRANS/qtmultimedia_*.qm rpcs3.app/Contents/Resources/translations
|
||||
rm -f rpcs3.app/Contents/Resources/translations/qt_help_*.qm || true
|
||||
|
||||
# Need to do this rename hack due to case insensitive filesystem
|
||||
mv rpcs3.app RPCS3_.app
|
||||
mv RPCS3_.app RPCS3.app
|
||||
|
||||
# Hack
|
||||
install_name_tool -delete_rpath /opt/homebrew/lib RPCS3.app/Contents/MacOS/rpcs3 || true
|
||||
install_name_tool -delete_rpath /usr/local/lib RPCS3.app/Contents/MacOS/rpcs3 || true
|
||||
|
||||
# NOTE: "--deep" is deprecated
|
||||
codesign --deep -fs - RPCS3.app
|
||||
|
||||
@@ -66,7 +56,7 @@ echo "[InternetShortcut]" > Quickstart.url
|
||||
echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url
|
||||
echo "IconIndex=0" >> Quickstart.url
|
||||
|
||||
if [ "$AARCH64" -eq 1 ]; then
|
||||
if [ "$(arch)" = "arm64" ]; then
|
||||
ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_aarch64.7z"
|
||||
else
|
||||
ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos.7z"
|
||||
|
||||
@@ -24,10 +24,11 @@ mkdir ./bin/config
|
||||
mkdir ./bin/config/input_configs
|
||||
curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt
|
||||
curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -f ISO-8859-1 -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat
|
||||
curl -fsSL 'https://api.rpcs3.net/config/?api=v1' | iconv -f ISO-8859-1 -t UTF-8 1> ./bin/GuiConfigs/config_database.dat
|
||||
|
||||
# Download translations
|
||||
mkdir -p ./bin/share/qt6/translations
|
||||
ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
ZIP_URL=$(curl -fsSL --retry 3 --retry-delay 60 "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
| grep "browser_download_url" \
|
||||
| grep "RPCS3-languages.zip" \
|
||||
| cut -d '"' -f 4)
|
||||
@@ -35,7 +36,7 @@ if [ -z "$ZIP_URL" ]; then
|
||||
echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations."
|
||||
else
|
||||
echo "Downloading translations from: $ZIP_URL"
|
||||
curl -L -o translations.zip "$ZIP_URL" || {
|
||||
curl -fsSL --retry 3 --retry-delay 60 -o translations.zip "$ZIP_URL" || {
|
||||
echo "Failed to download translations.zip. Continuing without translations."
|
||||
exit 0
|
||||
}
|
||||
|
||||
@@ -14,10 +14,11 @@ mkdir ./bin/config
|
||||
mkdir ./bin/config/input_configs
|
||||
curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt
|
||||
curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat
|
||||
curl -fsSL 'https://api.rpcs3.net/config/?api=v1' | iconv -t UTF-8 1> ./bin/GuiConfigs/config_database.dat
|
||||
|
||||
# Download translations
|
||||
mkdir -p ./bin/qt6/translations
|
||||
ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
ZIP_URL=$(curl -fsSL --retry 3 --retry-delay 60 "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
|
||||
| grep "browser_download_url" \
|
||||
| grep "RPCS3-languages.zip" \
|
||||
| cut -d '"' -f 4)
|
||||
@@ -25,7 +26,7 @@ if [ -z "$ZIP_URL" ]; then
|
||||
echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations."
|
||||
else
|
||||
echo "Downloading translations from: $ZIP_URL"
|
||||
curl -L -o translations.zip "$ZIP_URL" || {
|
||||
curl -fsSL --retry 3 --retry-delay 60 -o translations.zip "$ZIP_URL" || {
|
||||
echo "Failed to download translations.zip. Continuing without translations."
|
||||
exit 0
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ sed -i '' 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
|
||||
export ASSUME_ALWAYS_YES=true
|
||||
pkg info # debug
|
||||
|
||||
# WITH_LLVM
|
||||
# WITH_LLVM and Clang compiler
|
||||
pkg install "llvm$LLVM_COMPILER_VER"
|
||||
|
||||
# Mandatory dependencies (qtX-base is pulled via qtX-multimedia)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
QT_HOST="http://qt.mirror.constant.com/"
|
||||
QT_URL_VER=$(echo "$QT_VER" | sed "s/\.//g")
|
||||
QT_VER_MSVC_UP=$(echo "${QT_VER_MSVC}" | tr '[:lower:]' '[:upper:]')
|
||||
QT_PREFIX="online/qtsdkrepository/windows_x86/desktop/qt${QT_VER_MAIN}_${QT_URL_VER}/qt${QT_VER_MAIN}_${QT_URL_VER}/qt.qt${QT_VER_MAIN}.${QT_URL_VER}."
|
||||
QT_PREFIX="online/qtsdkrepository/windows_x86/desktop/qt${QT_VER_MAIN}_${QT_URL_VER}/qt${QT_VER_MAIN}_${QT_URL_VER}_${QT_VER_MSVC}_64/qt.qt${QT_VER_MAIN}.${QT_URL_VER}."
|
||||
QT_PREFIX_2="win64_${QT_VER_MSVC}_64/${QT_VER}-0-${QT_DATE}"
|
||||
QT_SUFFIX="-Windows-Windows_11_24H2-${QT_VER_MSVC_UP}-Windows-Windows_11_24H2-X86_64.7z"
|
||||
QT_BASE_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtbase${QT_SUFFIX}"
|
||||
@@ -16,7 +16,7 @@ QT_MM_URL="${QT_HOST}${QT_PREFIX}addons.qtmultimedia.${QT_PREFIX_2}qtmultimedia$
|
||||
QT_SVG_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtsvg${QT_SUFFIX}"
|
||||
QT_TRANSLATIONS_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qttranslations${QT_SUFFIX}"
|
||||
LLVMLIBS_URL="https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-${LLVM_VER}/llvmlibs_mt.7z"
|
||||
VULKAN_SDK_URL="https://www.dropbox.com/scl/fi/sjjh0fc4ld281pjbl2xzu/VulkanSDK-${VULKAN_VER}-Installer.exe?rlkey=f6wzc0lvms5vwkt2z3qabfv9d&dl=1"
|
||||
VULKAN_SDK_URL="https://www.dropbox.com/scl/fi/olpvqk4346ig7i8btadk5/vulkansdk-windows-X64-${VULKAN_VER}.exe?rlkey=huvssch6sy904qkg8ti9p65br&st=pztptdin&dl=1"
|
||||
CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.12.3/ccache-4.12.3-windows-x86_64.zip"
|
||||
|
||||
DEP_URLS=" \
|
||||
@@ -88,7 +88,7 @@ for url in $DEP_URLS; do
|
||||
*qt*) checksum=$(curl -fL "${url}.sha1"); algo="sha1"; outDir="$QTDIR/" ;;
|
||||
*llvm*) checksum=$(curl -fL "${url}.sha256"); algo="sha256"; outDir="./build/lib_ext/Release-x64" ;;
|
||||
*ccache*) checksum=$CCACHE_SHA; algo="sha256"; outDir="$CCACHE_BIN_DIR" ;;
|
||||
*Vulkan*)
|
||||
*vulkansdk*)
|
||||
# Vulkan setup needs to be run in batch environment
|
||||
# Need to subshell this or else it doesn't wait
|
||||
download_and_verify "$url" "$VULKAN_SDK_SHA" "sha256" "$fileName"
|
||||
|
||||
@@ -7,14 +7,7 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
# Summary
|
||||
Please do not ask for help or report compatibility regressions here, use [RPCS3 Discord server](https://discord.gg/rpcs3) or [forums](https://forums.rpcs3.net/) instead.
|
||||
- type: textarea
|
||||
id: quick-summary
|
||||
attributes:
|
||||
label: Quick summary
|
||||
description: Please briefly describe what has stopped working correctly.
|
||||
validations:
|
||||
required: true
|
||||
Please do not ask for help here, use the [RPCS3 Discord server](https://discord.gg/rpcs3) or the [RPCS3 Forum](https://forums.rpcs3.net/) instead.
|
||||
- type: textarea
|
||||
id: details
|
||||
attributes:
|
||||
@@ -26,21 +19,29 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
# Identify the regressed build
|
||||
Please provide the _exact_ build (or commit) information that introduced the regression you're reporting.
|
||||
Please provide the _exact_ build information that **introduced** the regression you're reporting (i.e. the first version where it happens).
|
||||
* Please see [How to find the build that caused a regression](https://wiki.rpcs3.net/index.php?title=Help:Using_different_versions_of_RPCS3#How_to_find_the_build_that_caused_a_regression.3F) in our wiki.
|
||||
* You can find [History of RPCS3 builds](https://rpcs3.net/compatibility?b) here.
|
||||
* You can find the [History of RPCS3 builds](https://rpcs3.net/builds) here.
|
||||
|
||||
Make sure you're running with settings as close to default as possible
|
||||
* **Do NOT enable any emulator game patches when reporting issues**
|
||||
* Only change settings that are required for the game to work
|
||||
* **Only change settings that are required for the game to work**
|
||||
- type: input
|
||||
id: regressed-build
|
||||
id: last-good-build
|
||||
attributes:
|
||||
label: Build with regression
|
||||
description: Provide _exact_ build (or commit) information that introduced the regression you're reporting.
|
||||
label: Last working build
|
||||
description: Provide the _exact_ last working build. This needs to be the build right before the first broken build.
|
||||
placeholder: v0.0.23-13948-31df99f7
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: first-bad-build
|
||||
attributes:
|
||||
label: First broken build
|
||||
description: Provide the _exact_ first broken build. This needs to be the build right after the last working build.
|
||||
placeholder: v0.0.23-13949-d1a46b49
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
@@ -56,12 +57,25 @@ body:
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Attach two log files
|
||||
label: Attach 3 log files
|
||||
description: |
|
||||
Attach one file for the build with regression and another for a build that works.
|
||||
* A RPCS3 log file for the last working build
|
||||
* A RPCS3 log file for the first broken build
|
||||
* A RPCS3 log file for the latest master build (not required if latest master build is the first broken build)
|
||||
|
||||
Drag & drop the files into this input field, or upload them to another service (f.ex. Dropbox, Mega) and provide a link.
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: require-log-files
|
||||
attributes:
|
||||
label: I have attached all 3 required log files
|
||||
options:
|
||||
- "Yes"
|
||||
- "No"
|
||||
default: 1
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
@@ -73,8 +87,8 @@ body:
|
||||
- type: textarea
|
||||
id: captures
|
||||
attributes:
|
||||
label: Attach capture files for visual issues
|
||||
description: Compress your capture with 7z, Rar etc. and attach it here, or upload it to the cloud (Dropbox, Mega etc) and add a link to it.
|
||||
label: Attach the RSX (.rrc) or RenderDoc (.rdc) capture files for visual issues
|
||||
description: Compress your capture with .7z, .gz, etc. and attach it here, or upload it to another service (f.ex. Dropbox, Mega) and provide a link.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
@@ -84,10 +98,3 @@ body:
|
||||
description: Provide information about your system, such as operating system, CPU and GPU model, GPU driver version and other information that describes your system configuration.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: other-details
|
||||
attributes:
|
||||
label: Other details
|
||||
description: Include anything else you deem to be important.
|
||||
validations:
|
||||
required: false
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
ports:
|
||||
- name: abseil
|
||||
- name: ccache
|
||||
- name: gtest
|
||||
- name: opencv4
|
||||
- name: sdl3
|
||||
- name: vulkan-headers
|
||||
- name: vulkan-loader
|
||||
- name: MoltenVK
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
Windows_Build:
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
name: LLVM Windows (MSVC)
|
||||
runs-on: windows-2025
|
||||
runs-on: windows-2025-vs2026
|
||||
env:
|
||||
COMPILER: msvc
|
||||
CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf'
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
name: Label PRs
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
- edited
|
||||
|
||||
jobs:
|
||||
Label_PRs:
|
||||
name: Label from title and linked issues
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'RPCS3/rpcs3'
|
||||
permissions:
|
||||
issues: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Add labels from title and linked issues
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
retries: 3
|
||||
script: |
|
||||
const AREAS = [
|
||||
'Build and CI', 'CLI', 'Filesystem', 'GUI', 'Input', 'ISO', 'Localization', 'Overlay', 'Render: Vulkan', 'RSX', 'Savestates',
|
||||
];
|
||||
|
||||
const {repository: {pullRequest: pull}} = await github.graphql(`
|
||||
query($owner: String!, $repo: String!, $number: Int!) {
|
||||
repository(owner: $owner, name: $repo) {
|
||||
pullRequest(number: $number) {
|
||||
labels(first: 100) { nodes { name } }
|
||||
closingIssuesReferences(first: 50) { nodes { labels(first: 100) { nodes { name } } } }
|
||||
timelineItems(itemTypes: [UNLABELED_EVENT], last: 100) { nodes { ... on UnlabeledEvent { label { name } } } }
|
||||
}
|
||||
}
|
||||
}`, {...context.repo, number: context.issue.number});
|
||||
|
||||
if (pull.labels.nodes.some(x => AREAS.includes(x.name)))
|
||||
return;
|
||||
|
||||
// Skip labels a maintainer removed
|
||||
const removed = pull.timelineItems.nodes.map(x => x.label.name);
|
||||
const fromTitle = /^rsx\b/i.test(context.payload.pull_request.title) ? ['RSX'] : [];
|
||||
const fromIssues = pull.closingIssuesReferences.nodes.flatMap(i => i.labels.nodes.map(x => x.name));
|
||||
const labels = [...new Set([...fromTitle, ...fromIssues])]
|
||||
.filter(name => AREAS.includes(name) && !removed.includes(name));
|
||||
|
||||
if (labels.length > 0) {
|
||||
console.log(`Adding labels: ${labels.join(', ')}`);
|
||||
await github.rest.issues.addLabels({...context.repo, issue_number: context.issue.number, labels});
|
||||
}
|
||||
+227
-58
@@ -22,31 +22,95 @@ env:
|
||||
BUILD_ARTIFACTSTAGINGDIRECTORY: ${{ github.workspace }}/artifacts/
|
||||
|
||||
jobs:
|
||||
Clean_Code_Caches:
|
||||
name: Clean caches
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: write
|
||||
contents: read
|
||||
pull-requests: read
|
||||
outputs:
|
||||
skip_ccache: ${{ steps.pr_labels.outputs.skip_ccache }}
|
||||
steps:
|
||||
- name: "Look for the 'CI: Disable Build Caches' label on the PR"
|
||||
id: pr_labels
|
||||
if: github.event_name == 'pull_request'
|
||||
continue-on-error: true
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
# Query the live labels so adding the label and re-running all jobs works without a new push
|
||||
labels=$(gh api "repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}" --jq '.labels[].name' 2>/dev/null) \
|
||||
|| labels=$(jq -r '.pull_request.labels[]?.name' "$GITHUB_EVENT_PATH")
|
||||
echo "Labels: ${labels:-<none>}"
|
||||
skip=false
|
||||
if grep -qix 'ci: disable build caches' <<< "$labels"; then
|
||||
skip=true
|
||||
echo "Builds will not restore ccache because of the 'CI: Disable Build Caches' label." >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
echo "skip_ccache=$skip" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: "Look for the 'Shaders' or 'CI: Disable Build Caches' label on the merged PR"
|
||||
id: labels
|
||||
if: github.event_name == 'push' && github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master'
|
||||
continue-on-error: true
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
found=false
|
||||
for sha in $(jq -r '[.after, (.commits[]?.id)] | map(select(. != null)) | unique[]' "$GITHUB_EVENT_PATH"); do
|
||||
labels=$(gh api "repos/${{ github.repository }}/commits/$sha/pulls" --jq '.[].labels[].name' 2>/dev/null || true)
|
||||
echo "$sha: ${labels:-<no associated PR>}"
|
||||
if grep -qixE 'shaders|ci: disable build caches' <<< "$labels"; then
|
||||
found=true
|
||||
fi
|
||||
done
|
||||
echo "clean=$found" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Remove all code caches
|
||||
if: steps.labels.outputs.clean == 'true'
|
||||
continue-on-error: true
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
gh api --paginate "repos/${{ github.repository }}/actions/caches?per_page=100" \
|
||||
--jq '.actions_caches[] | select(.key | contains("-ccache-")) | "\(.id)\t\(.key)"' > code_caches.tsv
|
||||
if [ ! -s code_caches.tsv ]; then
|
||||
echo "No code caches to remove."
|
||||
exit 0
|
||||
fi
|
||||
while IFS=$'\t' read -r id key; do
|
||||
echo "Removing $key (id $id)"
|
||||
gh api -X DELETE "repos/${{ github.repository }}/actions/caches/$id" --silent
|
||||
done < code_caches.tsv
|
||||
echo "Removed $(wc -l < code_caches.tsv) code cache(s) after merging a 'Shaders' or 'CI: Disable Build Caches' PR." >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
Linux_Build:
|
||||
# Only run push event on master branch of main repo, but run all PRs
|
||||
needs: Clean_Code_Caches
|
||||
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-24.04
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy:1.9"
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy:2.1"
|
||||
build_sh: "/rpcs3/.ci/build-linux.sh"
|
||||
compiler: clang
|
||||
UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f
|
||||
UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux"
|
||||
- os: ubuntu-24.04
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy:1.9"
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy:2.1"
|
||||
build_sh: "/rpcs3/.ci/build-linux.sh"
|
||||
compiler: gcc
|
||||
- os: ubuntu-24.04-arm
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.9"
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:2.1"
|
||||
build_sh: "/rpcs3/.ci/build-linux-aarch64.sh"
|
||||
compiler: clang
|
||||
UPLOAD_COMMIT_HASH: a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1
|
||||
UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux-arm64"
|
||||
- os: ubuntu-24.04-arm
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.9"
|
||||
docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:2.1"
|
||||
build_sh: "/rpcs3/.ci/build-linux-aarch64.sh"
|
||||
compiler: gcc
|
||||
name: RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }}
|
||||
@@ -68,6 +132,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Restore build Ccache
|
||||
if: needs.Clean_Code_Caches.outputs.skip_ccache != 'true'
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-build-ccache
|
||||
with:
|
||||
@@ -117,38 +182,44 @@ jobs:
|
||||
|
||||
Mac_Build:
|
||||
# Only run push event on master branch of main repo, but run all PRs
|
||||
needs: Clean_Code_Caches
|
||||
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- name: Intel
|
||||
AARCH64: 0
|
||||
runs-on: macos-15-intel
|
||||
UPLOAD_COMMIT_HASH: 51ae32f468089a8169aaf1567de355ff4a3e0842
|
||||
UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac
|
||||
- name: Apple Silicon
|
||||
AARCH64: 1
|
||||
runs-on: macos-15
|
||||
UPLOAD_COMMIT_HASH: 8e21bdbc40711a3fccd18fbf17b742348b0f4281
|
||||
UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac-arm64
|
||||
name: RPCS3 Mac ${{ matrix.name }}
|
||||
runs-on: macos-14
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
env:
|
||||
CCACHE_DIR: /tmp/ccache_dir
|
||||
QT_VER: '6.10.2'
|
||||
QT_VER: '6.12.0'
|
||||
QT_VER_MAIN: '6'
|
||||
LLVM_COMPILER_VER: '21'
|
||||
LLVM_COMPILER_VER: '22'
|
||||
RELEASE_MESSAGE: ../GitHubReleaseMessage.txt
|
||||
UPLOAD_COMMIT_HASH: ${{ matrix.UPLOAD_COMMIT_HASH }}
|
||||
UPLOAD_REPO_FULL_NAME: ${{ matrix.UPLOAD_REPO_FULL_NAME }}
|
||||
AARCH64: ${{ matrix.AARCH64 }}
|
||||
RUN_UNIT_TESTS: github.event_name == 'pull_request' && 'ON' || 'OFF'
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup MacPorts
|
||||
uses: melusina-org/setup-macports@v1
|
||||
with:
|
||||
cache: 'disable'
|
||||
|
||||
- name: Restore Build Ccache
|
||||
if: needs.Clean_Code_Caches.outputs.skip_ccache != 'true'
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-build-ccache
|
||||
with:
|
||||
@@ -207,26 +278,30 @@ jobs:
|
||||
|
||||
Windows_Build:
|
||||
# Only run push event on master branch of main repo, but run all PRs
|
||||
needs: Clean_Code_Caches
|
||||
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
|
||||
name: RPCS3 Windows
|
||||
runs-on: windows-2025
|
||||
runs-on: windows-2025-vs2026
|
||||
env:
|
||||
COMPILER: msvc
|
||||
QT_VER_MAIN: '6'
|
||||
QT_VER: '6.10.2'
|
||||
QT_VER: '6.12.0'
|
||||
QT_VER_MSVC: 'msvc2022'
|
||||
QT_DATE: '202601261212'
|
||||
LLVM_VER: '19.1.7'
|
||||
VULKAN_VER: '1.3.268.0'
|
||||
VULKAN_SDK_SHA: '8459ef49bd06b697115ddd3d97c9aec729e849cd775f5be70897718a9b3b9db5'
|
||||
QT_DATE: '202609280346'
|
||||
LLVM_VER: '22.1.8'
|
||||
VULKAN_VER: '1.4.341.1'
|
||||
VULKAN_SDK_SHA: 'bcf2d75aa9556889ab974858666e20b3655b6055a0db704ccb47279ff33b5bfe'
|
||||
CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf'
|
||||
CCACHE_BIN_DIR: 'C:\ccache_bin'
|
||||
CCACHE_DIR: 'C:\ccache'
|
||||
CCACHE_INODECACHE: 'true'
|
||||
CCACHE_SLOPPINESS: 'time_macros'
|
||||
CCACHE_MAXSIZE: '7G'
|
||||
CCACHE_LAUNCH_ARGS: '-DCMAKE_C_COMPILER_LAUNCHER=C:\ccache_bin\ccache.exe -DCMAKE_CXX_COMPILER_LAUNCHER=C:\ccache_bin\ccache.exe'
|
||||
DEPS_CACHE_DIR: ./dependency_cache
|
||||
UPLOAD_COMMIT_HASH: 7d09e3be30805911226241afbb14f8cdc2eb054e
|
||||
UPLOAD_REPO_FULL_NAME: "RPCS3/rpcs3-binaries-win"
|
||||
SKIP_RPCS3_TEST: 'true'
|
||||
steps:
|
||||
|
||||
- name: Checkout repository
|
||||
@@ -235,7 +310,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup NuGet
|
||||
uses: nuget/setup-nuget@v2
|
||||
uses: nuget/setup-nuget@v4
|
||||
|
||||
- name: Restore NuGet packages
|
||||
run: nuget restore rpcs3.sln
|
||||
@@ -250,6 +325,132 @@ jobs:
|
||||
run: .ci/get_keys-windows.sh
|
||||
|
||||
- name: Restore Build Ccache
|
||||
if: needs.Clean_Code_Caches.outputs.skip_ccache != 'true'
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-build-ccache
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: "${{ runner.os }}-ccache-${{ env.COMPILER }}-${{github.run_id}}"
|
||||
restore-keys: ${{ runner.os }}-ccache-${{ env.COMPILER }}-
|
||||
|
||||
- name: Restore Dependencies Cache
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-dependencies-cache
|
||||
with:
|
||||
path: ${{ env.DEPS_CACHE_DIR }}
|
||||
key: "${{ runner.os }}-${{ env.COMPILER }}-${{ env.QT_VER }}-${{ env.VULKAN_SDK_SHA }}-${{ env.CCACHE_SHA }}-${{ hashFiles('llvm.lock') }}"
|
||||
restore-keys: ${{ runner.os }}-${{ env.COMPILER }}-
|
||||
|
||||
- name: Download and unpack dependencies
|
||||
run: |
|
||||
.ci/setup-windows.sh
|
||||
.ci/setup-windows-ci-vars.sh win64 msvc
|
||||
|
||||
- name: Export Variables
|
||||
run: |
|
||||
while IFS='=' read -r key val; do
|
||||
# Skip lines that are empty or start with '#'
|
||||
[[ -z "$key" || "$key" =~ ^# ]] && continue
|
||||
echo "$key=$val" >> "${{ github.env }}"
|
||||
done < .ci/ci-vars.env
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@main
|
||||
|
||||
- name: Compile RPCS3
|
||||
shell: pwsh
|
||||
run: msbuild rpcs3.sln /p:Configuration=Release /v:minimal /p:Platform=x64 /p:PreferredToolArchitecture=x64 /p:CLToolPath=${{ env.CCACHE_BIN_DIR }} /p:UseMultiToolTask=true /p:CustomAfterMicrosoftCommonTargets="${{ github.workspace }}\buildfiles\msvc\ci_only.targets"
|
||||
|
||||
- name: Pack up build artifacts
|
||||
run: |
|
||||
mkdir -p "${{ env.BUILD_ARTIFACTSTAGINGDIRECTORY }}"
|
||||
.ci/deploy-windows.sh
|
||||
|
||||
- name: Upload artifacts (7z)
|
||||
uses: actions/upload-artifact@main
|
||||
with:
|
||||
name: RPCS3 for Windows (MSVC)
|
||||
path: ${{ env.BUILD_ARTIFACTSTAGINGDIRECTORY }}
|
||||
compression-level: 0
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Deploy master build to GitHub Releases
|
||||
if: |
|
||||
github.event_name != 'pull_request' &&
|
||||
github.repository == 'RPCS3/rpcs3' &&
|
||||
github.ref == 'refs/heads/master'
|
||||
env:
|
||||
RPCS3_TOKEN: ${{ secrets.RPCS3_TOKEN }}
|
||||
run: .ci/github-upload.sh
|
||||
|
||||
- name: Show ccache stats
|
||||
if: github.ref == 'refs/heads/master'
|
||||
run: ccache --show-stats --verbose
|
||||
|
||||
- name: Save Build Ccache
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: actions/cache/save@main
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ steps.restore-build-ccache.outputs.cache-primary-key }}
|
||||
|
||||
- name: Save Dependencies Cache
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: actions/cache/save@main
|
||||
with:
|
||||
path: ${{ env.DEPS_CACHE_DIR }}
|
||||
key: ${{ steps.restore-dependencies-cache.outputs.cache-primary-key }}
|
||||
|
||||
Windows_Build_Test:
|
||||
# Only run push event on master branch of main repo, but run all PRs
|
||||
needs: Clean_Code_Caches
|
||||
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
|
||||
name: RPCS3 Windows Unit Test
|
||||
runs-on: windows-2025-vs2026
|
||||
env:
|
||||
COMPILER: msvc
|
||||
QT_VER_MAIN: '6'
|
||||
QT_VER: '6.12.0'
|
||||
QT_VER_MSVC: 'msvc2022'
|
||||
QT_DATE: '202609280346'
|
||||
LLVM_VER: '22.1.8'
|
||||
VULKAN_VER: '1.4.341.1'
|
||||
VULKAN_SDK_SHA: 'bcf2d75aa9556889ab974858666e20b3655b6055a0db704ccb47279ff33b5bfe'
|
||||
CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf'
|
||||
CCACHE_BIN_DIR: 'C:\ccache_bin'
|
||||
CCACHE_DIR: 'C:\ccache'
|
||||
CCACHE_INODECACHE: 'true'
|
||||
CCACHE_SLOPPINESS: 'time_macros'
|
||||
CCACHE_MAXSIZE: '7G'
|
||||
CCACHE_LAUNCH_ARGS: '-DCMAKE_C_COMPILER_LAUNCHER=C:\ccache_bin\ccache.exe -DCMAKE_CXX_COMPILER_LAUNCHER=C:\ccache_bin\ccache.exe'
|
||||
DEPS_CACHE_DIR: ./dependency_cache
|
||||
UPLOAD_COMMIT_HASH: 7d09e3be30805911226241afbb14f8cdc2eb054e
|
||||
UPLOAD_REPO_FULL_NAME: "RPCS3/rpcs3-binaries-win"
|
||||
SKIP_RPCS3_EXE: 'true'
|
||||
steps:
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup NuGet
|
||||
uses: nuget/setup-nuget@v4
|
||||
|
||||
- name: Restore NuGet packages
|
||||
run: nuget restore rpcs3.sln
|
||||
|
||||
- name: Setup env
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "QTDIR=C:\Qt\${{ env.QT_VER }}\${{ env.QT_VER_MSVC }}_64" >> ${{ github.env }}
|
||||
echo "VULKAN_SDK=C:\VulkanSDK\${{ env.VULKAN_VER }}" >> ${{ github.env }}
|
||||
|
||||
- name: Get Cache Keys
|
||||
run: .ci/get_keys-windows.sh
|
||||
|
||||
- name: Restore Build Ccache
|
||||
if: needs.Clean_Code_Caches.outputs.skip_ccache != 'true'
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-build-ccache
|
||||
with:
|
||||
@@ -290,44 +491,9 @@ jobs:
|
||||
shell: pwsh
|
||||
run: build\lib\Release-x64\rpcs3_test.exe
|
||||
|
||||
- name: Pack up build artifacts
|
||||
run: |
|
||||
mkdir -p "${{ env.BUILD_ARTIFACTSTAGINGDIRECTORY }}"
|
||||
.ci/deploy-windows.sh
|
||||
|
||||
- name: Upload artifacts (7z)
|
||||
uses: actions/upload-artifact@main
|
||||
with:
|
||||
name: RPCS3 for Windows (MSVC)
|
||||
path: ${{ env.BUILD_ARTIFACTSTAGINGDIRECTORY }}
|
||||
compression-level: 0
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Deploy master build to GitHub Releases
|
||||
if: |
|
||||
github.event_name != 'pull_request' &&
|
||||
github.repository == 'RPCS3/rpcs3' &&
|
||||
github.ref == 'refs/heads/master'
|
||||
env:
|
||||
RPCS3_TOKEN: ${{ secrets.RPCS3_TOKEN }}
|
||||
run: .ci/github-upload.sh
|
||||
|
||||
- name: Save Build Ccache
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: actions/cache/save@main
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ steps.restore-build-ccache.outputs.cache-primary-key }}
|
||||
|
||||
- name: Save Dependencies Cache
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: actions/cache/save@main
|
||||
with:
|
||||
path: ${{ env.DEPS_CACHE_DIR }}
|
||||
key: ${{ steps.restore-dependencies-cache.outputs.cache-primary-key }}
|
||||
|
||||
Windows_Build_Clang:
|
||||
# Only run push event on master branch of main repo, but run all PRs
|
||||
needs: Clean_Code_Caches
|
||||
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -387,6 +553,7 @@ jobs:
|
||||
p7zip
|
||||
|
||||
- name: Restore build Ccache
|
||||
if: needs.Clean_Code_Caches.outputs.skip_ccache != 'true'
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-build-ccache
|
||||
with:
|
||||
@@ -437,6 +604,7 @@ jobs:
|
||||
|
||||
FreeBSD_Build:
|
||||
# Only run push event on master branch of main repo, but run all PRs
|
||||
needs: Clean_Code_Caches
|
||||
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
|
||||
name: RPCS3 FreeBSD
|
||||
runs-on: ubuntu-latest
|
||||
@@ -444,10 +612,10 @@ jobs:
|
||||
env:
|
||||
CCACHE_DIR: ${{ github.workspace }}/ccache
|
||||
QT_VER_MAIN: '6'
|
||||
LLVM_COMPILER_VER: '-devel'
|
||||
CC: 'clang-devel'
|
||||
CXX: 'clang++-devel'
|
||||
LLVM_CONFIG: 'llvm-config-devel'
|
||||
LLVM_COMPILER_VER: '22'
|
||||
LLVM_CONFIG: 'llvm-config22'
|
||||
CC: 'clang22'
|
||||
CXX: 'clang++22'
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -456,6 +624,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Restore Build Ccache
|
||||
if: needs.Clean_Code_Caches.outputs.skip_ccache != 'true'
|
||||
uses: actions/cache/restore@main
|
||||
id: restore-build-ccache
|
||||
with:
|
||||
@@ -470,7 +639,7 @@ jobs:
|
||||
envs: 'QT_VER_MAIN LLVM_COMPILER_VER CCACHE_DIR CC CXX LLVM_CONFIG'
|
||||
usesh: true
|
||||
copyback: false
|
||||
release: "14.3"
|
||||
release: "14.5"
|
||||
run: .ci/install-freebsd.sh && .ci/build-freebsd.sh
|
||||
|
||||
- name: Save Build Ccache
|
||||
|
||||
@@ -69,6 +69,9 @@ CMakeSettings.json
|
||||
*PVS-Studio*
|
||||
PVS/*
|
||||
|
||||
# Zed Editor files
|
||||
.zed/*
|
||||
|
||||
# Ignore other system generated files
|
||||
x64/*
|
||||
rpcs3/x64/*
|
||||
@@ -123,3 +126,6 @@ CMakeUserPresets.json
|
||||
|
||||
.cache/
|
||||
.lldbinit
|
||||
|
||||
# claude
|
||||
CLAUDE.md
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/7zip/7zip updated: 839151eaaa...9128b80e3a
Vendored
+1
-1
Submodule 3rdparty/FAudio updated: e67d761ead...6839b88e30
+1
-1
Submodule 3rdparty/GPUOpen/VulkanMemoryAllocator updated: 1d8f600fd4...3aa921224c
Vendored
+1
-1
Submodule 3rdparty/OpenAL/openal-soft updated: c41d64c6a3...b2c48f7718
Vendored
+45
-4
@@ -49,16 +49,57 @@
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeReleaseCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="./Release" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_SYSTEM_VERSION=10.0 -DLIBTYPE=STATIC -DFORCE_STATIC_VCRT=true -DALSOFT_UTILS=false -DALSOFT_EXAMPLES=false -DALSOFT_INSTALL=false -DALSOFT_INSTALL_CONFIG=false -DALSOFT_INSTALL_HRTF_DATA=false -DALSOFT_INSTALL_AMBDEC_PRESETS=false -DALSOFT_INSTALL_EXAMPLES=false -DALSOFT_INSTALL_UTILS=false "$(SolutionDir)3rdparty\OpenAL\openal-soft"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_BUILD_TYPE="Release" ^
|
||||
-DCMAKE_INSTALL_PREFIX="./Release" ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DLIBTYPE=STATIC ^
|
||||
-DFORCE_STATIC_VCRT=true ^
|
||||
-DALSOFT_UTILS=false ^
|
||||
-DALSOFT_EXAMPLES=false ^
|
||||
-DALSOFT_INSTALL=false ^
|
||||
-DALSOFT_INSTALL_CONFIG=false ^
|
||||
-DALSOFT_INSTALL_HRTF_DATA=false ^
|
||||
-DALSOFT_INSTALL_AMBDEC_PRESETS=false ^
|
||||
-DALSOFT_INSTALL_EXAMPLES=false ^
|
||||
-DALSOFT_INSTALL_UTILS=false ^
|
||||
"$(SolutionDir)3rdparty\OpenAL\openal-soft"
|
||||
</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="./Debug" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug -DCMAKE_SYSTEM_VERSION=10.0 -DLIBTYPE=STATIC -DALSOFT_UTILS=false -DALSOFT_EXAMPLES=false -DALSOFT_INSTALL=false -DALSOFT_INSTALL_CONFIG=false -DALSOFT_INSTALL_HRTF_DATA=false -DALSOFT_INSTALL_AMBDEC_PRESETS=false -DALSOFT_INSTALL_EXAMPLES=false -DALSOFT_INSTALL_UTILS=false "$(SolutionDir)3rdparty\OpenAL\openal-soft"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_BUILD_TYPE="Debug" ^
|
||||
-DCMAKE_INSTALL_PREFIX="./Debug" ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DALSOFT_UTILS=false ^
|
||||
-DALSOFT_EXAMPLES=false ^
|
||||
-DALSOFT_INSTALL=false ^
|
||||
-DALSOFT_INSTALL_CONFIG=false ^
|
||||
-DALSOFT_INSTALL_HRTF_DATA=false ^
|
||||
-DALSOFT_INSTALL_AMBDEC_PRESETS=false ^
|
||||
-DALSOFT_INSTALL_EXAMPLES=false ^
|
||||
-DALSOFT_INSTALL_UTILS=false ^
|
||||
"$(SolutionDir)3rdparty\OpenAL\openal-soft"
|
||||
</CmakeDebugCLI>
|
||||
<CmakeCopyCLI>
|
||||
echo Copying..
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\OpenAL32.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)"
|
||||
</CmakeCopyCLI>
|
||||
<CmakeCopyDebugCLI>
|
||||
echo Copying..
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\OpenAL32.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\OpenAL32.dll" "$(SolutionDir)bin"
|
||||
</CmakeCopyDebugCLI>
|
||||
<CmakeCleanCLI>
|
||||
echo Cleaning..
|
||||
del "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\OpenAL32.lib"
|
||||
@@ -71,13 +112,13 @@
|
||||
<NMakeBuildCommandLine>
|
||||
$(CmakeDebugCLI)
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
$(CmakeCopyDebugCLI)
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>
|
||||
$(CmakeCleanCLI)
|
||||
$(CmakeDebugCLI)
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
$(CmakeCopyDebugCLI)
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>
|
||||
$(CmakeCleanCLI)
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/SoundTouch/soundtouch updated: 3982730833...a0fba77b6f
Vendored
+15
-18
@@ -7,27 +7,24 @@ if(USE_SYSTEM_CURL)
|
||||
target_link_libraries(3rdparty_libcurl INTERFACE CURL::libcurl)
|
||||
else()
|
||||
message(STATUS "RPCS3: building libcurl + wolfssl submodules")
|
||||
set(BUILD_CURL_EXE OFF CACHE BOOL "Set to ON to build curl executable.")
|
||||
set(BUILD_STATIC_CURL OFF CACHE BOOL "Set to ON to build curl executable with static libcurl.")
|
||||
set(BUILD_STATIC_LIBS ON CACHE BOOL "Set to ON to build static libcurl.")
|
||||
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Set to ON to build shared libcurl.")
|
||||
set(BUILD_CURL_EXE OFF CACHE INTERNAL "")
|
||||
set(BUILD_STATIC_CURL OFF CACHE INTERNAL "")
|
||||
set(BUILD_STATIC_LIBS ON CACHE INTERNAL "")
|
||||
set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "")
|
||||
find_package(WolfSSL REQUIRED)
|
||||
set(CURL_USE_WOLFSSL ON CACHE BOOL "enable wolfSSL for SSL/TLS")
|
||||
set(CURL_USE_OPENSSL OFF CACHE BOOL "Use OpenSSL code. Experimental")
|
||||
set(HTTP_ONLY ON CACHE BOOL "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)")
|
||||
set(USE_LIBIDN2 OFF CACHE BOOL "Use libidn2 for IDN support") # Disabled because MacOS CI doesn't work otherwise
|
||||
set(CURL_CA_PATH "none" CACHE STRING "Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
|
||||
option(CURL_DISABLE_INSTALL "Disable installation targets" ON)
|
||||
if(USE_MSVC_STATIC_CRT)
|
||||
set(CURL_STATIC_CRT ON CACHE BOOL "Use static crt to build curl")
|
||||
endif()
|
||||
set(CURL_USE_WOLFSSL ON CACHE INTERNAL "")
|
||||
set(CURL_USE_OPENSSL OFF CACHE INTERNAL "")
|
||||
set(HTTP_ONLY ON CACHE INTERNAL "")
|
||||
set(USE_LIBIDN2 OFF CACHE INTERNAL "") # Disabled because MacOS CI doesn't work otherwise
|
||||
set(CURL_CA_PATH "none" CACHE INTERNAL "")
|
||||
set(CURL_DISABLE_INSTALL ON CACHE INTERNAL "")
|
||||
if(WIN32)
|
||||
set(ENABLE_UNICODE ON CACHE BOOL "enable Unicode")
|
||||
set(ENABLE_UNICODE ON CACHE INTERNAL "")
|
||||
endif()
|
||||
set(CURL_USE_LIBSSH2 OFF CACHE BOOL "Use libSSH2")
|
||||
set(CURL_USE_LIBPSL OFF CACHE BOOL "Use libPSL")
|
||||
option(BUILD_TESTING "Build tests" OFF)
|
||||
option(BUILD_EXAMPLES "Build libcurl examples" OFF)
|
||||
set(CURL_USE_LIBSSH2 OFF CACHE INTERNAL "")
|
||||
set(CURL_USE_LIBPSL OFF CACHE INTERNAL "")
|
||||
set(BUILD_TESTING OFF CACHE INTERNAL "")
|
||||
set(BUILD_EXAMPLES OFF CACHE INTERNAL "")
|
||||
|
||||
add_subdirectory(curl EXCLUDE_FROM_ALL)
|
||||
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/curl/curl updated: 400fffa90f...0134682909
Vendored
+117
-402
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
@@ -11,16 +11,20 @@
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<Keyword>MakeFileProj</Keyword>
|
||||
<ProjectGuid>{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}</ProjectGuid>
|
||||
<RootNamespace>libcurl</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(SolutionDir)\buildfiles\msvc\common_default.props" />
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<Import Project="$(SolutionDir)\buildfiles\msvc\common_default_macros.props" />
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Makefile</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Makefile</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<PropertyGroup>
|
||||
@@ -31,408 +35,119 @@
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeReleaseCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_BUILD_TYPE="Release" ^
|
||||
-DCMAKE_INSTALL_PREFIX="./Release" ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DBUILD_SHARED_LIBS=OFF ^
|
||||
-DBUILD_CURL_EXE=OFF ^
|
||||
-DBUILD_TESTING=OFF ^
|
||||
-DCURL_USE_WOLFSSL=ON ^
|
||||
-DCURL_USE_IPV6=ON ^
|
||||
-DCURL_USE_SCHANNEL=OFF ^
|
||||
-DCURL_USE_OPENSSL=OFF ^
|
||||
-DCURL_USE_LIBPSL=OFF ^
|
||||
-DCURL_ZLIB=OFF ^
|
||||
-DCURL_ZSTD=OFF ^
|
||||
-DCURL_USE_LIBSSH2=OFF ^
|
||||
-DCMAKE_C_FLAGS="/DWOLFSSL_ALT_CERT_CHAINS /DHAVE_SNI /DNO_MD4 /DWOLFSSL_USER_SETTINGS /DUSE_IPV6 /I\"$(SolutionDir)3rdparty\curl\extra\" /I\"$(SolutionDir)3rdparty\wolfssl\wolfssl\" /I\"$(SolutionDir)3rdparty\wolfssl\wolfssl\wolfssl\" /I\"$(SolutionDir)3rdparty\wolfssl\extra\win32\"" ^
|
||||
-DCMAKE_C_FLAGS_RELEASE="/O2 /Ob1 /GF /Gy" ^
|
||||
-DWOLFSSL_INCLUDE_DIR="$(SolutionDir)3rdparty\wolfssl\wolfssl" ^
|
||||
-DWOLFSSL_LIBRARY="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\wolfssl.lib" ^
|
||||
"$(SolutionDir)3rdparty\curl\curl"
|
||||
</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_BUILD_TYPE="Debug" ^
|
||||
-DCMAKE_INSTALL_PREFIX="./Debug" ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DBUILD_SHARED_LIBS=OFF ^
|
||||
-DBUILD_CURL_EXE=OFF ^
|
||||
-DBUILD_TESTING=OFF ^
|
||||
-DCURL_USE_WOLFSSL=ON ^
|
||||
-DCURL_USE_IPV6=ON ^
|
||||
-DCURL_USE_SCHANNEL=OFF ^
|
||||
-DCURL_USE_OPENSSL=OFF ^
|
||||
-DCURL_USE_LIBPSL=OFF ^
|
||||
-DCURL_ZLIB=OFF ^
|
||||
-DCURL_USE_LIBSSH2=OFF ^
|
||||
-DCMAKE_C_FLAGS="/DWOLFSSL_ALT_CERT_CHAINS /DHAVE_SNI /DNO_MD4 /DWOLFSSL_USER_SETTINGS /DUSE_IPV6 /I\"$(SolutionDir)3rdparty\curl\extra\" /I\"$(SolutionDir)3rdparty\wolfssl\wolfssl\" /I\"$(SolutionDir)3rdparty\wolfssl\wolfssl\wolfssl\" /I\"$(SolutionDir)3rdparty\wolfssl\extra\win32\"" ^
|
||||
-DCMAKE_C_FLAGS_DEBUG="/Od /Ob0 /GF /Gy" ^
|
||||
-DWOLFSSL_INCLUDE_DIR="$(SolutionDir)3rdparty\wolfssl\wolfssl" ^
|
||||
-DWOLFSSL_LIBRARY="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\wolfssl.lib" ^
|
||||
"$(SolutionDir)3rdparty\curl\curl"
|
||||
</CmakeDebugCLI>
|
||||
<CmakeCopyCLI>
|
||||
echo Copying..
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\lib\libcurl.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)"
|
||||
</CmakeCopyCLI>
|
||||
<CmakeCopyDebugCLI>
|
||||
echo Copying..
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\lib\libcurl-d.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)"
|
||||
</CmakeCopyDebugCLI>
|
||||
<CmakeCleanCLI>
|
||||
echo Cleaning..
|
||||
del "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\libcurl.lib"
|
||||
rmdir /s /q "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
</CmakeCleanCLI>
|
||||
<CmakeCleanDebugCLI>
|
||||
echo Cleaning..
|
||||
del "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\libcurl-d.lib"
|
||||
rmdir /s /q "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
</CmakeCleanDebugCLI>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>$(SolutionDir)build\lib\$(Configuration)-$(Platform)\</OutDir>
|
||||
<IntDir>$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\</IntDir>
|
||||
<NMakeBuildCommandLine>
|
||||
$(CmakeDebugCLI)
|
||||
ninja
|
||||
$(CmakeCopyDebugCLI)
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>
|
||||
$(CmakeCleanDebugCLI)
|
||||
$(CmakeDebugCLI)
|
||||
ninja
|
||||
$(CmakeCopyDebugCLI)
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>
|
||||
$(CmakeCleanDebugCLI)
|
||||
</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>$(SolutionDir)build\lib\$(Configuration)-$(Platform)\</OutDir>
|
||||
<IntDir>$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\</IntDir>
|
||||
<NMakeBuildCommandLine>
|
||||
$(CmakeReleaseCLI)
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>
|
||||
$(CmakeCleanCLI)
|
||||
$(CmakeReleaseCLI)
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>
|
||||
$(CmakeCleanCLI)
|
||||
</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>curl\include;curl\lib;extra;$(SolutionDir)3rdparty\wolfssl\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WOLFSSL_ALT_CERT_CHAINS;HAVE_SNI;NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;NO_MD4;WOLFSSL_USER_SETTINGS;USE_IPV6;SIZEOF_LONG=4;SIZEOF_LONG_LONG=8;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="curl\lib\altsvc.c" />
|
||||
<ClCompile Include="curl\lib\amigaos.c" />
|
||||
<ClCompile Include="curl\lib\asyn-ares.c" />
|
||||
<ClCompile Include="curl\lib\asyn-base.c" />
|
||||
<ClCompile Include="curl\lib\asyn-thrdd.c" />
|
||||
<ClCompile Include="curl\lib\bufq.c" />
|
||||
<ClCompile Include="curl\lib\bufref.c" />
|
||||
<ClCompile Include="curl\lib\cf-h1-proxy.c" />
|
||||
<ClCompile Include="curl\lib\cf-h2-proxy.c" />
|
||||
<ClCompile Include="curl\lib\cf-haproxy.c" />
|
||||
<ClCompile Include="curl\lib\cf-https-connect.c" />
|
||||
<ClCompile Include="curl\lib\cf-ip-happy.c" />
|
||||
<ClCompile Include="curl\lib\cf-socket.c" />
|
||||
<ClCompile Include="curl\lib\cfilters.c" />
|
||||
<ClCompile Include="curl\lib\conncache.c" />
|
||||
<ClCompile Include="curl\lib\connect.c" />
|
||||
<ClCompile Include="curl\lib\content_encoding.c" />
|
||||
<ClCompile Include="curl\lib\cookie.c" />
|
||||
<ClCompile Include="curl\lib\cshutdn.c" />
|
||||
<ClCompile Include="curl\lib\curlx\base64.c" />
|
||||
<ClCompile Include="curl\lib\curlx\dynbuf.c" />
|
||||
<ClCompile Include="curl\lib\curlx\fopen.c" />
|
||||
<ClCompile Include="curl\lib\curlx\inet_ntop.c" />
|
||||
<ClCompile Include="curl\lib\curlx\inet_pton.c" />
|
||||
<ClCompile Include="curl\lib\curlx\multibyte.c" />
|
||||
<ClCompile Include="curl\lib\curlx\nonblock.c" />
|
||||
<ClCompile Include="curl\lib\curlx\strerr.c" />
|
||||
<ClCompile Include="curl\lib\curlx\strparse.c" />
|
||||
<ClCompile Include="curl\lib\curlx\timediff.c" />
|
||||
<ClCompile Include="curl\lib\curlx\timeval.c" />
|
||||
<ClCompile Include="curl\lib\curlx\version_win32.c" />
|
||||
<ClCompile Include="curl\lib\curlx\wait.c" />
|
||||
<ClCompile Include="curl\lib\curlx\warnless.c" />
|
||||
<ClCompile Include="curl\lib\curlx\winapi.c" />
|
||||
<ClCompile Include="curl\lib\curl_addrinfo.c" />
|
||||
<ClCompile Include="curl\lib\curl_endian.c" />
|
||||
<ClCompile Include="curl\lib\curl_fnmatch.c" />
|
||||
<ClCompile Include="curl\lib\curl_fopen.c" />
|
||||
<ClCompile Include="curl\lib\curl_gethostname.c" />
|
||||
<ClCompile Include="curl\lib\curl_get_line.c" />
|
||||
<ClCompile Include="curl\lib\curl_gssapi.c" />
|
||||
<ClCompile Include="curl\lib\curl_memrchr.c" />
|
||||
<ClCompile Include="curl\lib\curl_ntlm_core.c" />
|
||||
<ClCompile Include="curl\lib\curl_range.c" />
|
||||
<ClCompile Include="curl\lib\curl_rtmp.c" />
|
||||
<ClCompile Include="curl\lib\curl_sasl.c" />
|
||||
<ClCompile Include="curl\lib\curl_sha512_256.c" />
|
||||
<ClCompile Include="curl\lib\curl_sspi.c" />
|
||||
<ClCompile Include="curl\lib\curl_threads.c" />
|
||||
<ClCompile Include="curl\lib\curl_trc.c" />
|
||||
<ClCompile Include="curl\lib\cw-out.c" />
|
||||
<ClCompile Include="curl\lib\cw-pause.c" />
|
||||
<ClCompile Include="curl\lib\dict.c" />
|
||||
<ClCompile Include="curl\lib\dllmain.c" />
|
||||
<ClCompile Include="curl\lib\doh.c" />
|
||||
<ClCompile Include="curl\lib\dynhds.c" />
|
||||
<ClCompile Include="curl\lib\easy.c" />
|
||||
<ClCompile Include="curl\lib\easygetopt.c" />
|
||||
<ClCompile Include="curl\lib\easyoptions.c" />
|
||||
<ClCompile Include="curl\lib\escape.c" />
|
||||
<ClCompile Include="curl\lib\fake_addrinfo.c" />
|
||||
<ClCompile Include="curl\lib\file.c" />
|
||||
<ClCompile Include="curl\lib\fileinfo.c" />
|
||||
<ClCompile Include="curl\lib\formdata.c" />
|
||||
<ClCompile Include="curl\lib\ftp.c" />
|
||||
<ClCompile Include="curl\lib\ftplistparser.c" />
|
||||
<ClCompile Include="curl\lib\getenv.c" />
|
||||
<ClCompile Include="curl\lib\getinfo.c" />
|
||||
<ClCompile Include="curl\lib\gopher.c" />
|
||||
<ClCompile Include="curl\lib\hash.c" />
|
||||
<ClCompile Include="curl\lib\headers.c" />
|
||||
<ClCompile Include="curl\lib\hmac.c" />
|
||||
<ClCompile Include="curl\lib\hostip.c" />
|
||||
<ClCompile Include="curl\lib\hostip4.c" />
|
||||
<ClCompile Include="curl\lib\hostip6.c" />
|
||||
<ClCompile Include="curl\lib\hsts.c" />
|
||||
<ClCompile Include="curl\lib\http.c" />
|
||||
<ClCompile Include="curl\lib\http1.c" />
|
||||
<ClCompile Include="curl\lib\http2.c" />
|
||||
<ClCompile Include="curl\lib\httpsrr.c" />
|
||||
<ClCompile Include="curl\lib\http_aws_sigv4.c" />
|
||||
<ClCompile Include="curl\lib\http_chunks.c" />
|
||||
<ClCompile Include="curl\lib\http_digest.c" />
|
||||
<ClCompile Include="curl\lib\http_negotiate.c" />
|
||||
<ClCompile Include="curl\lib\http_ntlm.c" />
|
||||
<ClCompile Include="curl\lib\http_proxy.c" />
|
||||
<ClCompile Include="curl\lib\idn.c" />
|
||||
<ClCompile Include="curl\lib\if2ip.c" />
|
||||
<ClCompile Include="curl\lib\imap.c" />
|
||||
<ClCompile Include="curl\lib\ldap.c" />
|
||||
<ClCompile Include="curl\lib\llist.c" />
|
||||
<ClCompile Include="curl\lib\macos.c" />
|
||||
<ClCompile Include="curl\lib\md4.c" />
|
||||
<ClCompile Include="curl\lib\md5.c" />
|
||||
<ClCompile Include="curl\lib\memdebug.c" />
|
||||
<ClCompile Include="curl\lib\mime.c" />
|
||||
<ClCompile Include="curl\lib\mprintf.c" />
|
||||
<ClCompile Include="curl\lib\mqtt.c" />
|
||||
<ClCompile Include="curl\lib\multi.c" />
|
||||
<ClCompile Include="curl\lib\multi_ev.c" />
|
||||
<ClCompile Include="curl\lib\multi_ntfy.c" />
|
||||
<ClCompile Include="curl\lib\netrc.c" />
|
||||
<ClCompile Include="curl\lib\noproxy.c" />
|
||||
<ClCompile Include="curl\lib\openldap.c" />
|
||||
<ClCompile Include="curl\lib\parsedate.c" />
|
||||
<ClCompile Include="curl\lib\pingpong.c" />
|
||||
<ClCompile Include="curl\lib\pop3.c" />
|
||||
<ClCompile Include="curl\lib\progress.c" />
|
||||
<ClCompile Include="curl\lib\psl.c" />
|
||||
<ClCompile Include="curl\lib\rand.c" />
|
||||
<ClCompile Include="curl\lib\rename.c" />
|
||||
<ClCompile Include="curl\lib\request.c" />
|
||||
<ClCompile Include="curl\lib\rtsp.c" />
|
||||
<ClCompile Include="curl\lib\select.c" />
|
||||
<ClCompile Include="curl\lib\sendf.c" />
|
||||
<ClCompile Include="curl\lib\setopt.c" />
|
||||
<ClCompile Include="curl\lib\sha256.c" />
|
||||
<ClCompile Include="curl\lib\share.c" />
|
||||
<ClCompile Include="curl\lib\slist.c" />
|
||||
<ClCompile Include="curl\lib\smb.c" />
|
||||
<ClCompile Include="curl\lib\smtp.c" />
|
||||
<ClCompile Include="curl\lib\socketpair.c" />
|
||||
<ClCompile Include="curl\lib\socks.c" />
|
||||
<ClCompile Include="curl\lib\socks_gssapi.c" />
|
||||
<ClCompile Include="curl\lib\socks_sspi.c" />
|
||||
<ClCompile Include="curl\lib\speedcheck.c" />
|
||||
<ClCompile Include="curl\lib\splay.c" />
|
||||
<ClCompile Include="curl\lib\strcase.c" />
|
||||
<ClCompile Include="curl\lib\strdup.c" />
|
||||
<ClCompile Include="curl\lib\strequal.c" />
|
||||
<ClCompile Include="curl\lib\strerror.c" />
|
||||
<ClCompile Include="curl\lib\system_win32.c" />
|
||||
<ClCompile Include="curl\lib\telnet.c" />
|
||||
<ClCompile Include="curl\lib\tftp.c" />
|
||||
<ClCompile Include="curl\lib\transfer.c" />
|
||||
<ClCompile Include="curl\lib\uint-bset.c" />
|
||||
<ClCompile Include="curl\lib\uint-hash.c" />
|
||||
<ClCompile Include="curl\lib\uint-spbset.c" />
|
||||
<ClCompile Include="curl\lib\uint-table.c" />
|
||||
<ClCompile Include="curl\lib\url.c" />
|
||||
<ClCompile Include="curl\lib\urlapi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\gsasl.c" />
|
||||
<ClCompile Include="curl\lib\version.c" />
|
||||
<ClCompile Include="curl\lib\vquic\curl_ngtcp2.c" />
|
||||
<ClCompile Include="curl\lib\vquic\curl_quiche.c" />
|
||||
<ClCompile Include="curl\lib\vtls\apple.c" />
|
||||
<ClCompile Include="curl\lib\vtls\cipher_suite.c" />
|
||||
<ClCompile Include="curl\lib\vtls\hostcheck.c" />
|
||||
<ClCompile Include="curl\lib\vtls\rustls.c" />
|
||||
<ClCompile Include="curl\lib\vtls\vtls_scache.c" />
|
||||
<ClCompile Include="curl\lib\vtls\vtls_spack.c" />
|
||||
<ClCompile Include="curl\lib\vtls\x509asn1.c" />
|
||||
<ClCompile Include="curl\lib\vauth\cleartext.c" />
|
||||
<ClCompile Include="curl\lib\vauth\cram.c" />
|
||||
<ClCompile Include="curl\lib\vauth\digest.c" />
|
||||
<ClCompile Include="curl\lib\vauth\digest_sspi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\krb5_gssapi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\krb5_sspi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\ntlm.c" />
|
||||
<ClCompile Include="curl\lib\vauth\ntlm_sspi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\oauth2.c" />
|
||||
<ClCompile Include="curl\lib\vauth\spnego_gssapi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\spnego_sspi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\vauth.c" />
|
||||
<ClCompile Include="curl\lib\vquic\vquic.c" />
|
||||
<ClCompile Include="curl\lib\vssh\curl_path.c" />
|
||||
<ClCompile Include="curl\lib\vssh\libssh.c" />
|
||||
<ClCompile Include="curl\lib\vssh\libssh2.c" />
|
||||
<ClCompile Include="curl\lib\vtls\gtls.c" />
|
||||
<ClCompile Include="curl\lib\vtls\keylog.c" />
|
||||
<ClCompile Include="curl\lib\vtls\mbedtls.c" />
|
||||
<ClCompile Include="curl\lib\vtls\mbedtls_threadlock.c" />
|
||||
<ClCompile Include="curl\lib\vtls\openssl.c" />
|
||||
<ClCompile Include="curl\lib\vtls\schannel.c" />
|
||||
<ClCompile Include="curl\lib\vtls\schannel_verify.c" />
|
||||
<ClCompile Include="curl\lib\vtls\vtls.c" />
|
||||
<ClCompile Include="curl\lib\vtls\wolfssl.c" />
|
||||
<ClCompile Include="curl\lib\ws.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="curl\include\curl\curl.h" />
|
||||
<ClInclude Include="curl\include\curl\curlver.h" />
|
||||
<ClInclude Include="curl\include\curl\easy.h" />
|
||||
<ClInclude Include="curl\include\curl\mprintf.h" />
|
||||
<ClInclude Include="curl\include\curl\multi.h" />
|
||||
<ClInclude Include="curl\include\curl\stdcheaders.h" />
|
||||
<ClInclude Include="curl\include\curl\system.h" />
|
||||
<ClInclude Include="curl\include\curl\typecheck-gcc.h" />
|
||||
<ClInclude Include="curl\include\curl\urlapi.h" />
|
||||
<ClInclude Include="curl\lib\altsvc.h" />
|
||||
<ClInclude Include="curl\lib\amigaos.h" />
|
||||
<ClInclude Include="curl\lib\arpa_telnet.h" />
|
||||
<ClInclude Include="curl\lib\asyn.h" />
|
||||
<ClInclude Include="curl\lib\bufq.h" />
|
||||
<ClInclude Include="curl\lib\bufref.h" />
|
||||
<ClInclude Include="curl\lib\cf-h1-proxy.h" />
|
||||
<ClInclude Include="curl\lib\cf-h2-proxy.h" />
|
||||
<ClInclude Include="curl\lib\cf-haproxy.h" />
|
||||
<ClInclude Include="curl\lib\cf-https-connect.h" />
|
||||
<ClInclude Include="curl\lib\cf-ip-happy.h" />
|
||||
<ClInclude Include="curl\lib\cf-socket.h" />
|
||||
<ClInclude Include="curl\lib\cfilters.h" />
|
||||
<ClInclude Include="curl\lib\config-mac.h" />
|
||||
<ClInclude Include="curl\lib\config-os400.h" />
|
||||
<ClInclude Include="curl\lib\config-plan9.h" />
|
||||
<ClInclude Include="curl\lib\config-riscos.h" />
|
||||
<ClInclude Include="curl\lib\config-win32.h" />
|
||||
<ClInclude Include="curl\lib\conncache.h" />
|
||||
<ClInclude Include="curl\lib\connect.h" />
|
||||
<ClInclude Include="curl\lib\content_encoding.h" />
|
||||
<ClInclude Include="curl\lib\cookie.h" />
|
||||
<ClInclude Include="curl\lib\cshutdn.h" />
|
||||
<ClInclude Include="curl\lib\curlx\base64.h" />
|
||||
<ClInclude Include="curl\lib\curlx\binmode.h" />
|
||||
<ClInclude Include="curl\lib\curlx\curlx.h" />
|
||||
<ClInclude Include="curl\lib\curlx\dynbuf.h" />
|
||||
<ClInclude Include="curl\lib\curlx\fopen.h" />
|
||||
<ClInclude Include="curl\lib\curlx\inet_ntop.h" />
|
||||
<ClInclude Include="curl\lib\curlx\inet_pton.h" />
|
||||
<ClInclude Include="curl\lib\curlx\multibyte.h" />
|
||||
<ClInclude Include="curl\lib\curlx\nonblock.h" />
|
||||
<ClInclude Include="curl\lib\curlx\strerr.h" />
|
||||
<ClInclude Include="curl\lib\curlx\strparse.h" />
|
||||
<ClInclude Include="curl\lib\curlx\timediff.h" />
|
||||
<ClInclude Include="curl\lib\curlx\timeval.h" />
|
||||
<ClInclude Include="curl\lib\curlx\version_win32.h" />
|
||||
<ClInclude Include="curl\lib\curlx\wait.h" />
|
||||
<ClInclude Include="curl\lib\curlx\warnless.h" />
|
||||
<ClInclude Include="curl\lib\curlx\winapi.h" />
|
||||
<ClInclude Include="curl\lib\curl_addrinfo.h" />
|
||||
<ClInclude Include="curl\lib\curl_ctype.h" />
|
||||
<ClInclude Include="curl\lib\curl_endian.h" />
|
||||
<ClInclude Include="curl\lib\curl_fnmatch.h" />
|
||||
<ClInclude Include="curl\lib\curl_fopen.h" />
|
||||
<ClInclude Include="curl\lib\curl_gethostname.h" />
|
||||
<ClInclude Include="curl\lib\curl_get_line.h" />
|
||||
<ClInclude Include="curl\lib\curl_gssapi.h" />
|
||||
<ClInclude Include="curl\lib\curl_hmac.h" />
|
||||
<ClInclude Include="curl\lib\curl_ldap.h" />
|
||||
<ClInclude Include="curl\lib\curl_md4.h" />
|
||||
<ClInclude Include="curl\lib\curl_md5.h" />
|
||||
<ClInclude Include="curl\lib\curl_memory.h" />
|
||||
<ClInclude Include="curl\lib\curl_memrchr.h" />
|
||||
<ClInclude Include="curl\lib\curl_mem_undef.h" />
|
||||
<ClInclude Include="curl\lib\curl_ntlm_core.h" />
|
||||
<ClInclude Include="curl\lib\curl_printf.h" />
|
||||
<ClInclude Include="curl\lib\curl_range.h" />
|
||||
<ClInclude Include="curl\lib\curl_rtmp.h" />
|
||||
<ClInclude Include="curl\lib\curl_sasl.h" />
|
||||
<ClInclude Include="curl\lib\curl_setup.h" />
|
||||
<ClInclude Include="curl\lib\curl_setup_once.h" />
|
||||
<ClInclude Include="curl\lib\curl_sha256.h" />
|
||||
<ClInclude Include="curl\lib\curl_sha512_256.h" />
|
||||
<ClInclude Include="curl\lib\curl_sspi.h" />
|
||||
<ClInclude Include="curl\lib\curl_threads.h" />
|
||||
<ClInclude Include="curl\lib\curl_trc.h" />
|
||||
<ClInclude Include="curl\lib\cw-out.h" />
|
||||
<ClInclude Include="curl\lib\cw-pause.h" />
|
||||
<ClInclude Include="curl\lib\dict.h" />
|
||||
<ClInclude Include="curl\lib\doh.h" />
|
||||
<ClInclude Include="curl\lib\dynhds.h" />
|
||||
<ClInclude Include="curl\lib\easyif.h" />
|
||||
<ClInclude Include="curl\lib\easyoptions.h" />
|
||||
<ClInclude Include="curl\lib\easy_lock.h" />
|
||||
<ClInclude Include="curl\lib\escape.h" />
|
||||
<ClInclude Include="curl\lib\fake_addrinfo.h" />
|
||||
<ClInclude Include="curl\lib\file.h" />
|
||||
<ClInclude Include="curl\lib\fileinfo.h" />
|
||||
<ClInclude Include="curl\lib\formdata.h" />
|
||||
<ClInclude Include="curl\lib\ftp.h" />
|
||||
<ClInclude Include="curl\lib\ftplistparser.h" />
|
||||
<ClInclude Include="curl\lib\functypes.h" />
|
||||
<ClInclude Include="curl\lib\getinfo.h" />
|
||||
<ClInclude Include="curl\lib\gopher.h" />
|
||||
<ClInclude Include="curl\lib\hash.h" />
|
||||
<ClInclude Include="curl\lib\headers.h" />
|
||||
<ClInclude Include="curl\lib\hostip.h" />
|
||||
<ClInclude Include="curl\lib\hsts.h" />
|
||||
<ClInclude Include="curl\lib\http.h" />
|
||||
<ClInclude Include="curl\lib\http1.h" />
|
||||
<ClInclude Include="curl\lib\http2.h" />
|
||||
<ClInclude Include="curl\lib\httpsrr.h" />
|
||||
<ClInclude Include="curl\lib\http_aws_sigv4.h" />
|
||||
<ClInclude Include="curl\lib\http_chunks.h" />
|
||||
<ClInclude Include="curl\lib\http_digest.h" />
|
||||
<ClInclude Include="curl\lib\http_negotiate.h" />
|
||||
<ClInclude Include="curl\lib\http_ntlm.h" />
|
||||
<ClInclude Include="curl\lib\http_proxy.h" />
|
||||
<ClInclude Include="curl\lib\idn.h" />
|
||||
<ClInclude Include="curl\lib\if2ip.h" />
|
||||
<ClInclude Include="curl\lib\imap.h" />
|
||||
<ClInclude Include="curl\lib\llist.h" />
|
||||
<ClInclude Include="curl\lib\macos.h" />
|
||||
<ClInclude Include="curl\lib\memdebug.h" />
|
||||
<ClInclude Include="curl\lib\mime.h" />
|
||||
<ClInclude Include="curl\lib\mqtt.h" />
|
||||
<ClInclude Include="curl\lib\multihandle.h" />
|
||||
<ClInclude Include="curl\lib\multiif.h" />
|
||||
<ClInclude Include="curl\lib\multi_ev.h" />
|
||||
<ClInclude Include="curl\lib\multi_ntfy.h" />
|
||||
<ClInclude Include="curl\lib\netrc.h" />
|
||||
<ClInclude Include="curl\lib\noproxy.h" />
|
||||
<ClInclude Include="curl\lib\parsedate.h" />
|
||||
<ClInclude Include="curl\lib\pingpong.h" />
|
||||
<ClInclude Include="curl\lib\pop3.h" />
|
||||
<ClInclude Include="curl\lib\progress.h" />
|
||||
<ClInclude Include="curl\lib\psl.h" />
|
||||
<ClInclude Include="curl\lib\rand.h" />
|
||||
<ClInclude Include="curl\lib\rename.h" />
|
||||
<ClInclude Include="curl\lib\request.h" />
|
||||
<ClInclude Include="curl\lib\rtsp.h" />
|
||||
<ClInclude Include="curl\lib\select.h" />
|
||||
<ClInclude Include="curl\lib\sendf.h" />
|
||||
<ClInclude Include="curl\lib\setopt.h" />
|
||||
<ClInclude Include="curl\lib\setup-os400.h" />
|
||||
<ClInclude Include="curl\lib\setup-vms.h" />
|
||||
<ClInclude Include="curl\lib\setup-win32.h" />
|
||||
<ClInclude Include="curl\lib\share.h" />
|
||||
<ClInclude Include="curl\lib\sigpipe.h" />
|
||||
<ClInclude Include="curl\lib\slist.h" />
|
||||
<ClInclude Include="curl\lib\smb.h" />
|
||||
<ClInclude Include="curl\lib\smtp.h" />
|
||||
<ClInclude Include="curl\lib\sockaddr.h" />
|
||||
<ClInclude Include="curl\lib\socketpair.h" />
|
||||
<ClInclude Include="curl\lib\socks.h" />
|
||||
<ClInclude Include="curl\lib\speedcheck.h" />
|
||||
<ClInclude Include="curl\lib\splay.h" />
|
||||
<ClInclude Include="curl\lib\strcase.h" />
|
||||
<ClInclude Include="curl\lib\strdup.h" />
|
||||
<ClInclude Include="curl\lib\strerror.h" />
|
||||
<ClInclude Include="curl\lib\strtok.h" />
|
||||
<ClInclude Include="curl\lib\strtoofft.h" />
|
||||
<ClInclude Include="curl\lib\system_win32.h" />
|
||||
<ClInclude Include="curl\lib\telnet.h" />
|
||||
<ClInclude Include="curl\lib\tftp.h" />
|
||||
<ClInclude Include="curl\lib\transfer.h" />
|
||||
<ClInclude Include="curl\lib\uint-bset.h" />
|
||||
<ClInclude Include="curl\lib\uint-hash.h" />
|
||||
<ClInclude Include="curl\lib\uint-spbset.h" />
|
||||
<ClInclude Include="curl\lib\uint-table.h" />
|
||||
<ClInclude Include="curl\lib\url.h" />
|
||||
<ClInclude Include="curl\lib\urlapi-int.h" />
|
||||
<ClInclude Include="curl\lib\urldata.h" />
|
||||
<ClInclude Include="curl\lib\vquic\curl_ngtcp2.h" />
|
||||
<ClInclude Include="curl\lib\vquic\curl_quiche.h" />
|
||||
<ClInclude Include="curl\lib\vquic\vquic_int.h" />
|
||||
<ClInclude Include="curl\lib\vtls\apple.h" />
|
||||
<ClInclude Include="curl\lib\vtls\cipher_suite.h" />
|
||||
<ClInclude Include="curl\lib\vtls\hostcheck.h" />
|
||||
<ClInclude Include="curl\lib\vtls\rustls.h" />
|
||||
<ClInclude Include="curl\lib\vtls\schannel_int.h" />
|
||||
<ClInclude Include="curl\lib\vtls\vtls_int.h" />
|
||||
<ClInclude Include="curl\lib\vtls\vtls_scache.h" />
|
||||
<ClInclude Include="curl\lib\vtls\vtls_spack.h" />
|
||||
<ClInclude Include="curl\lib\vtls\x509asn1.h" />
|
||||
<ClInclude Include="curl\lib\vauth\digest.h" />
|
||||
<ClInclude Include="curl\lib\vauth\ntlm.h" />
|
||||
<ClInclude Include="curl\lib\vauth\vauth.h" />
|
||||
<ClInclude Include="curl\lib\vquic\vquic.h" />
|
||||
<ClInclude Include="curl\lib\vssh\curl_path.h" />
|
||||
<ClInclude Include="curl\lib\vssh\ssh.h" />
|
||||
<ClInclude Include="curl\lib\vtls\gtls.h" />
|
||||
<ClInclude Include="curl\lib\vtls\keylog.h" />
|
||||
<ClInclude Include="curl\lib\vtls\mbedtls.h" />
|
||||
<ClInclude Include="curl\lib\vtls\mbedtls_threadlock.h" />
|
||||
<ClInclude Include="curl\lib\vtls\openssl.h" />
|
||||
<ClInclude Include="curl\lib\vtls\schannel.h" />
|
||||
<ClInclude Include="curl\lib\vtls\vtls.h" />
|
||||
<ClInclude Include="curl\lib\vtls\wolfssl.h" />
|
||||
<ClInclude Include="curl\lib\ws.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="curl\lib\libcurl.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
|
||||
-1130
File diff suppressed because it is too large
Load Diff
Vendored
+1
-1
Submodule 3rdparty/discord-rpc/discord-rpc updated: 3dc2c326cb...fb04b1766b
Vendored
+1
-1
Submodule 3rdparty/ffmpeg updated: ce81114ed9...649d9d9353
Vendored
+1
-1
Submodule 3rdparty/fusion/fusion updated: 008e03eac0...9325424011
Vendored
+8
-4
@@ -13,17 +13,21 @@
|
||||
<ItemGroup>
|
||||
<ClInclude Include="fusion\Fusion\Fusion.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionAhrs.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionAxes.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionCalibration.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionBias.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionCompass.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionConfig.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionConvention.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionInline.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionMath.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionOffset.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionModel.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionRemap.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="fusion\Fusion\FusionAhrs.c" />
|
||||
<ClCompile Include="fusion\Fusion\FusionBias.c" />
|
||||
<ClCompile Include="fusion\Fusion\FusionCompass.c" />
|
||||
<ClCompile Include="fusion\Fusion\FusionOffset.c" />
|
||||
<ClCompile Include="fusion\Fusion\FusionConvention.c" />
|
||||
<ClCompile Include="fusion\Fusion\FusionRemap.c" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<RootNamespace>Fusion</RootNamespace>
|
||||
|
||||
+12
-4
@@ -8,12 +8,14 @@
|
||||
<ItemGroup>
|
||||
<ClInclude Include="fusion\Fusion\Fusion.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionAhrs.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionAxes.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionCalibration.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionCompass.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionConvention.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionMath.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionOffset.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionBias.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionModel.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionRemap.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionConfig.h" />
|
||||
<ClInclude Include="fusion\Fusion\FusionInline.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="fusion\Fusion\FusionAhrs.c">
|
||||
@@ -22,7 +24,13 @@
|
||||
<ClCompile Include="fusion\Fusion\FusionCompass.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="fusion\Fusion\FusionOffset.c">
|
||||
<ClCompile Include="fusion\Fusion\FusionBias.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="fusion\Fusion\FusionConvention.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="fusion\Fusion\FusionRemap.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/glslang/glslang updated: fc9889c889...f0bd0257c3
Vendored
+39
-14
@@ -37,19 +37,46 @@
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeGenerator>"Visual Studio $(VisualStudioVersion.Substring(0,2))"</CmakeGenerator>
|
||||
<CmakeReleaseCLI>call vsdevcmd.bat -arch=amd64
|
||||
cmake -G $(CmakeGenerator) -A x64 -DCMAKE_BUILD_TYPE="Release" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DGLSLANG_TESTS=OFF -DENABLE_GLSLANG_BINARIES=OFF -DBUILD_EXTERNAL=OFF -DENABLE_SPVREMAPPER=OFF -DENABLE_HLSL=OFF -DENABLE_OPT=OFF -S glslang -B "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_BUILD_TYPE="Release" ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
|
||||
-DGLSLANG_TESTS=OFF ^
|
||||
-DENABLE_GLSLANG_BINARIES=OFF ^
|
||||
-DBUILD_EXTERNAL=OFF ^
|
||||
-DENABLE_SPVREMAPPER=OFF ^
|
||||
-DENABLE_HLSL=OFF ^
|
||||
-DENABLE_OPT=OFF ^
|
||||
-S "$(SolutionDir)3rdparty\glslang\glslang"
|
||||
</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>call vsdevcmd.bat -arch=amd64
|
||||
cmake -G $(CmakeGenerator) -A x64 -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug -DGLSLANG_TESTS=OFF -DENABLE_GLSLANG_BINARIES=OFF -DBUILD_EXTERNAL=OFF -DENABLE_SPVREMAPPER=OFF -DENABLE_HLSL=OFF -DENABLE_OPT=OFF -S glslang -B "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_BUILD_TYPE="Debug" ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug ^
|
||||
-DGLSLANG_TESTS=OFF ^
|
||||
-DENABLE_GLSLANG_BINARIES=OFF ^
|
||||
-DBUILD_EXTERNAL=OFF ^
|
||||
-DENABLE_SPVREMAPPER=OFF ^
|
||||
-DENABLE_HLSL=OFF ^
|
||||
-DENABLE_OPT=OFF ^
|
||||
-S "$(SolutionDir)3rdparty\glslang\glslang"
|
||||
</CmakeDebugCLI>
|
||||
<CmakeCopyCLI>
|
||||
echo Copying..
|
||||
mkdir "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\SPIRV\$(CONFIGURATION)\*.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\glslang\OSDependent\Windows\$(CONFIGURATION)\*.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\glslang\$(CONFIGURATION)\*.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\SPIRV\*.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\glslang\OSDependent\Windows\*.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
copy "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\glslang\*.lib" "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\$(ProjectName)"
|
||||
</CmakeCopyCLI>
|
||||
<CmakeCleanCLI>
|
||||
echo Cleaning..
|
||||
@@ -63,17 +90,16 @@
|
||||
<IntDir>$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\</IntDir>
|
||||
<NMakeBuildCommandLine>
|
||||
$(CmakeReleaseCLI)
|
||||
msbuild.exe "$(IntDir)\ALL_BUILD.vcxproj" /t:build /p:Configuration=Release /p:ForceImportBeforeCppTargets="$(PropsAbsPath)" /m
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>
|
||||
$(CmakeCleanCLI)
|
||||
$(CmakeReleaseCLI)
|
||||
msbuild.exe "$(IntDir)\ALL_BUILD.vcxproj" /t:rebuild /p:Configuration=Release /p:ForceImportBeforeCppTargets="$(PropsAbsPath)" /m
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>
|
||||
$(CmakeReleaseCLI)
|
||||
msbuild.exe "$(IntDir)\ALL_BUILD.vcxproj" /t:clean /p:Configuration=Release /p:ForceImportBeforeCppTargets="$(PropsAbsPath)" /m
|
||||
$(CmakeCleanCLI)
|
||||
</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
@@ -82,17 +108,16 @@
|
||||
<IntDir>$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\</IntDir>
|
||||
<NMakeBuildCommandLine>
|
||||
$(CmakeDebugCLI)
|
||||
msbuild.exe "$(IntDir)\ALL_BUILD.vcxproj" /t:build /p:Configuration=Debug /p:ForceImportBeforeCppTargets="$(PropsAbsPath)" /m
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>
|
||||
$(CmakeCleanCLI)
|
||||
$(CmakeDebugCLI)
|
||||
msbuild.exe "$(IntDir)\ALL_BUILD.vcxproj" /t:rebuild /p:Configuration=Debug /p:ForceImportBeforeCppTargets="$(PropsAbsPath)" /m
|
||||
ninja
|
||||
$(CmakeCopyCLI)
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>
|
||||
$(CmakeDebugCLI)
|
||||
msbuild.exe "$(IntDir)\ALL_BUILD.vcxproj" /t:clean /p:Configuration=Debug /p:ForceImportBeforeCppTargets="$(PropsAbsPath)" /m
|
||||
$(CmakeCleanCLI)
|
||||
</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
|
||||
-2
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||
Vendored
+1
-1
Submodule 3rdparty/libpng/libpng updated: c3e304954a...cd952f49f9
Vendored
+1
-1
Submodule 3rdparty/libsdl-org/SDL updated: 683181b47c...829a65d769
Vendored
+1
-1
Submodule 3rdparty/libusb/libusb updated: 15a7ebb4d4...87a55632db
+5
@@ -54,6 +54,9 @@
|
||||
<ClCompile Condition="'$(Configuration)'=='Release'">
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<ClCompile Condition="'$(EnableLibUsbWindowsHotplug)' == 'true'">
|
||||
<PreprocessorDefinitions>LIBUSB_WINDOWS_HOTPLUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Lib>
|
||||
<OutputFile>$(OutDir)libusb-1.0.lib</OutputFile>
|
||||
</Lib>
|
||||
@@ -64,6 +67,7 @@
|
||||
<ClCompile Include="libusb\libusb\hotplug.c" />
|
||||
<ClCompile Include="libusb\libusb\io.c" />
|
||||
<ClCompile Include="libusb\libusb\os\events_windows.c" />
|
||||
<ClCompile Condition="'$(EnableLibUsbWindowsHotplug)' == 'true'" Include="libusb\libusb\os\windows_hotplug.c" />
|
||||
<ClCompile Include="libusb\libusb\strerror.c" />
|
||||
<ClCompile Include="libusb\libusb\sync.c" />
|
||||
<ClCompile Include="libusb\libusb\os\threads_windows.c" />
|
||||
@@ -72,6 +76,7 @@
|
||||
<ClCompile Include="libusb\libusb\os\windows_winusb.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Condition="'$(EnableLibUsbWindowsHotplug)' == 'true'" Include="libusb\libusb\os\windows_hotplug.h" />
|
||||
<ClInclude Include="libusb\msvc\config.h" />
|
||||
<ClInclude Include="libusb\libusb\hotplug.h" />
|
||||
<ClInclude Include="libusb\libusb\libusb.h" />
|
||||
|
||||
Vendored
+1
-1
@@ -51,7 +51,7 @@ if(WITH_LLVM)
|
||||
|
||||
set(STATIC_LINK_LLVM ON CACHE BOOL "Link against LLVM statically. This will get set to ON if you build LLVM from the submodule." FORCE)
|
||||
|
||||
find_package(LLVM 19.1 CONFIG)
|
||||
find_package(LLVM 22.1 CONFIG)
|
||||
if(NOT LLVM_FOUND)
|
||||
message(FATAL_ERROR "Couldn't build LLVM from the submodule. You might need to run `git submodule update --init`")
|
||||
endif()
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/llvm/llvm updated: cd708029e0...ca7933e47d
Vendored
+56
-2
@@ -40,11 +40,65 @@
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeReleaseCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\llvm_build-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_BENCHMARKS=OFF -DLLVM_BUILD_DOCS=OFF -DLLVM_BUILD_EXAMPLES=OFF -DLLVM_BUILD_TESTS=OFF\ -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_UTILS=OFF -DLLVM_INSTALL_UTILS=OFF -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_PDB=OFF -DLLVM_USE_INTEL_JITEVENTS=ON "$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
-DCMAKE_BUILD_TYPE="Release" ^
|
||||
-DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
|
||||
-DLLVM_TARGETS_TO_BUILD=X86 ^
|
||||
-DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_BUILD_RUNTIME=OFF ^
|
||||
-DLLVM_BUILD_TOOLS=OFF ^
|
||||
-DLLVM_BUILD_BENCHMARKS=OFF ^
|
||||
-DLLVM_BUILD_DOCS=OFF ^
|
||||
-DLLVM_BUILD_EXAMPLES=OFF ^
|
||||
-DLLVM_BUILD_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_TOOLS=OFF ^
|
||||
-DLLVM_INCLUDE_DOCS=OFF ^
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF ^
|
||||
-DLLVM_INCLUDE_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_BENCHMARKS=OFF ^
|
||||
-DLLVM_INCLUDE_UTILS=OFF ^
|
||||
-DLLVM_INSTALL_UTILS=OFF ^
|
||||
-DLLVM_ENABLE_DIA_SDK=OFF ^
|
||||
-DLLVM_ENABLE_PDB=OFF ^
|
||||
-DLLVM_USE_INTEL_JITEVENTS=ON ^
|
||||
"$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\llvm_build-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_BENCHMARKS=OFF -DLLVM_BUILD_DOCS=OFF -DLLVM_BUILD_EXAMPLES=OFF -DLLVM_BUILD_TESTS=OFF\ -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_UTILS=OFF -DLLVM_INSTALL_UTILS=OFF -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_PDB=OFF -DLLVM_USE_INTEL_JITEVENTS=ON "$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
-DCMAKE_BUILD_TYPE="Debug" ^
|
||||
-DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL ^
|
||||
-DLLVM_TARGETS_TO_BUILD=X86 ^
|
||||
-DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_BUILD_RUNTIME=OFF ^
|
||||
-DLLVM_BUILD_TOOLS=OFF ^
|
||||
-DLLVM_BUILD_BENCHMARKS=OFF ^
|
||||
-DLLVM_BUILD_DOCS=OFF ^
|
||||
-DLLVM_BUILD_EXAMPLES=OFF ^
|
||||
-DLLVM_BUILD_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_TOOLS=OFF ^
|
||||
-DLLVM_INCLUDE_DOCS=OFF ^
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF ^
|
||||
-DLLVM_INCLUDE_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_BENCHMARKS=OFF ^
|
||||
-DLLVM_INCLUDE_UTILS=OFF ^
|
||||
-DLLVM_INSTALL_UTILS=OFF ^
|
||||
-DLLVM_ENABLE_DIA_SDK=OFF ^
|
||||
-DLLVM_ENABLE_PDB=OFF ^
|
||||
-DLLVM_USE_INTEL_JITEVENTS=ON ^
|
||||
"$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
</CmakeDebugCLI>
|
||||
<CmakeCleanCLI>
|
||||
echo Cleaning..
|
||||
|
||||
+56
-2
@@ -40,11 +40,65 @@
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeReleaseCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\llvm_build-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="clang-cl.exe" -DCMAKE_C_COMPILER="clang-cl.exe" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_BENCHMARKS=OFF -DLLVM_BUILD_DOCS=OFF -DLLVM_BUILD_EXAMPLES=OFF -DLLVM_BUILD_TESTS=OFF\ -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_UTILS=OFF -DLLVM_INSTALL_UTILS=OFF -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_PDB=OFF -DLLVM_USE_INTEL_JITEVENTS=ON "$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="clang-cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="clang-cl.exe" ^
|
||||
-DCMAKE_BUILD_TYPE="Release" ^
|
||||
-DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
|
||||
-DLLVM_TARGETS_TO_BUILD=X86 ^
|
||||
-DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_BUILD_RUNTIME=OFF ^
|
||||
-DLLVM_BUILD_TOOLS=OFF ^
|
||||
-DLLVM_BUILD_BENCHMARKS=OFF ^
|
||||
-DLLVM_BUILD_DOCS=OFF ^
|
||||
-DLLVM_BUILD_EXAMPLES=OFF ^
|
||||
-DLLVM_BUILD_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_TOOLS=OFF ^
|
||||
-DLLVM_INCLUDE_DOCS=OFF ^
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF ^
|
||||
-DLLVM_INCLUDE_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_BENCHMARKS=OFF ^
|
||||
-DLLVM_INCLUDE_UTILS=OFF ^
|
||||
-DLLVM_INSTALL_UTILS=OFF ^
|
||||
-DLLVM_ENABLE_DIA_SDK=OFF ^
|
||||
-DLLVM_ENABLE_PDB=OFF ^
|
||||
-DLLVM_USE_INTEL_JITEVENTS=ON ^
|
||||
"$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>call vsdevcmd.bat -arch=amd64
|
||||
cd "$(SolutionDir)build\tmp\llvm_build-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="clang-cl.exe" -DCMAKE_C_COMPILER="clang-cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_BENCHMARKS=OFF -DLLVM_BUILD_DOCS=OFF -DLLVM_BUILD_EXAMPLES=OFF -DLLVM_BUILD_TESTS=OFF\ -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_UTILS=OFF -DLLVM_INSTALL_UTILS=OFF -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_PDB=OFF -DLLVM_USE_INTEL_JITEVENTS=ON "$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="clang-cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="clang-cl.exe" ^
|
||||
-DCMAKE_BUILD_TYPE="Debug" ^
|
||||
-DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build" ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL ^
|
||||
-DLLVM_TARGETS_TO_BUILD=X86 ^
|
||||
-DLLVM_DEFAULT_TARGET_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_HOST_TRIPLE:STRING=x86_64-pc-windows-msvc ^
|
||||
-DLLVM_BUILD_RUNTIME=OFF ^
|
||||
-DLLVM_BUILD_TOOLS=OFF ^
|
||||
-DLLVM_BUILD_BENCHMARKS=OFF ^
|
||||
-DLLVM_BUILD_DOCS=OFF ^
|
||||
-DLLVM_BUILD_EXAMPLES=OFF ^
|
||||
-DLLVM_BUILD_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_TOOLS=OFF ^
|
||||
-DLLVM_INCLUDE_DOCS=OFF ^
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF ^
|
||||
-DLLVM_INCLUDE_TESTS=OFF ^
|
||||
-DLLVM_INCLUDE_BENCHMARKS=OFF ^
|
||||
-DLLVM_INCLUDE_UTILS=OFF ^
|
||||
-DLLVM_INSTALL_UTILS=OFF ^
|
||||
-DLLVM_ENABLE_DIA_SDK=OFF ^
|
||||
-DLLVM_ENABLE_PDB=OFF ^
|
||||
-DLLVM_USE_INTEL_JITEVENTS=ON ^
|
||||
"$(SolutionDir)3rdparty\llvm\llvm\llvm"
|
||||
</CmakeDebugCLI>
|
||||
<CmakeCleanCLI>
|
||||
echo Cleaning..
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/opencv/opencv updated: 67f53c26a7...d4dde8afe3
Vendored
+72
-59
@@ -56,6 +56,63 @@ namespace pine
|
||||
|
||||
typedef unsigned long long SOCKET;
|
||||
|
||||
#ifndef _WIN32
|
||||
inline std::string get_socket_path(std::string_view file_name, int slot, int default_slot)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
const char* runtime_dir = std::getenv("TMPDIR");
|
||||
#else
|
||||
const char* runtime_dir = std::getenv("XDG_RUNTIME_DIR");
|
||||
#endif
|
||||
// fallback in case macOS or other OSes don't implement the XDG base
|
||||
// spec
|
||||
std::string path = runtime_dir ? std::string(runtime_dir) + '/' : std::string("/tmp/");
|
||||
path += file_name;
|
||||
|
||||
if (slot != default_slot)
|
||||
{
|
||||
fmt::append(path, ".%d", slot);
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
inline const char* bind_and_listen(SOCKET sock, u16 port)
|
||||
{
|
||||
const int exclusive = 1;
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, reinterpret_cast<const char*>(&exclusive), sizeof(exclusive)) != 0)
|
||||
return "setsockopt(SO_EXCLUSIVEADDRUSE) failed";
|
||||
|
||||
sockaddr_in server{};
|
||||
server.sin_family = AF_INET;
|
||||
server.sin_port = htons(port);
|
||||
|
||||
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr.s_addr) != 1)
|
||||
return "inet_pton failed";
|
||||
#else
|
||||
inline const char* bind_and_listen(int sock, const std::string& socket_path)
|
||||
{
|
||||
sockaddr_un server{};
|
||||
|
||||
if (socket_path.size() >= sizeof(server.sun_path))
|
||||
return "socket path is too long";
|
||||
|
||||
server.sun_family = AF_UNIX;
|
||||
std::memcpy(server.sun_path, socket_path.c_str(), socket_path.size() + 1);
|
||||
|
||||
unlink(socket_path.c_str());
|
||||
#endif
|
||||
if (bind(sock, reinterpret_cast<sockaddr*>(&server), sizeof(server)) != 0)
|
||||
return "bind failed";
|
||||
|
||||
if (listen(sock, 4096) != 0)
|
||||
return "listen failed";
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<typename Impl>
|
||||
class pine_server : public Impl
|
||||
{
|
||||
@@ -164,14 +221,17 @@ namespace pine
|
||||
return IPCBuffer{ 5, MakeFailIPC(ret_buffer) };
|
||||
};
|
||||
|
||||
const auto write_string = [&](const std::string& str)
|
||||
const auto write_string = [&](std::string_view str)
|
||||
{
|
||||
if (!SafetyChecks(buf_cnt, 0, ret_cnt, str.size() + 1 + sizeof(u32), buf_size))
|
||||
return false;
|
||||
ToArray(ret_buffer, ::narrow<u32>(str.size() + 1), ret_cnt);
|
||||
ret_cnt += sizeof(u32);
|
||||
memcpy(&ret_buffer[ret_cnt], str.data(), str.size());
|
||||
ret_cnt += str.size();
|
||||
if (str.size())
|
||||
{
|
||||
std::memcpy(&ret_buffer[ret_cnt], str.data(), str.size());
|
||||
ret_cnt += str.size();
|
||||
}
|
||||
ret_buffer[ret_cnt++] = '\0';
|
||||
return true;
|
||||
};
|
||||
@@ -512,7 +572,7 @@ namespace pine
|
||||
*/
|
||||
static inline bool SafetyChecks(usz command_len, usz command_size, usz reply_len, usz reply_size = 0, usz buf_size = MAX_IPC_SIZE - 1)
|
||||
{
|
||||
bool res = ((command_len + command_size) > buf_size ||
|
||||
const bool res = ((command_len + command_size) > buf_size ||
|
||||
(reply_len + reply_size) >= MAX_IPC_RETURN_SIZE);
|
||||
if (res) [[unlikely]]
|
||||
return false;
|
||||
@@ -524,8 +584,7 @@ namespace pine
|
||||
pine_server() noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
WSADATA wsa;
|
||||
struct sockaddr_in server;
|
||||
WSADATA wsa {};
|
||||
m_sock = INVALID_SOCKET;
|
||||
m_msgsock = INVALID_SOCKET;
|
||||
|
||||
@@ -541,45 +600,9 @@ namespace pine
|
||||
return;
|
||||
}
|
||||
|
||||
// yes very good windows s/sun/sin/g sure is fine
|
||||
server.sin_family = AF_INET;
|
||||
// localhost only
|
||||
if (!inet_pton(server.sin_family, "127.0.0.1", &server.sin_addr.s_addr))
|
||||
{
|
||||
fmt::throw_exception("IPC: Failed to convert localhost");
|
||||
}
|
||||
server.sin_port = htons(Impl::get_port());
|
||||
|
||||
if (bind(m_sock, reinterpret_cast<struct sockaddr*>(&server), sizeof(server)) == SOCKET_ERROR)
|
||||
{
|
||||
Impl::error("IPC: Error while binding to socket! Shutting down...");
|
||||
return;
|
||||
}
|
||||
|
||||
const char* failure = bind_and_listen(m_sock, static_cast<u16>(Impl::get_port()));
|
||||
#else
|
||||
char* runtime_dir = nullptr;
|
||||
#ifdef __APPLE__
|
||||
runtime_dir = std::getenv("TMPDIR");
|
||||
#else
|
||||
runtime_dir = std::getenv("XDG_RUNTIME_DIR");
|
||||
#endif
|
||||
// fallback in case macOS or other OSes don't implement the XDG base
|
||||
// spec
|
||||
if (runtime_dir == nullptr)
|
||||
m_socket_name = "/tmp/rpcs3.sock";
|
||||
else
|
||||
{
|
||||
m_socket_name = runtime_dir;
|
||||
m_socket_name += "/rpcs3.sock";
|
||||
}
|
||||
|
||||
const int slot = Impl::get_port();
|
||||
if (slot != IPC_DEFAULT_SLOT)
|
||||
{
|
||||
fmt::append(m_socket_name, ".%d", slot);
|
||||
}
|
||||
|
||||
struct sockaddr_un server;
|
||||
m_socket_name = get_socket_path("rpcs3.sock", Impl::get_port(), IPC_DEFAULT_SLOT);
|
||||
|
||||
m_sock = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (m_sock < 0)
|
||||
@@ -587,23 +610,13 @@ namespace pine
|
||||
Impl::error("IPC: Cannot open socket! Shutting down...");
|
||||
return;
|
||||
}
|
||||
server.sun_family = AF_UNIX;
|
||||
strcpy(server.sun_path, m_socket_name.c_str());
|
||||
|
||||
// we unlink the socket so that when releasing this thread the socket gets
|
||||
// freed even if we didn't close correctly the loop
|
||||
unlink(m_socket_name.c_str());
|
||||
if (bind(m_sock, std::bit_cast<struct sockaddr*>(&server), sizeof(struct sockaddr_un)))
|
||||
{
|
||||
Impl::error("IPC: Error while binding to socket! Shutting down...");
|
||||
return;
|
||||
}
|
||||
const char* failure = bind_and_listen(m_sock, m_socket_name);
|
||||
#endif
|
||||
|
||||
// maximum queue of 4096 commands before refusing, approximated to the
|
||||
// nearest legal value. We do not use SOMAXCONN as windows have this idea
|
||||
// that a "reasonable" value is 5, which is not.
|
||||
listen(m_sock, 4096);
|
||||
if (failure)
|
||||
{
|
||||
Impl::error("IPC: Error while setting up socket (%s)! Shutting down...", failure);
|
||||
}
|
||||
}
|
||||
|
||||
pine_server(const pine_server&) = delete;
|
||||
|
||||
Vendored
+2
@@ -20,6 +20,8 @@ else()
|
||||
option(protobuf_DISABLE_RTTI "Remove runtime type information in the binaries" OFF)
|
||||
option(protobuf_FORCE_FETCH_DEPENDENCIES "Force all dependencies to be downloaded from GitHub. Local installations will be ignored." OFF)
|
||||
option(protobuf_LOCAL_DEPENDENCIES_ONLY "Prevent downloading any dependencies from GitHub. If this option is set, the dependency must be available locally as an installed package." OFF)
|
||||
option(protobuf_BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
|
||||
option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" OFF)
|
||||
|
||||
add_subdirectory(protobuf EXCLUDE_FROM_ALL)
|
||||
target_include_directories(3rdparty_protobuf SYSTEM INTERFACE protobuf/src)
|
||||
|
||||
+48
-2
@@ -41,12 +41,58 @@
|
||||
<CmakeReleaseCLI>call vsdevcmd.bat -arch=amd64
|
||||
if not exist "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" mkdir "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)"
|
||||
cd "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_STANDARD=20 -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -Dprotobuf_INSTALL=ON -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF -Dprotobuf_BUILD_EXAMPLES=OFF -Dprotobuf_BUILD_PROTOBUF_BINARIES=ON -Dprotobuf_BUILD_PROTOC_BINARIES=OFF -Dprotobuf_BUILD_LIBPROTOC=OFF -Dprotobuf_BUILD_LIBUPB=OFF -Dprotobuf_ALLOW_CCACHE=ON -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=ON "$(SolutionDir)3rdparty\protobuf\protobuf"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_CXX_STANDARD=20 ^
|
||||
-DCMAKE_BUILD_TYPE="Release" ^
|
||||
-DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
|
||||
-Dprotobuf_INSTALL=ON ^
|
||||
-Dprotobuf_BUILD_TESTS=OFF ^
|
||||
-Dprotobuf_BUILD_CONFORMANCE=OFF ^
|
||||
-Dprotobuf_BUILD_EXAMPLES=OFF ^
|
||||
-Dprotobuf_BUILD_PROTOBUF_BINARIES=ON ^
|
||||
-Dprotobuf_BUILD_PROTOC_BINARIES=OFF ^
|
||||
-Dprotobuf_BUILD_LIBPROTOC=OFF ^
|
||||
-Dprotobuf_BUILD_LIBUPB=OFF ^
|
||||
-Dprotobuf_ALLOW_CCACHE=ON ^
|
||||
-Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON ^
|
||||
-Dprotobuf_WITH_ZLIB=OFF ^
|
||||
-Dprotobuf_MSVC_STATIC_RUNTIME=ON ^
|
||||
"$(SolutionDir)3rdparty\protobuf\protobuf"
|
||||
</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>call vsdevcmd.bat -arch=amd64
|
||||
if not exist "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" mkdir "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)"
|
||||
cd "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)"
|
||||
cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_STANDARD=20 -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL -Dprotobuf_INSTALL=ON -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF -Dprotobuf_BUILD_EXAMPLES=OFF -Dprotobuf_BUILD_PROTOBUF_BINARIES=ON -Dprotobuf_BUILD_PROTOC_BINARIES=OFF -Dprotobuf_BUILD_LIBPROTOC=OFF -Dprotobuf_BUILD_LIBUPB=OFF -Dprotobuf_ALLOW_CCACHE=ON -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF "$(SolutionDir)3rdparty\protobuf\protobuf"
|
||||
if not defined CCACHE_LAUNCH_ARGS set CCACHE_LAUNCH_ARGS=
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER="cl.exe" ^
|
||||
-DCMAKE_C_COMPILER="cl.exe" ^
|
||||
%25CCACHE_LAUNCH_ARGS%25 ^
|
||||
-DCMAKE_CXX_STANDARD=20 ^
|
||||
-DCMAKE_BUILD_TYPE="Debug" ^
|
||||
-DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" ^
|
||||
-DCMAKE_SYSTEM_VERSION=10.0 ^
|
||||
-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) ^
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL ^
|
||||
-Dprotobuf_INSTALL=ON ^
|
||||
-Dprotobuf_BUILD_TESTS=OFF ^
|
||||
-Dprotobuf_BUILD_CONFORMANCE=OFF ^
|
||||
-Dprotobuf_BUILD_EXAMPLES=OFF ^
|
||||
-Dprotobuf_BUILD_PROTOBUF_BINARIES=ON ^
|
||||
-Dprotobuf_BUILD_PROTOC_BINARIES=OFF ^
|
||||
-Dprotobuf_BUILD_LIBPROTOC=OFF ^
|
||||
-Dprotobuf_BUILD_LIBUPB=OFF ^
|
||||
-Dprotobuf_ALLOW_CCACHE=ON ^
|
||||
-Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON ^
|
||||
-Dprotobuf_WITH_ZLIB=OFF ^
|
||||
-Dprotobuf_MSVC_STATIC_RUNTIME=OFF ^
|
||||
"$(SolutionDir)3rdparty\protobuf\protobuf"
|
||||
</CmakeDebugCLI>
|
||||
<CmakeCleanCLI>
|
||||
echo Cleaning..
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/pugixml updated: ee86beb30e...c8033ce9d0
Vendored
+10
-3
@@ -6,15 +6,22 @@ find_package(Qt6 ${QT_MIN_VER} CONFIG COMPONENTS Widgets Concurrent Multimedia M
|
||||
if(WIN32)
|
||||
target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets)
|
||||
else()
|
||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
||||
find_package(Qt6 ${QT_MIN_VER} COMPONENTS DBus Gui GuiPrivate)
|
||||
find_package(Qt6 ${QT_MIN_VER} COMPONENTS DBus Gui)
|
||||
if(Qt6_VERSION VERSION_GREATER_EQUAL "6.10.0")
|
||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
||||
find_package(Qt6 ${QT_MIN_VER} COMPONENTS GuiPrivate)
|
||||
endif()
|
||||
if(Qt6DBus_FOUND)
|
||||
target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::DBus Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets)
|
||||
target_compile_definitions(3rdparty_qt6 INTERFACE -DHAVE_QTDBUS)
|
||||
else()
|
||||
target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets)
|
||||
endif()
|
||||
target_link_libraries(3rdparty_qt6 INTERFACE Qt6::GuiPrivate)
|
||||
if(Qt6_VERSION VERSION_GREATER_EQUAL "6.10.0")
|
||||
target_link_libraries(3rdparty_qt6 INTERFACE Qt6::GuiPrivate)
|
||||
else()
|
||||
target_include_directories(3rdparty_qt6 INTERFACE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(Qt6Widgets_FOUND)
|
||||
|
||||
Vendored
+6
-3
@@ -119,7 +119,8 @@ echo -e "\n\nResult:\n"
|
||||
|
||||
# Find the max length of the paths (before '->')
|
||||
max_len=0
|
||||
while IFS='->' read -r left _; do
|
||||
while read -r line; do
|
||||
left="${line%%->*}"
|
||||
len=$(echo -n "$left" | wc -c)
|
||||
if (( len > max_len )); then
|
||||
max_len=$len
|
||||
@@ -127,8 +128,10 @@ while IFS='->' read -r left _; do
|
||||
done < "$resultfile"
|
||||
|
||||
# Print with padding so '->' lines up
|
||||
while IFS='->' read -r left right; do
|
||||
right=$(echo "$right" | sed 's/^[[:space:]]*>*[[:space:]]*//')
|
||||
while read -r line; do
|
||||
left="${line%%->*}"
|
||||
right="${line#*->}"
|
||||
right=$(echo "$right" | sed 's/^[[:space:]]*//')
|
||||
printf "%-${max_len}s -> %s\n" "$left" "$right"
|
||||
done < "$resultfile"
|
||||
|
||||
|
||||
Vendored
+16
-16
@@ -4,23 +4,23 @@ if(USE_SYSTEM_WOLFSSL)
|
||||
add_library(wolfssl INTERFACE)
|
||||
target_link_libraries(wolfssl INTERFACE PkgConfig::WolfSSL)
|
||||
else()
|
||||
option(WOLFSSL_TLS13 "Enable wolfSSL TLS v1.3 (default: enabled)" OFF)
|
||||
set(WOLFSSL_SHA3 ON CACHE STRING "Enable wolfSSL SHA-3 support (default: enabled on x86_64/aarch64)")
|
||||
set(WOLFSSL_SHAKE256 ON CACHE STRING "Enable wolfSSL SHAKE256 support (default: enabled on x86_64/aarch64)")
|
||||
option(WOLFSSL_BASE64_ENCODE "Enable Base64 encoding (default: enabled on x86_64)" OFF)
|
||||
option(WOLFSSL_DES3 "Enable DES3 (default: disabled)" ON)
|
||||
option(WOLFSSL_PWDBASED "Enable PWDBASED (default: disabled)" ON)
|
||||
option(WOLFSSL_FAST_MATH "Enable fast math ops (default: disabled)" ON)
|
||||
option(WOLFSSL_EXAMPLES "Enable examples (default: enabled)" OFF)
|
||||
option(WOLFSSL_CRYPT_TESTS "Enable Crypt Bench/Test (default: enabled)" OFF)
|
||||
option(WOLFSSL_ASYNC_THREADS "Enable Asynchronous Threading (default: enabled)" OFF)
|
||||
option(WOLFSSL_BUILD_OUT_OF_TREE "Don't generate files in the source tree (default: yes)" ON)
|
||||
option(WOLFSSL_SNI "Enable SNI (default: disabled)" ON)
|
||||
option(WOLFSSL_OPENSSLEXTRA "Enable extra OpenSSL API, size+ (default: disabled)" ON)
|
||||
option(WOLFSSL_HARDEN "Enable Hardened build, Enables Timing Resistance and Blinding (default: enabled)" OFF)
|
||||
option(WOLFSSL_ALT_CERT_CHAINS "Enable support for Alternate certification chains (default: disabled)" ON)
|
||||
set(WOLFSSL_TLS13 ON CACHE INTERNAL "" FORCE)
|
||||
set(WOLFSSL_SHA3 ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_SHAKE256 ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_BASE64_ENCODE OFF CACHE INTERNAL "")
|
||||
set(WOLFSSL_DES3 ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_PWDBASED ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_FAST_MATH ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_EXAMPLES OFF CACHE INTERNAL "")
|
||||
set(WOLFSSL_CRYPT_TESTS OFF CACHE INTERNAL "")
|
||||
set(WOLFSSL_ASYNC_THREADS OFF CACHE INTERNAL "")
|
||||
set(WOLFSSL_BUILD_OUT_OF_TREE ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_SNI ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_OPENSSLEXTRA ON CACHE INTERNAL "")
|
||||
set(WOLFSSL_ALT_CERT_CHAINS ON CACHE INTERNAL "")
|
||||
|
||||
add_subdirectory(wolfssl EXCLUDE_FROM_ALL)
|
||||
|
||||
target_compile_definitions(wolfssl PUBLIC WOLFSSL_DES_ECB HAVE_WRITE_DUP FP_MAX_BITS=8192 WOLFSSL_NO_OPTIONS_H)
|
||||
target_compile_definitions(wolfssl PUBLIC WOLFSSL_DES_ECB HAVE_WRITE_DUP FP_MAX_BITS=8192)
|
||||
target_compile_definitions(wolfssl INTERFACE WOLFSSL_USE_OPTIONS_H)
|
||||
endif()
|
||||
|
||||
@@ -46,6 +46,9 @@
|
||||
#define HAVE_AESGCM
|
||||
#define HAVE_SUPPORTED_CURVES
|
||||
#define HAVE_TLS_EXTENSIONS
|
||||
#define HAVE_HKDF
|
||||
#define WC_RSA_PSS
|
||||
#define WOLFSSL_TLS13
|
||||
#define HAVE_ECC
|
||||
#define ECC_SHAMIR
|
||||
#define ECC_TIMING_RESISTANT
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/wolfssl/wolfssl updated: b077c81eb6...3c5eead449
Vendored
+107
-5
@@ -71,15 +71,44 @@
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="wolfssl\src\bio.c" />
|
||||
<ClCompile Include="wolfssl\src\conf.c" />
|
||||
<ClCompile Include="wolfssl\src\crl.c" />
|
||||
<ClCompile Include="wolfssl\src\dtls.c" />
|
||||
<ClCompile Include="wolfssl\src\dtls13.c" />
|
||||
<ClCompile Include="wolfssl\src\internal.c" />
|
||||
<ClCompile Include="wolfssl\src\pk.c" />
|
||||
<ClCompile Include="wolfssl\src\pk_ec.c" />
|
||||
<ClCompile Include="wolfssl\src\pk_rsa.c" />
|
||||
<ClCompile Include="wolfssl\src\quic.c" />
|
||||
<ClCompile Include="wolfssl\src\sniffer.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_cert.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_crl_ocsp.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_dtls.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_ext.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_hs.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_pk.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_api_rw.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_asn1.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_bn.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_certman.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_crypto.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_ech.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_err.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_load.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_misc.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_p7p12.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_sess.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_sk.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl_tsp.c" />
|
||||
<ClCompile Include="wolfssl\src\wolfio.c" />
|
||||
<ClCompile Include="wolfssl\src\keys.c" />
|
||||
<ClCompile Include="wolfssl\src\ocsp.c" />
|
||||
<ClCompile Include="wolfssl\src\ssl.c" />
|
||||
<ClCompile Include="wolfssl\src\tls.c" />
|
||||
<ClCompile Include="wolfssl\src\tls13.c" />
|
||||
<ClCompile Include="wolfssl\src\x509.c" />
|
||||
<ClCompile Include="wolfssl\src\x509_str.c" />
|
||||
<ClCompile Include="wolfssl\wolfcrypt\src\aes.c" />
|
||||
<ClCompile Include="wolfssl\wolfcrypt\src\arc4.c" />
|
||||
<ClCompile Include="wolfssl\wolfcrypt\src\asn.c" />
|
||||
@@ -139,6 +168,77 @@
|
||||
<ItemGroup>
|
||||
<ClInclude Include="extra\win32\user_settings.h" />
|
||||
<ClInclude Include="wolfssl\resource.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\callbacks.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\certs_test.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\certs_test_sm.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\crl.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\error-ssl.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\internal.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\ocsp.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\aes.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\asn1.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\asn1t.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\bio.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\bn.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\buffer.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\camellia.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\cmac.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\cms.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\compat_types.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\conf.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\crypto.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\des.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\dh.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\dsa.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ec.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ec25519.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ec448.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ecdh.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ecdsa.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ed25519.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ed448.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\engine.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\err.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\evp.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\fips_rand.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\hmac.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\kdf.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\lhash.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\md4.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\md5.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\modes.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\objects.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\obj_mac.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ocsp.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\opensslconf.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\opensslv.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ossl_typ.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\pem.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\pkcs12.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\pkcs7.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\rand.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\rc4.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ripemd.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\rsa.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\safestack.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\sha.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\sha3.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\srp.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ssl.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ssl23.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\stack.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\tls1.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\txt_db.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\ui.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\x509.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\x509v3.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\openssl\x509_vfy.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\quic.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\sniffer.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\sniffer_error.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\ssl.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\test.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\version.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\aes.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\arc4.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\asn.h" />
|
||||
@@ -166,8 +266,6 @@
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ed448.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\error-crypt.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_kyber.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_lms.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_xmss.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\falcon.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\fe_448.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\fe_operations.h" />
|
||||
@@ -180,7 +278,6 @@
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\integer.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\kdf.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\kyber.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\lms.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\logging.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\md2.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\md4.h" />
|
||||
@@ -194,6 +291,7 @@
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\pkcs12.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\pkcs7.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\poly1305.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\puf.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\pwdbased.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\random.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\rc2.h" />
|
||||
@@ -212,7 +310,6 @@
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sm3.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sm4.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sp.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sphincs.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sp_int.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\srp.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\tfm.h" />
|
||||
@@ -221,12 +318,16 @@
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_encrypt.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_kyber.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_lms.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_mldsa.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_mlkem.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_pkcs11.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_port.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_she.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_slhdsa.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_xmss.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wolfevent.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wolfmath.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\xmss.h" />
|
||||
<ClInclude Include="wolfssl\wolfssl\wolfio.h" />
|
||||
<CustomBuild Include="wolfssl\wolfcrypt\src\aes_asm.asm">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild>
|
||||
@@ -247,6 +348,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</ResourceCompile>
|
||||
<ResourceCompile Include="wolfssl\wolfssl\sniffer_error.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="wolfssl\wolfssl\wolfcrypt\include.am" />
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/yaml-cpp/yaml-cpp updated: 05c44fcd18...51a5d623e3
Vendored
+2
-1
@@ -6,7 +6,8 @@ if (USE_SYSTEM_ZLIB)
|
||||
target_link_libraries(3rdparty_zlib INTERFACE ZLIB::ZLIB)
|
||||
target_compile_definitions(3rdparty_zlib INTERFACE -DZLIB_CONST=1)
|
||||
else()
|
||||
option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" OFF)
|
||||
option(ZLIB_BUILD_TESTING "Enable Zlib Examples as tests" OFF)
|
||||
option(ZLIB_BUILD_SHARED "Enable building zlib shared library" OFF)
|
||||
message(STATUS "RPCS3: Using builtin ZLIB")
|
||||
set(SKIP_INSTALL_ALL ON)
|
||||
add_subdirectory(zlib EXCLUDE_FROM_ALL)
|
||||
|
||||
+25
-16
@@ -20,27 +20,27 @@ The following tools are required to build RPCS3 on Windows 10 or later:
|
||||
with standalone **CMake** tool.
|
||||
|
||||
- [Python 3.6+](https://www.python.org/downloads/) (add to PATH)
|
||||
- [Qt 6.10.2](https://www.qt.io/download-qt-installer) In case you can't download from the official installer, you can use [Another Qt installer](https://github.com/miurahr/aqtinstall) (In that case you will need to manually add the "qtmultimedia" module when installing Qt)
|
||||
- [Vulkan SDK 1.3.268.0](https://vulkan.lunarg.com/sdk/home) (see "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html)) for now future SDKs don't work. You need precisely 1.3.268.0.
|
||||
- [Qt 6.12.0](https://www.qt.io/download-qt-installer) In case you can't download from the official installer, you can use [Another Qt installer](https://github.com/miurahr/aqtinstall) (In that case you will need to manually add the "qtmultimedia" module when installing Qt)
|
||||
- [Vulkan SDK 1.4.341.1](https://vulkan.lunarg.com/sdk/home) (see "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html)). Note that future SDKs may not work.
|
||||
|
||||
The `sln` solution available only on **Visual Studio** is the preferred building solution. It easily allows to build the **RPCS3** application in `Release` and `Debug` mode.
|
||||
|
||||
In order to build **RPCS3** with the `sln` solution (with **Visual Studio**), **Qt** libs need to be detected. To detect the libs:
|
||||
- add and set the `QTDIR` environment variable, e.g. `<QtInstallFolder>\6.10.2\msvc2022_64\`
|
||||
- add and set the `QTDIR` environment variable, e.g. `<QtInstallFolder>\6.12.0\msvc2022_64\`
|
||||
- or use the [Visual Studio Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2022)
|
||||
|
||||
**NOTE:** If you have issues with the **Visual Studio Qt Plugin**, you may want to uninstall it and install the [Legacy Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.LEGACYQtVisualStudioTools2022) instead.
|
||||
|
||||
In order to build **RPCS3** with the `CMake` solution (with both **Visual Studio** and standalone **CMake** tool):
|
||||
- add and set the `Qt6_ROOT` environment variable to the **Qt** libs path, e.g. `<QtInstallFolder>\6.10.2\msvc2022_64\`
|
||||
- add and set the `Qt6_ROOT` environment variable to the **Qt** libs path, e.g. `<QtInstallFolder>\6.12.0\msvc2022_64\`
|
||||
|
||||
### Linux
|
||||
|
||||
These are the essentials tools to build RPCS3 on Linux. Some of them can be installed through your favorite package manager:
|
||||
- Clang 17+ or GCC 13+
|
||||
- [CMake 3.28.0+](https://www.cmake.org/download/)
|
||||
- [Qt 6.10.2](https://www.qt.io/download-qt-installer)
|
||||
- [Vulkan SDK 1.3.268.0](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html)) for now future SDKs don't work. You need precisely 1.3.268.0.
|
||||
- [Qt 6.12.0](https://www.qt.io/download-qt-installer)
|
||||
- [Vulkan SDK 1.4.341.1](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html)). Note that future SDKs may not work.
|
||||
- [SDL3](https://github.com/libsdl-org/SDL/releases) (for the FAudio backend)
|
||||
|
||||
**If you have an NVIDIA GPU, you may need to install the libglvnd package.**
|
||||
@@ -72,14 +72,7 @@ You can either use `update-alternatives` to setup `gcc-13`/`g++-13` as your defa
|
||||
|
||||
##### Vulkan SDK
|
||||
|
||||
For Ubuntu systems, it is strongly recommended to use the PPA from [LunarG](https://packages.lunarg.com/) which will provide a compatible Vulkan SDK to compile RPCS3. If your Vulkan SDK is older, it can lead to compilation errors.
|
||||
```
|
||||
. /etc/os-release
|
||||
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
|
||||
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.3.268-$UBUNTU_CODENAME.list https://packages.lunarg.com/vulkan/1.3.268/lunarg-vulkan-1.3.268-$UBUNTU_CODENAME.list
|
||||
sudo apt update
|
||||
sudo apt install vulkan-sdk
|
||||
```
|
||||
For Ubuntu systems, it is strongly recommended to use the official [Linux Tarball Vulkan SDK](https://vulkan.lunarg.com/doc/view/1.4.341.0/linux/getting_started.html) which will provide a compatible Vulkan SDK to compile RPCS3. If your Vulkan SDK is older, it can lead to compilation errors.
|
||||
|
||||
##### CMake
|
||||
|
||||
@@ -123,7 +116,7 @@ Start **Visual Studio**, click on `Open a project or solution` and select the `r
|
||||
##### Configuring the Qt Plugin (if used)
|
||||
|
||||
1) go to `Extensions->Qt VS Tools->Qt Versions`
|
||||
2) add the path to your Qt installation with compiler e.g. `<QtInstallFolder>\6.10.2\msvc2022_64`, version will fill in automatically
|
||||
2) add the path to your Qt installation with compiler e.g. `<QtInstallFolder>\6.12.0\msvc2022_64`, version will fill in automatically
|
||||
3) go to `Extensions->Qt VS Tools->Options->Legacy Project Format`. (Only available in the **Legacy Qt Plugin**)
|
||||
4) set `Build: Run pre-build setup` to `true`. (Only available in the **Legacy Qt Plugin**)
|
||||
|
||||
@@ -132,7 +125,7 @@ Start **Visual Studio**, click on `Open a project or solution` and select the `r
|
||||
**NOTE:** The recommended build configuration is `Release`. (On older revisions: `Release - LLVM`)
|
||||
|
||||
To speed up the compilation time, you may want to download and extract to `<rpcs3_root>\build\lib_ext\<$(Configuration)>-x64` (e.g. `c:\rpcs3\build\lib_ext\Release-x64`; the path needs to be created) the following precompiled lib:
|
||||
- [LLVM libs](https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-19.1.7/llvmlibs_mt.7z)
|
||||
- [LLVM libs](https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-22.1.8/llvmlibs_mt.7z)
|
||||
|
||||
**NOTES:**
|
||||
- `<$(Configuration)>` can assume values `Release` or `Debug`.
|
||||
@@ -179,6 +172,22 @@ In case you preferred to install and use the standalone **CMake** tool:
|
||||
```
|
||||
3) once the build is completed, the **RPCS3** application will be available under the `<rpcs3_root>\build-msvc\bin` folder
|
||||
|
||||
#### Building with the PowerShell script
|
||||
|
||||
As an alternative to building through Visual Studio, run the PowerShell helper from the repository root:
|
||||
|
||||
```powershell
|
||||
.\scripts\win_build.ps1
|
||||
```
|
||||
|
||||
The script locates a supported Visual Studio installation, finds Qt from `Qt6_ROOT` or a standard `C:\Qt` installation, configures a Release Ninja Multi-Config build, and then builds it. Pass `-Cores <count>` to set the parallel build count; by default it uses all logical processors:
|
||||
|
||||
```powershell
|
||||
.\scripts\win_build.ps1 -Cores 8
|
||||
```
|
||||
|
||||
The resulting application is placed in `<rpcs3_root>\build\bin`.
|
||||
|
||||
### Linux
|
||||
|
||||
While still in the project root:
|
||||
|
||||
+7
-52
@@ -29,6 +29,7 @@ else()
|
||||
endif()
|
||||
|
||||
option(USE_NATIVE_INSTRUCTIONS "USE_NATIVE_INSTRUCTIONS makes rpcs3 compile with -march=native, which is useful for local builds, but not good for packages." ON)
|
||||
option(USE_ARM_LSE2 "Compile with LSE2 instructions" OFF)
|
||||
option(WITH_LLVM "Enable usage of LLVM library" ON)
|
||||
option(BUILD_LLVM "Build LLVM from git submodule" OFF)
|
||||
option(STATIC_LINK_LLVM "Link against LLVM statically. This will get set to ON if you build LLVM from the submodule." OFF)
|
||||
@@ -37,7 +38,7 @@ option(USE_LIBEVDEV "libevdev-based joystick support" ON)
|
||||
option(USE_DISCORD_RPC "Discord rich presence integration" OFF)
|
||||
option(USE_VULKAN "Vulkan render backend" ON)
|
||||
option(USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF)
|
||||
option(USE_SDL "Enables SDL input handler" OFF)
|
||||
option(USE_SDL "Enables SDL input handler" ON)
|
||||
option(USE_SYSTEM_CUBEB "Prefer system cubeb instead of the builtin one" OFF)
|
||||
option(USE_SYSTEM_CURL "Prefer system Curl instead of the prebuild one" ON)
|
||||
option(USE_SYSTEM_FAUDIO "Prefer system FAudio instead of the builtin one" OFF)
|
||||
@@ -63,6 +64,7 @@ option(USE_LTO "Use LTO for building" ON)
|
||||
option(BUILD_RPCS3_TESTS "Build RPCS3 unit tests." OFF)
|
||||
option(RUN_RPCS3_TESTS "Run RPCS3 unit tests. Requires BUILD_RPCS3_TESTS" OFF)
|
||||
option(USE_GAMEMODE "Choose whether to enable GameMode features or not." ON)
|
||||
option(BUNDLE_UDEV_RULES "Include udev rules on Linux/FreeBSD" OFF)
|
||||
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/buildfiles/cmake")
|
||||
|
||||
@@ -86,50 +88,7 @@ if(CMAKE_BUILD_TYPE MATCHES "Debug" AND NOT MSVC)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
option(USE_MSVC_STATIC_CRT "Use static MSVC C runtime" OFF)
|
||||
|
||||
# TODO([email protected])
|
||||
# DiscordRPC binary in 3rdparty is compiled /MT
|
||||
# So theoretically we should enable DiscordRPC in Release and static CRT build
|
||||
# since we might encounter some rumtime issues when more than one CRT version are presented.
|
||||
# https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-160#what-problems-exist-if-an-application-uses-more-than-one-crt-version
|
||||
# Add other DiscordRPC binaries(compiled with /MTd, /MD, /MDd) or compile it from source may address this issue.
|
||||
if(NOT IS_MULTI_CONFIG)
|
||||
if(NOT(CMAKE_BUILD_TYPE MATCHES "Release" AND USE_MSVC_STATIC_CRT))
|
||||
set(USE_DISCORD_RPC OFF CACHE BOOL "Discord RPC is only available in Release and static CRT build." FORCE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(USE_MSVC_STATIC_CRT)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
else()
|
||||
# though doc ( https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html )
|
||||
# says if that property is not set then CMake uses the default value MultiThreaded$<$<CONFIG:Debug>:Debug>DLL
|
||||
# to select a MSVC runtime library.
|
||||
# But yaml-cpp set /MT(d) if CMAKE_MSVC_RUNTIME_LIBRARY is undefined
|
||||
# So we have to define it explicitly
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
|
||||
endif()
|
||||
|
||||
# TODO([email protected])
|
||||
# offical QT uses dynamic CRT.
|
||||
# When building our lib with static CRT and debug build type
|
||||
# and linking with Qt with dynamic CRT and debug build,
|
||||
# error is encountered in runtime (which is expected).
|
||||
# But building our lib with static CRT and release build type,
|
||||
# and linking with Qt with dynamic CRT and release build seems to be working,
|
||||
# which is the same config with VS solution.
|
||||
# (though technically it might still have some hidden errors).
|
||||
# So we allow static CRT in both relase and debug build, but prompt warning in debug build.
|
||||
# For more info:
|
||||
# https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-160#what-problems-exist-if-an-application-uses-more-than-one-crt-version
|
||||
# https://wiki.qt.io/Technical_FAQ#Why_does_a_statically_built_Qt_use_the_dynamic_Visual_Studio_runtime_libraries_.3F_Do_I_need_to_deploy_those_with_my_application_.3F
|
||||
if(USE_MSVC_STATIC_CRT)
|
||||
if(IS_MULTI_CONFIG OR CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||
message(AUTHOR_WARNING "Debug build currently can not work with static CRT.")
|
||||
endif()
|
||||
endif()
|
||||
add_compile_options(/MP)
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:C,CXX>:/MP>")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
@@ -137,12 +96,12 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
endif()
|
||||
|
||||
if(APPLE AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
|
||||
include_directories(/opt/homebrew/include)
|
||||
link_directories(/opt/homebrew/lib)
|
||||
list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew")
|
||||
list(APPEND CMAKE_SYSTEM_PREFIX_PATH "/opt/homebrew")
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
add_compile_options(/wd4530 /utf-8) # C++ exception handler used, but unwind semantics are not enabled
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:C,CXX>:/wd4530;/utf-8>") # C++ exception handler used, but unwind semantics are not enabled
|
||||
endif()
|
||||
|
||||
add_subdirectory(3rdparty)
|
||||
@@ -161,10 +120,6 @@ if (NOT FOUND_LTO EQUAL -1)
|
||||
message(FATAL_ERROR "RPCS3 doesn't support building with LTO, use -DDISABLE_LTO=TRUE to force-disable it")
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
add_compile_options(-pthread)
|
||||
endif()
|
||||
|
||||
## Look for Gamemode if its installed on Linux
|
||||
if(LINUX)
|
||||
## User chooses whether to Enable GameMode features or not
|
||||
|
||||
@@ -9,7 +9,7 @@ The world's first free and open-source PlayStation 3 emulator/debugger, written
|
||||
You can find some basic information on our [**website**](https://rpcs3.net/). Game info is being populated on the [**Wiki**](https://wiki.rpcs3.net/).
|
||||
For discussion about this emulator, PS3 emulation, and game compatibility reports, please visit our [**forums**](https://forums.rpcs3.net) and our [**Discord server**](https://discord.gg/RPCS3).
|
||||
|
||||
[**Support Lead Developers Nekotekina and kd-11 on Patreon**](https://www.patreon.com/Nekotekina)
|
||||
[**Support the Lead Developers on Patreon**](https://rpcs3.net/patreon)
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -23,6 +23,16 @@ If you want to contribute as a developer, please take a look at the following pa
|
||||
|
||||
You should also contact any of the developers in the forums or in the Discord server to learn more about the current state of the emulator.
|
||||
|
||||
### AI Use
|
||||
|
||||
Use of AI tools for research and reverse engineering purposes is permitted. However, contributors are expected to fully own and understand all code they submit. Any communication with the team — including code, code comments, and GitHub comments — must come from the human contributor, not an AI agent acting autonomously.
|
||||
|
||||
We have unfortunately seen a rise in untested and unverified AI-generated slop being submitted to this project. This wastes maintainer time and, in worse cases, such changes get merged and break functionality for all users. Repeated violations will result in a ban from the repository. Please be respectful of everyone's time.
|
||||
|
||||
**Pull requests opened by AI agents or automated tools must include a disclosure in the PR description** stating the scope of AI involvement — which parts were AI-generated and what human testing or review was performed prior to submission. PRs that omit this disclosure may be closed without review.
|
||||
|
||||
If you are unsure about your work, open a discussion issue to talk it through with the team, or reach out to a maintainer on [Discord](https://discord.gg/RPCS3).
|
||||
|
||||
## Building
|
||||
|
||||
See [BUILDING.md](BUILDING.md) for more information about how to setup an environment to build RPCS3.
|
||||
|
||||
+162
-52
@@ -2,6 +2,7 @@
|
||||
#include "Config.h"
|
||||
#include "util/types.hpp"
|
||||
#include "util/yaml.hpp"
|
||||
#include "util/cctype.hpp"
|
||||
|
||||
#include <charconv>
|
||||
|
||||
@@ -40,7 +41,7 @@ namespace cfg
|
||||
owner->m_nodes.emplace_back(this);
|
||||
}
|
||||
|
||||
bool _base::from_string(std::string_view, bool)
|
||||
bool _base::from_string(std::string_view /*value*/, bool /*dynamic*/)
|
||||
{
|
||||
cfg_log.fatal("cfg::_base::from_string() purecall");
|
||||
return false;
|
||||
@@ -68,7 +69,7 @@ namespace cfg
|
||||
|
||||
// Incrementally load config entries from YAML::Node.
|
||||
// The config value is preserved if the corresponding YAML node doesn't exist.
|
||||
static void decode(const YAML::Node& data, class _base& rhs, bool dynamic = false);
|
||||
[[nodiscard]] static bool decode(const YAML::Node& data, class _base& rhs, bool dynamic, bool strict);
|
||||
}
|
||||
|
||||
std::vector<std::string> cfg::make_int_range(s64 min, s64 max)
|
||||
@@ -76,11 +77,11 @@ std::vector<std::string> cfg::make_int_range(s64 min, s64 max)
|
||||
return {std::to_string(min), std::to_string(max)};
|
||||
}
|
||||
|
||||
bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max)
|
||||
bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max, std::string_view name)
|
||||
{
|
||||
if (value.empty())
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_int64(): called with an empty string");
|
||||
if (out) cfg_log.error("cfg::try_to_int64('%s'): called with an empty string", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -107,7 +108,7 @@ bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max)
|
||||
|
||||
if (ret.ec != std::errc() || ret.ptr != end || (start[0] == '-' && sign < 0))
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_int64('%s'): invalid integer", value);
|
||||
if (out) cfg_log.error("cfg::try_to_int64('%s', '%s'): invalid integer", value, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -115,7 +116,7 @@ bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max)
|
||||
|
||||
if (result < min || result > max)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_int64('%s'): out of bounds (val=%d, min=%d, max=%d)", value, result, min, max);
|
||||
if (out) cfg_log.error("cfg::try_to_int64('%s', '%s'): out of bounds (val=%d, min=%d, max=%d)", value, name, result, min, max);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -128,11 +129,11 @@ std::vector<std::string> cfg::make_uint_range(u64 min, u64 max)
|
||||
return {std::to_string(min), std::to_string(max)};
|
||||
}
|
||||
|
||||
bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max)
|
||||
bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max, std::string_view name)
|
||||
{
|
||||
if (value.empty())
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_uint64(): called with an empty string");
|
||||
if (out) cfg_log.error("cfg::try_to_uint64('%s'): called with an empty string", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -152,13 +153,13 @@ bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max)
|
||||
|
||||
if (ret.ec != std::errc() || ret.ptr != end)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_uint64('%s'): invalid integer", value);
|
||||
if (out) cfg_log.error("cfg::try_to_uint64('%s', '%s'): invalid integer", value, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (result < min || result > max)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_uint64('%s'): out of bounds (val=%u, min=%u, max=%u)", value, result, min, max);
|
||||
if (out) cfg_log.error("cfg::try_to_uint64('%s', '%s'): out of bounds (val=%u, min=%u, max=%u)", value, name, result, min, max);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -166,11 +167,11 @@ bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool try_to_uint128(u128* out, std::string_view value)
|
||||
bool try_to_uint128(u128* out, std::string_view value, std::string_view name)
|
||||
{
|
||||
if (value.empty())
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_uint128(): called with an empty string");
|
||||
if (out) cfg_log.error("cfg::try_to_uint128('%s'): called with an empty string", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -193,7 +194,7 @@ bool try_to_uint128(u128* out, std::string_view value)
|
||||
|
||||
if (ret.ec != std::errc() || ret.ptr != end)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_uint128('%s'): invalid integer", value);
|
||||
if (out) cfg_log.error("cfg::try_to_uint128('%s', '%s'): invalid integer", value, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -207,7 +208,7 @@ bool try_to_uint128(u128* out, std::string_view value)
|
||||
|
||||
if (ret.ec != std::errc() || ret.ptr != start_low64)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_uint128('%s'): invalid integer", value);
|
||||
if (out) cfg_log.error("cfg::try_to_uint128('%s', '%s'): invalid integer", value, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -220,11 +221,11 @@ std::vector<std::string> cfg::make_float_range(f64 min, f64 max)
|
||||
return {std::to_string(min), std::to_string(max)};
|
||||
}
|
||||
|
||||
bool try_to_float(f64* out, std::string_view value, f64 min, f64 max)
|
||||
bool try_to_float(f64* out, std::string_view value, f64 min, f64 max, std::string_view name)
|
||||
{
|
||||
if (value.empty())
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_float(): called with an empty string");
|
||||
if (out) cfg_log.error("cfg::try_to_float('%s'): called with an empty string", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -237,13 +238,13 @@ bool try_to_float(f64* out, std::string_view value, f64 min, f64 max)
|
||||
|
||||
if (end_check != str.data() + str.size())
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_float('%s'): invalid float", value);
|
||||
if (out) cfg_log.error("cfg::try_to_float('%s', '%s'): invalid float", value, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (result < min || result > max)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_float('%s'): out of bounds (val=%f, min=%f, max=%f)", value, result, min, max);
|
||||
if (out) cfg_log.error("cfg::try_to_float('%s', '%s'): out of bounds (val=%f, min=%f, max=%f)", value, name, result, min, max);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -251,12 +252,8 @@ bool try_to_float(f64* out, std::string_view value, f64 min, f64 max)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool try_to_string(std::string* out, const f64& value)
|
||||
bool try_to_string(std::string* out, f64 value, std::string_view name)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
if (out) *out = std::to_string(value);
|
||||
return true;
|
||||
#else
|
||||
std::array<char, 32> str{};
|
||||
|
||||
if (auto [ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), value, std::chars_format::fixed); ec == std::errc())
|
||||
@@ -266,14 +263,15 @@ bool try_to_string(std::string* out, const f64& value)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_string(): could not convert value '%f' to string. error='%s'", value, std::make_error_code(ec).message());
|
||||
if (out) cfg_log.error("cfg::try_to_string('%s'): could not convert value '%f' to string. error='%s'", name, value, std::make_error_code(ec).message());
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view value)
|
||||
bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view value, std::string_view name)
|
||||
{
|
||||
ensure(func);
|
||||
|
||||
u64 max = umax;
|
||||
|
||||
for (u64 i = 0;; i++)
|
||||
@@ -302,7 +300,7 @@ bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) f
|
||||
const char* end = start + value.size();
|
||||
int base = 10;
|
||||
|
||||
if (start[0] == '0' && (start[1] == 'x' || start[1] == 'X'))
|
||||
if (value.size() >= 2 && start[0] == '0' && (start[1] == 'x' || start[1] == 'X'))
|
||||
{
|
||||
// Limited hex support
|
||||
base = 16;
|
||||
@@ -313,13 +311,13 @@ bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) f
|
||||
|
||||
if (ret.ec != std::errc() || ret.ptr != end)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_enum_value('%s'): invalid enum or integer", value);
|
||||
if (out) cfg_log.error("cfg::try_to_enum_value('%s', '%s'): invalid enum or integer", value, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (result > max)
|
||||
{
|
||||
if (out) cfg_log.error("cfg::try_to_enum_value('%s'): out of bounds(val=%u, min=0, max=%u)", value, result, max);
|
||||
if (out) cfg_log.error("cfg::try_to_enum_value('%s', '%s'): out of bounds(val=%u, min=0, max=%u)", value, name, result, max);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -362,6 +360,27 @@ std::vector<std::string> cfg::try_to_enum_list(decltype(&fmt_class_string<int>::
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t cfg::try_to_enum_size(decltype(&fmt_class_string<int>::format) func)
|
||||
{
|
||||
size_t result = 0;
|
||||
for (u64 i = 0;; i++)
|
||||
{
|
||||
std::string var;
|
||||
func(var, i);
|
||||
|
||||
std::string hex;
|
||||
fmt_class_string<u64>::format(hex, i);
|
||||
if (var == hex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
result++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
|
||||
{
|
||||
switch (rhs.get_type())
|
||||
@@ -416,7 +435,7 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
|
||||
out << YAML::BeginMap;
|
||||
for (const auto& np : static_cast<const log_entry&>(rhs).get_map())
|
||||
{
|
||||
if (np.second == logs::level::notice) continue;
|
||||
if (np.second == logs::level::_default) continue;
|
||||
out << YAML::Key << np.first;
|
||||
out << YAML::Value << fmt::format("%s", np.second);
|
||||
}
|
||||
@@ -447,37 +466,50 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
|
||||
}
|
||||
}
|
||||
|
||||
void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool strict)
|
||||
{
|
||||
if (dynamic && !rhs.get_is_dynamic())
|
||||
{
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (rhs.get_type())
|
||||
{
|
||||
case type::node:
|
||||
{
|
||||
if (data.IsScalar() || data.IsSequence())
|
||||
if (!data.IsMap())
|
||||
{
|
||||
return; // ???
|
||||
cfg_log.error("node node is not a map");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool success = true;
|
||||
|
||||
for (const auto& pair : data)
|
||||
{
|
||||
if (!pair.first.IsScalar()) continue;
|
||||
|
||||
// Find the key among existing nodes
|
||||
for (const auto& node : static_cast<node&>(rhs).get_nodes())
|
||||
const auto& nodes = static_cast<node&>(rhs).get_nodes();
|
||||
const auto it = std::find_if(nodes.cbegin(), nodes.cend(), [&pair](const auto& node) { return ensure(node)->get_name() == pair.first.Scalar(); });
|
||||
|
||||
if (it == nodes.cend())
|
||||
{
|
||||
if (node->get_name() == pair.first.Scalar())
|
||||
if (strict)
|
||||
{
|
||||
decode(pair.second, *node, dynamic);
|
||||
cfg_log.error("Unknown key found: '%s'", pair.first.Scalar());
|
||||
success = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!decode(pair.second, *ensure(*it), dynamic, strict) && strict)
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
return success;
|
||||
}
|
||||
case type::set:
|
||||
{
|
||||
@@ -485,7 +517,10 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
|
||||
if (YAML::convert<decltype(values)>::decode(data, values))
|
||||
{
|
||||
rhs.from_list(std::move(values));
|
||||
if (!rhs.from_list(std::move(values)) && strict)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -495,7 +530,8 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
{
|
||||
if (!data.IsMap())
|
||||
{
|
||||
return;
|
||||
cfg_log.error("map node is not a map");
|
||||
return false;
|
||||
}
|
||||
|
||||
map_of_type<std::string> values;
|
||||
@@ -512,22 +548,36 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
}
|
||||
case type::log:
|
||||
{
|
||||
if (data.IsScalar() || data.IsSequence())
|
||||
if (!data.IsMap())
|
||||
{
|
||||
return; // ???
|
||||
cfg_log.error("log node is not a map");
|
||||
return false;
|
||||
}
|
||||
|
||||
map_of_type<logs::level> values;
|
||||
|
||||
for (const auto& pair : data)
|
||||
{
|
||||
if (!pair.first.IsScalar() || !pair.second.IsScalar()) continue;
|
||||
if (!pair.first.IsScalar() || !pair.second.IsScalar())
|
||||
{
|
||||
if (strict)
|
||||
{
|
||||
if (!pair.first.IsScalar())
|
||||
cfg_log.error("Key in map is not a scalar");
|
||||
else
|
||||
cfg_log.error("Value in map is not a scalar. key='%s'", pair.first.Scalar());
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
u64 value;
|
||||
if (cfg::try_to_enum_value(&value, &fmt_class_string<logs::level>::format, pair.second.Scalar()))
|
||||
if (!cfg::try_to_enum_value(&value, &fmt_class_string<logs::level>::format, pair.second.Scalar(), pair.first.Scalar()) && strict)
|
||||
{
|
||||
values.emplace(pair.first.Scalar(), static_cast<logs::level>(static_cast<int>(value)));
|
||||
return false;
|
||||
}
|
||||
|
||||
values.emplace(pair.first.Scalar(), static_cast<logs::level>(static_cast<int>(value)));
|
||||
}
|
||||
|
||||
static_cast<log_entry&>(rhs).set_map(std::move(values));
|
||||
@@ -537,20 +587,43 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
{
|
||||
if (!data.IsMap())
|
||||
{
|
||||
return; // ???
|
||||
cfg_log.error("device node is not a map");
|
||||
return false;
|
||||
}
|
||||
|
||||
map_of_type<device_info> values;
|
||||
|
||||
for (const auto& pair : data)
|
||||
{
|
||||
if (!pair.first.IsScalar() || !pair.second.IsMap()) continue;
|
||||
if (!pair.first.IsScalar() || !pair.second.IsMap())
|
||||
{
|
||||
if (strict)
|
||||
{
|
||||
if (!pair.first.IsScalar())
|
||||
cfg_log.error("Key in device map is not a scalar");
|
||||
else
|
||||
cfg_log.error("Value in device map is not a map. key='%s'", pair.first.Scalar());
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
device_info info{};
|
||||
|
||||
for (const auto& key_value : pair.second)
|
||||
{
|
||||
if (!key_value.first.IsScalar() || !key_value.second.IsScalar()) continue;
|
||||
if (!key_value.first.IsScalar() || !key_value.second.IsScalar())
|
||||
{
|
||||
if (strict)
|
||||
{
|
||||
if (!key_value.first.IsScalar())
|
||||
cfg_log.error("Key in device info map is not a scalar");
|
||||
else
|
||||
cfg_log.error("Value in device map is not a scalar. key='%s'", key_value.first.Scalar());
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (key_value.first.Scalar() == "Path")
|
||||
info.path = key_value.second.Scalar();
|
||||
@@ -577,12 +650,17 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
|
||||
if (YAML::convert<std::string>::decode(data, value))
|
||||
{
|
||||
rhs.from_string(value, dynamic);
|
||||
if (!rhs.from_string(value, dynamic) && strict)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
break; // ???
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string cfg::node::to_string() const
|
||||
@@ -599,8 +677,7 @@ bool cfg::node::from_string(std::string_view value, bool dynamic)
|
||||
|
||||
if (error.empty())
|
||||
{
|
||||
cfg::decode(result, *this, dynamic);
|
||||
return true;
|
||||
return cfg::decode(result, *this, dynamic, false);
|
||||
}
|
||||
|
||||
cfg_log.error("Failed to load node: %s", error);
|
||||
@@ -623,6 +700,39 @@ void cfg::node::restore_defaults()
|
||||
}
|
||||
}
|
||||
|
||||
bool cfg::node::validate(std::string_view value)
|
||||
{
|
||||
auto [result, error] = yaml_load(std::string(value));
|
||||
|
||||
if (error.empty())
|
||||
{
|
||||
return cfg::decode(result, *this, false, true);
|
||||
}
|
||||
|
||||
cfg_log.error("Failed to load node: %s", error);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cfg::_bool::from_string(std::string_view value, bool /*dynamic*/)
|
||||
{
|
||||
if (value.size() != 4 && value.size() != 5)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
char copy[5];
|
||||
std::transform(value.begin(), value.end(), std::begin(copy), utils::tolower<char>);
|
||||
|
||||
if (value.size() == 5 && std::string_view{copy, 5} == "false")
|
||||
m_value = false;
|
||||
else if (value.size() == 4 && std::string_view{copy, 4} == "true")
|
||||
m_value = true;
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string cfg::map_entry::get_value(std::string_view key)
|
||||
{
|
||||
if (auto it = m_map.find(key); it != m_map.end())
|
||||
@@ -668,7 +778,7 @@ void cfg::log_entry::from_default()
|
||||
|
||||
std::pair<u16, u16> cfg::device_info::get_usb_ids() const
|
||||
{
|
||||
auto string_to_hex = [](const std::string& str) -> u16
|
||||
auto string_to_hex = [](std::string_view str) -> u16
|
||||
{
|
||||
u16 value = 0x0000;
|
||||
if (!str.empty() && std::from_chars(str.data(), str.data() + str.size(), value, 16).ec != std::errc{})
|
||||
|
||||
+34
-31
@@ -25,11 +25,14 @@ namespace cfg
|
||||
std::vector<std::string> make_float_range(f64 min, f64 max);
|
||||
|
||||
// Internal hack
|
||||
bool try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view);
|
||||
bool try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view value, std::string_view name = {});
|
||||
|
||||
// Internal hack
|
||||
std::vector<std::string> try_to_enum_list(decltype(&fmt_class_string<int>::format) func);
|
||||
|
||||
// Internal hack
|
||||
size_t try_to_enum_size(decltype(&fmt_class_string<int>::format) func);
|
||||
|
||||
// Config tree entry type.
|
||||
enum class type : unsigned
|
||||
{
|
||||
@@ -107,7 +110,7 @@ namespace cfg
|
||||
}
|
||||
|
||||
// Try to convert from string (optional)
|
||||
virtual bool from_string(std::string_view, bool /*dynamic*/ = false);
|
||||
virtual bool from_string(std::string_view value, bool dynamic = false);
|
||||
|
||||
// Get string list (optional)
|
||||
virtual std::vector<std::string> to_list() const
|
||||
@@ -158,6 +161,9 @@ namespace cfg
|
||||
|
||||
// Restore default members
|
||||
void restore_defaults() override;
|
||||
|
||||
// Try to convert from string and validate
|
||||
bool validate(std::string_view value);
|
||||
};
|
||||
|
||||
class _bool final : public _base
|
||||
@@ -206,25 +212,7 @@ namespace cfg
|
||||
return def ? "true" : "false";
|
||||
}
|
||||
|
||||
bool from_string(std::string_view value, bool /*dynamic*/ = false) override
|
||||
{
|
||||
if (value.size() != 4 && value.size() != 5)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
char copy[5];
|
||||
std::transform(value.begin(), value.end(), std::begin(copy), ::tolower);
|
||||
|
||||
if (value.size() == 5 && std::string_view{copy, 5} == "false")
|
||||
m_value = false;
|
||||
else if (value.size() == 4 && std::string_view{copy, 4} == "true")
|
||||
m_value = true;
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
bool from_string(std::string_view value, bool dynamic = false) override;
|
||||
|
||||
void set(const bool& value)
|
||||
{
|
||||
@@ -298,7 +286,7 @@ namespace cfg
|
||||
{
|
||||
u64 result;
|
||||
|
||||
if (try_to_enum_value(&result, &fmt_class_string<T>::format, value))
|
||||
if (try_to_enum_value(&result, &fmt_class_string<T>::format, value, m_name))
|
||||
{
|
||||
// No narrowing check, it's hard to do right there
|
||||
m_value = static_cast<T>(static_cast<std::underlying_type_t<T>>(result));
|
||||
@@ -312,6 +300,11 @@ namespace cfg
|
||||
{
|
||||
return try_to_enum_list(&fmt_class_string<T>::format);
|
||||
}
|
||||
|
||||
size_t size() const
|
||||
{
|
||||
return try_to_enum_size(&fmt_class_string<T>::format);
|
||||
}
|
||||
};
|
||||
|
||||
// Signed 32/64-bit integer entry with custom Min/Max range.
|
||||
@@ -374,7 +367,7 @@ namespace cfg
|
||||
bool from_string(std::string_view value, bool /*dynamic*/ = false) override
|
||||
{
|
||||
s64 result;
|
||||
if (try_to_int64(&result, value, Min, Max))
|
||||
if (try_to_int64(&result, value, Min, Max, m_name))
|
||||
{
|
||||
m_value = static_cast<int_type>(result);
|
||||
return true;
|
||||
@@ -385,7 +378,7 @@ namespace cfg
|
||||
|
||||
void set(const s64& value)
|
||||
{
|
||||
ensure(value >= Min && value <= Max);
|
||||
if (value < Min || value > Max) fmt::throw_exception("'%s': value %d out of bounds (min=%d, max=%d)", m_name, value, Min, Max);
|
||||
m_value = static_cast<int_type>(value);
|
||||
}
|
||||
|
||||
@@ -443,7 +436,7 @@ namespace cfg
|
||||
std::string to_string() const override
|
||||
{
|
||||
std::string result;
|
||||
if (try_to_string(&result, m_value))
|
||||
if (try_to_string(&result, m_value, m_name))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
@@ -454,7 +447,7 @@ namespace cfg
|
||||
std::string def_to_string() const override
|
||||
{
|
||||
std::string result;
|
||||
if (try_to_string(&result, def))
|
||||
if (try_to_string(&result, def, m_name))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
@@ -465,7 +458,7 @@ namespace cfg
|
||||
bool from_string(std::string_view value, bool /*dynamic*/ = false) override
|
||||
{
|
||||
f64 result;
|
||||
if (try_to_float(&result, value, Min, Max))
|
||||
if (try_to_float(&result, value, Min, Max, m_name))
|
||||
{
|
||||
m_value = static_cast<float_type>(result);
|
||||
return true;
|
||||
@@ -476,7 +469,7 @@ namespace cfg
|
||||
|
||||
void set(const f64& value)
|
||||
{
|
||||
ensure(value >= Min && value <= Max);
|
||||
if (value < Min || value > Max) fmt::throw_exception("'%s': value %d out of bounds (min=%d, max=%d)", m_name, value, Min, Max);
|
||||
m_value = static_cast<float_type>(value);
|
||||
}
|
||||
|
||||
@@ -552,7 +545,7 @@ namespace cfg
|
||||
bool from_string(std::string_view value, bool /*dynamic*/ = false) override
|
||||
{
|
||||
u64 result;
|
||||
if (try_to_uint64(&result, value, Min, Max))
|
||||
if (try_to_uint64(&result, value, Min, Max, m_name))
|
||||
{
|
||||
m_value = static_cast<int_type>(result);
|
||||
return true;
|
||||
@@ -563,7 +556,7 @@ namespace cfg
|
||||
|
||||
void set(const u64& value)
|
||||
{
|
||||
ensure(value >= Min && value <= Max);
|
||||
if (value < Min || value > Max) fmt::throw_exception("'%s': value %d out of bounds (min=%d, max=%d)", m_name, value, Min, Max);
|
||||
m_value = static_cast<int_type>(value);
|
||||
}
|
||||
|
||||
@@ -638,7 +631,7 @@ namespace cfg
|
||||
bool from_string(std::string_view value, bool /*dynamic*/ = false) override
|
||||
{
|
||||
u128 result;
|
||||
if (try_to_uint128(&result, value))
|
||||
if (try_to_uint128(&result, value, m_name))
|
||||
{
|
||||
m_value = result;
|
||||
return true;
|
||||
@@ -696,6 +689,11 @@ namespace cfg
|
||||
return *m_value.load().get();
|
||||
}
|
||||
|
||||
std::string get() const
|
||||
{
|
||||
return *m_value.load().get();
|
||||
}
|
||||
|
||||
std::string def_to_string() const override
|
||||
{
|
||||
return def;
|
||||
@@ -706,6 +704,11 @@ namespace cfg
|
||||
m_value = std::string(value);
|
||||
return true;
|
||||
}
|
||||
|
||||
void set(std::string_view value)
|
||||
{
|
||||
m_value = std::string(value);
|
||||
}
|
||||
};
|
||||
|
||||
// Simple set entry (TODO: template for various types)
|
||||
|
||||
+410
-17
@@ -26,6 +26,7 @@ std::string g_android_cache_dir;
|
||||
|
||||
#include <cwchar>
|
||||
#include <Windows.h>
|
||||
#include <winioctl.h>
|
||||
|
||||
static std::unique_ptr<wchar_t[]> to_wchar(std::string_view source)
|
||||
{
|
||||
@@ -38,6 +39,17 @@ static std::unique_ptr<wchar_t[]> to_wchar(std::string_view source)
|
||||
// Buffer for max possible output length
|
||||
std::unique_ptr<wchar_t[]> buffer(new wchar_t[buf_size + 8 + 32768]);
|
||||
|
||||
// If path points to an optical raw device, copy it AS IS
|
||||
if (fs::is_optical_raw_device(std::string(source)))
|
||||
{
|
||||
ensure(MultiByteToWideChar(CP_UTF8, 0, source.data(), size, buffer.get() + 32768, size)); // "to_wchar"
|
||||
|
||||
// Canonicalize wide path (replace '/', ".", "..", \\ repetitions, etc)
|
||||
ensure(GetFullPathNameW(buffer.get() + 32768, 32768, buffer.get(), nullptr) - 1 < 32768 - 1); // "to_wchar"
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Prepend wide path prefix (4 characters)
|
||||
std::memcpy(buffer.get() + 32768, L"\\\\\?\\", 4 * sizeof(wchar_t));
|
||||
|
||||
@@ -136,6 +148,7 @@ static fs::error to_error(DWORD e)
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
#include <libgen.h>
|
||||
@@ -147,12 +160,19 @@ static fs::error to_error(DWORD e)
|
||||
#include <copyfile.h>
|
||||
#include <mach-o/dyld.h>
|
||||
#include <limits.h>
|
||||
#include <sys/disk.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#elif defined(__linux__) || defined(__sun)
|
||||
#include <sys/sendfile.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#include <linux/fs.h>
|
||||
#else
|
||||
#include <fstream>
|
||||
#include <sys/disk.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
|
||||
static fs::error to_error(int e)
|
||||
@@ -166,12 +186,103 @@ static fs::error to_error(int e)
|
||||
case ENOTEMPTY: return fs::error::notempty;
|
||||
case EROFS: return fs::error::readonly;
|
||||
case EISDIR: return fs::error::isdir;
|
||||
case ENOTDIR: return fs::error::notdir;
|
||||
case ENOSPC: return fs::error::nospace;
|
||||
case EXDEV: return fs::error::xdev;
|
||||
default: return fs::error::unknown;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__linux__)
|
||||
// Major numbers of the block devices an optical disc can be accessed through (see "Documentation/admin-guide/devices.txt")
|
||||
constexpr unsigned int s_scsi_cdrom_major = 11; // Optical drive (e.g. "/dev/sr0")
|
||||
constexpr unsigned int s_loopback_major = 7; // Disc image attached with "mount"/"losetup" (e.g. "/dev/loop0")
|
||||
#endif
|
||||
|
||||
// Check whether the provided device node is an optical drive (e.g. a Blu-Ray Disc drive) or a mounted disc image
|
||||
static bool is_optical_device_node(const struct ::stat& file_info)
|
||||
{
|
||||
#if defined(__linux__)
|
||||
// An optical drive is exposed as a block device using the SCSI CD-ROM major number (e.g. "/dev/sr0", "/dev/scd0" or the "/dev/cdrom" link).
|
||||
// A disc image attached through "mount -o loop" (or "losetup") is exposed as a loopback block device instead (e.g. "/dev/loop0"):
|
||||
// it is the counterpart of an ISO file mounted on Windows, where the resulting virtual drive is reported as DRIVE_CDROM
|
||||
if (!S_ISBLK(file_info.st_mode))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const unsigned int device_major = major(file_info.st_rdev);
|
||||
|
||||
return device_major == s_scsi_cdrom_major || device_major == s_loopback_major;
|
||||
#elif defined(__APPLE__)
|
||||
// The raw (unbuffered) device is a character device (e.g. "/dev/rdisk2").
|
||||
// NOTE: there is no cheap way to tell an optical drive from any other raw disk here, so any raw disk node is accepted
|
||||
return S_ISCHR(file_info.st_mode);
|
||||
#else
|
||||
// On the BSDs an optical drive is a character device (e.g. "/dev/cd0")
|
||||
return S_ISCHR(file_info.st_mode) || S_ISBLK(file_info.st_mode);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Check whether the path is the root of a mounted filesystem (e.g. the mount point of a disc): "st_dev" changes when crossing a mount point
|
||||
[[maybe_unused]] static bool is_mount_point(const std::string& path, const struct ::stat& file_info)
|
||||
{
|
||||
// A file is never a mount point: discard it without any syscall (the "stat()" below would fail with ENOTDIR anyway)
|
||||
if (!S_ISDIR(file_info.st_mode))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ::stat parent_info;
|
||||
|
||||
if (::stat((path + "/..").c_str(), &parent_info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent_info.st_dev != file_info.st_dev;
|
||||
}
|
||||
|
||||
// Retrieve the size of a raw device: "fstat()" reports no size (0) on such a device
|
||||
static u64 get_raw_device_size(int fd)
|
||||
{
|
||||
#if defined(__linux__)
|
||||
if (u64 size = 0; ::ioctl(fd, BLKGETSIZE64, &size) == 0)
|
||||
{
|
||||
return size;
|
||||
}
|
||||
#elif defined(__APPLE__)
|
||||
u64 block_count = 0;
|
||||
u32 block_size = 0;
|
||||
|
||||
if (::ioctl(fd, DKIOCGETBLOCKCOUNT, &block_count) == 0 && ::ioctl(fd, DKIOCGETBLOCKSIZE, &block_size) == 0)
|
||||
{
|
||||
if (block_size && block_count > u64{umax} / block_size)
|
||||
{
|
||||
fmt::throw_exception("Raw device size overflow (block count: 0x%x, block size: 0x%x)", block_count, block_size);
|
||||
}
|
||||
|
||||
return block_count * block_size;
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
if (off_t media_size = 0; ::ioctl(fd, DIOCGMEDIASIZE, &media_size) == 0)
|
||||
{
|
||||
return static_cast<u64>(media_size);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Fallback: seek to the end of the device (restoring the current position afterwards)
|
||||
const off_t old_pos = ::lseek(fd, 0, SEEK_CUR);
|
||||
const off_t end_pos = ::lseek(fd, 0, SEEK_END);
|
||||
|
||||
if (old_pos >= 0)
|
||||
{
|
||||
::lseek(fd, old_pos, SEEK_SET);
|
||||
}
|
||||
|
||||
return end_pos > 0 ? static_cast<u64>(end_pos) : 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static std::string path_append(std::string_view path, std::string_view more)
|
||||
@@ -399,11 +510,12 @@ namespace fs
|
||||
class windows_file final : public file_base
|
||||
{
|
||||
HANDLE m_handle;
|
||||
u64 m_raw_device_size; // Size of the raw device, 0 if it's not one: it never changes, so it's retrieved once when the file is opened
|
||||
atomic_t<u64> m_pos {0};
|
||||
|
||||
public:
|
||||
windows_file(HANDLE handle)
|
||||
: m_handle(handle)
|
||||
windows_file(HANDLE handle, u64 raw_device_size = 0)
|
||||
: m_handle(handle), m_raw_device_size(raw_device_size)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -563,11 +675,17 @@ namespace fs
|
||||
|
||||
u64 size() override
|
||||
{
|
||||
// NOTE: this can fail if we access a mounted empty drive (e.g. after unmounting an iso).
|
||||
LARGE_INTEGER size;
|
||||
ensure(GetFileSizeEx(m_handle, &size)); // "file::size"
|
||||
if (!m_raw_device_size)
|
||||
{
|
||||
// NOTE: this can fail if we access a mounted empty drive (e.g. after unmounting an iso).
|
||||
LARGE_INTEGER size;
|
||||
|
||||
return size.QuadPart;
|
||||
ensure(GetFileSizeEx(m_handle, &size)); // "file::size"
|
||||
return size.QuadPart;
|
||||
}
|
||||
|
||||
// For a raw device, the size was already retrieved with DeviceIoControl() when the file was opened
|
||||
return m_raw_device_size;
|
||||
}
|
||||
|
||||
native_handle get_handle() override
|
||||
@@ -606,10 +724,11 @@ namespace fs
|
||||
class unix_file final : public file_base
|
||||
{
|
||||
int m_fd;
|
||||
u64 m_raw_device_size; // Size of the raw device, 0 if it's not one: it never changes, so it's retrieved once when the file is opened
|
||||
|
||||
public:
|
||||
unix_file(int fd)
|
||||
: m_fd(fd)
|
||||
unix_file(int fd, u64 raw_device_size = 0)
|
||||
: m_fd(fd), m_raw_device_size(raw_device_size)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -628,8 +747,8 @@ namespace fs
|
||||
|
||||
stat_t info {};
|
||||
info.is_directory = S_ISDIR(file_info.st_mode);
|
||||
info.is_writable = file_info.st_mode & 0200; // HACK: approximation
|
||||
info.size = file_info.st_size;
|
||||
info.is_writable = !m_raw_device_size && (file_info.st_mode & 0200); // HACK: approximation
|
||||
info.size = m_raw_device_size ? m_raw_device_size : static_cast<u64>(file_info.st_size); // A raw device reports no size through "fstat()"
|
||||
info.atime = file_info.st_atime;
|
||||
info.mtime = file_info.st_mtime;
|
||||
info.ctime = info.mtime;
|
||||
@@ -735,10 +854,16 @@ namespace fs
|
||||
|
||||
u64 size() override
|
||||
{
|
||||
struct ::stat file_info;
|
||||
ensure(::fstat(m_fd, &file_info) == 0); // "file::size"
|
||||
if (!m_raw_device_size)
|
||||
{
|
||||
struct ::stat file_info;
|
||||
ensure(::fstat(m_fd, &file_info) == 0); // "file::size"
|
||||
|
||||
return file_info.st_size;
|
||||
return file_info.st_size;
|
||||
}
|
||||
|
||||
// For a raw device, the size was already retrieved with an ioctl when the file was opened
|
||||
return m_raw_device_size;
|
||||
}
|
||||
|
||||
native_handle get_handle() override
|
||||
@@ -1090,6 +1215,203 @@ bool fs::is_symlink(const std::string& path)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool fs::is_optical_raw_device(const std::string& path)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (path.starts_with("\\\\.\\"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
#else
|
||||
#ifdef __APPLE__
|
||||
// On Mac OS X optical disks will only ever be mounted under /dev/disk(whatever), similar for raw devices,
|
||||
// so reject anything not containing the disk string.
|
||||
if (!path.starts_with("/dev/disk") && !path.starts_with("/dev/rdisk"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
// Skip a useless check if the path cannot point to a device node (device nodes always live in "/dev")
|
||||
if (!path.starts_with("/dev/"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
struct ::stat file_info;
|
||||
|
||||
if (::stat(path.c_str(), &file_info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return is_optical_device_node(file_info);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool fs::get_optical_raw_device(const std::string& path, std::string* raw_device)
|
||||
{
|
||||
if (fs::is_optical_raw_device(path))
|
||||
{
|
||||
if (raw_device)
|
||||
{
|
||||
*raw_device = path;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
// Skip a useless check to detect an optical raw device if navigating on subfolders (e.g. C:\subfolder_1\subfolder_2\),
|
||||
// it means we are on a HDD/SSD. A path for an optical drive should include only the drive letter (e.g. E:\)
|
||||
const size_t drive_delim_pos = path.find_first_of(":");
|
||||
|
||||
if (drive_delim_pos != 1 || drive_delim_pos != path.find_last_not_of(delim))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::string drive_letter = path.substr(0, drive_delim_pos + 1); // e.g. "E:"
|
||||
const std::string drive_path = drive_letter + "\\"; // e.g. "E:\"
|
||||
|
||||
if (GetDriveTypeA(drive_path.c_str()) == DRIVE_CDROM)
|
||||
{
|
||||
if (raw_device)
|
||||
{
|
||||
*raw_device = "\\\\.\\" + drive_letter;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
#elif defined(__linux__)
|
||||
// Here the path points to a mounted optical disc (e.g. "/media/user/PS3_DISC") or to a mounted disc image
|
||||
// (e.g. "mount -o loop game.iso /mnt/game"), so retrieve the device backing the filesystem it belongs to
|
||||
struct ::stat file_info;
|
||||
|
||||
if (::stat(path.c_str(), &file_info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// "st_dev" of anything stored on a filesystem backed by a block device matches "st_rdev" of the device itself
|
||||
const dev_t device_id = file_info.st_dev;
|
||||
const unsigned int device_major = major(device_id);
|
||||
|
||||
// Discard at once anything which is not backed by an optical drive or by a loopback device, so that the checks
|
||||
// below (each one costing at least a syscall) only run on an actual candidate
|
||||
if (device_major != s_scsi_cdrom_major && device_major != s_loopback_major)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Skip a useless check to detect an optical raw device if the path is not the mount point of the disc, it means we are
|
||||
// navigating on subfolders (on Windows, in the same way, only the drive root is accepted)
|
||||
if (!is_mount_point(path, file_info))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const unsigned int device_minor = minor(device_id);
|
||||
|
||||
// Retrieve the device name from sysfs (e.g. "/sys/dev/block/11:0" -> "../../devices/[...]/block/sr0")
|
||||
std::string device_path;
|
||||
char link_target[1024]; // NOTE: "readlink()" never null terminates, so the buffer is used through the returned length only
|
||||
|
||||
if (const ssize_t len = ::readlink(("/sys/dev/block/" + std::to_string(device_major) + ":" + std::to_string(device_minor)).c_str(), link_target, sizeof(link_target)); len > 0)
|
||||
{
|
||||
const std::string_view target{link_target, static_cast<usz>(len)};
|
||||
|
||||
device_path = "/dev/";
|
||||
device_path += target.substr(target.find_last_of('/') + 1);
|
||||
}
|
||||
else if (device_major == s_scsi_cdrom_major)
|
||||
{
|
||||
// Fallback (sysfs not available): the minor number matches the index of the SCSI CD-ROM device
|
||||
device_path = "/dev/sr" + std::to_string(device_minor);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Ensure the resolved node really points to the same optical device
|
||||
struct ::stat device_info;
|
||||
|
||||
if (::stat(device_path.c_str(), &device_info) != 0 || device_info.st_rdev != device_id || !is_optical_device_node(device_info))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (raw_device)
|
||||
{
|
||||
*raw_device = device_path;
|
||||
}
|
||||
|
||||
return true;
|
||||
#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
|
||||
// Here the path points to a mounted optical disc or to a mounted disc image (e.g. attached with "hdiutil"/"mdconfig"),
|
||||
// so retrieve the device backing the filesystem it belongs to
|
||||
struct ::stat file_info;
|
||||
|
||||
if (::stat(path.c_str(), &file_info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Skip a useless check to detect an optical raw device if the path is not the mount point of the disc, it means we are
|
||||
// navigating on subfolders (on Windows, in the same way, only the drive root is accepted). There is no cheap way to
|
||||
// discard a device here (unlike the major number on Linux), so this is the filter which must come first: it rejects
|
||||
// any file without a single syscall and any other folder with just one more
|
||||
if (!is_mount_point(path, file_info))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ::statfs mount_info;
|
||||
|
||||
if (::statfs(path.c_str(), &mount_info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string device_path = mount_info.f_mntfromname; // e.g. "/dev/disk2"
|
||||
|
||||
if (!device_path.starts_with("/dev/"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
// Use the raw (unbuffered) device (e.g. "/dev/disk2" -> "/dev/rdisk2")
|
||||
if (!device_path.starts_with("/dev/r"))
|
||||
{
|
||||
device_path.insert(5, 1, 'r');
|
||||
}
|
||||
#endif
|
||||
|
||||
// Ensure the resolved node really points to a raw device
|
||||
struct ::stat device_info;
|
||||
|
||||
if (::stat(device_path.c_str(), &device_info) != 0 || !is_optical_device_node(device_info))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (raw_device)
|
||||
{
|
||||
*raw_device = device_path;
|
||||
}
|
||||
|
||||
return true;
|
||||
#else
|
||||
// Not supported on this platform
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool fs::statfs(const std::string& path, fs::device_stat& info)
|
||||
{
|
||||
if (auto device = get_virtual_device(path))
|
||||
@@ -1570,11 +1892,29 @@ bool fs::utime(const std::string& path, s64 atime, s64 mtime)
|
||||
#endif
|
||||
}
|
||||
|
||||
void fs::sync()
|
||||
void fs::sync(const std::string& path)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
static_cast<void>(path);
|
||||
fs::g_tls_error = fs::error::unknown;
|
||||
#elif defined(__linux__)
|
||||
// Only flush the filesystem containing the path: a global sync() also waits on every other mounted
|
||||
// filesystem and may block indefinitely on a slow or stalled one (e.g. network or FUSE mounts)
|
||||
const int fd = ::open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
|
||||
if (fd == -1)
|
||||
{
|
||||
fs::g_tls_error = to_error(errno);
|
||||
return;
|
||||
}
|
||||
|
||||
const int res = ::syncfs(fd);
|
||||
const int err = errno;
|
||||
::close(fd);
|
||||
|
||||
fs::g_tls_error = res == 0 ? fs::error::ok : to_error(err);
|
||||
#else
|
||||
static_cast<void>(path);
|
||||
::sync();
|
||||
fs::g_tls_error = fs::error::ok;
|
||||
#endif
|
||||
@@ -1657,9 +1997,29 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
return;
|
||||
}
|
||||
|
||||
// If path points to an optical raw device, complete the file opening
|
||||
// (the following GetFileInformationByHandle() would always fail on a raw device).
|
||||
if (is_optical_raw_device(path))
|
||||
{
|
||||
DISK_GEOMETRY_EX geometry;
|
||||
|
||||
// Try to retrieve information on content. If it fails, no disc is probably mounted so abort the file opening
|
||||
if (!DeviceIoControl(handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, nullptr, 0, &geometry, sizeof(geometry), nullptr, nullptr))
|
||||
{
|
||||
const DWORD last_error = GetLastError();
|
||||
CloseHandle(handle);
|
||||
g_tls_error = to_error(last_error);
|
||||
return;
|
||||
}
|
||||
|
||||
m_file = std::make_unique<windows_file>(handle, static_cast<u64>(ensure(geometry.DiskSize.QuadPart)));
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the handle is actually valid.
|
||||
// This can fail on empty mounted drives (e.g. with ERROR_NOT_READY or ERROR_INVALID_FUNCTION).
|
||||
BY_HANDLE_FILE_INFORMATION info{};
|
||||
|
||||
if (!GetFileInformationByHandle(handle, &info))
|
||||
{
|
||||
const DWORD last_error = GetLastError();
|
||||
@@ -1670,7 +2030,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
g_tls_error = fs::error::isdir;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
g_tls_error = to_error(last_error);
|
||||
return;
|
||||
}
|
||||
@@ -1682,7 +2042,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
return;
|
||||
}
|
||||
|
||||
if (info.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
|
||||
if ((mode & fs::write) && (info.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
|
||||
{
|
||||
CloseHandle(handle);
|
||||
g_tls_error = fs::error::acces;
|
||||
@@ -1698,6 +2058,9 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
|
||||
m_file = std::make_unique<windows_file>(handle);
|
||||
#else
|
||||
// An optical raw device can only be read: any write related flag makes the opening fail (handled as any other error)
|
||||
const bool raw_device = is_optical_raw_device(path);
|
||||
|
||||
int flags = O_CLOEXEC; // Ensures all files are closed on execl for auto updater
|
||||
|
||||
if (mode & fs::read && mode & fs::write) flags |= O_RDWR;
|
||||
@@ -1713,7 +2076,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
|
||||
if (mode & fs::write && mode & fs::unread)
|
||||
{
|
||||
if (!(mode & (fs::excl + fs::lock)) && mode & fs::trunc)
|
||||
if (!raw_device && !(mode & (fs::excl + fs::lock)) && mode & fs::trunc)
|
||||
{
|
||||
// Alternative to truncation for "unread" flag (TODO)
|
||||
if (mode & fs::create)
|
||||
@@ -1746,6 +2109,23 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
ensure(::ftruncate(fd, 0) == 0);
|
||||
}
|
||||
|
||||
// If path points to an optical raw device, complete the file opening
|
||||
if (raw_device)
|
||||
{
|
||||
// Try to retrieve the size of the content. If it fails, no disc is probably mounted so abort the file opening
|
||||
const u64 raw_device_size = get_raw_device_size(fd);
|
||||
|
||||
if (!raw_device_size)
|
||||
{
|
||||
::close(fd);
|
||||
g_tls_error = fs::error::noent;
|
||||
return;
|
||||
}
|
||||
|
||||
m_file = std::make_unique<unix_file>(fd, raw_device_size);
|
||||
return;
|
||||
}
|
||||
|
||||
m_file = std::make_unique<unix_file>(fd);
|
||||
|
||||
if (mode & fs::isfile && !(mode & fs::write) && get_stat().is_directory)
|
||||
@@ -1872,6 +2252,17 @@ fs::native_handle fs::file::get_handle() const
|
||||
#endif
|
||||
}
|
||||
|
||||
bool fs::set_sparse([[maybe_unused]] const fs::file& file)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
FILE_SET_SPARSE_BUFFER sparse{TRUE};
|
||||
DWORD returned = 0;
|
||||
return DeviceIoControl(file.get_handle(), FSCTL_SET_SPARSE, &sparse, sizeof(sparse), nullptr, 0, &returned, nullptr) != FALSE;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
fs::file_id fs::file::get_id() const
|
||||
{
|
||||
if (m_file)
|
||||
@@ -2156,6 +2547,7 @@ const std::string& fs::get_config_dir([[maybe_unused]] bool get_config_subdirect
|
||||
// Clear buffer on failure and notify user
|
||||
MessageBoxA(nullptr, fmt::format("GetEnvironmentVariable(RPCS3_CONFIG_DIR) failed: error: %s", fmt::win_error{GetLastError(), nullptr}).c_str(), "fs::get_config_dir()", MB_ICONERROR);
|
||||
buf.clear();
|
||||
size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2833,6 +3225,7 @@ void fmt_class_string<fs::error>::format(std::string& out, u64 arg)
|
||||
case fs::error::notempty: return "Not empty";
|
||||
case fs::error::readonly: return "Read only";
|
||||
case fs::error::isdir: return "Is a directory";
|
||||
case fs::error::notdir: return "Not a directory";
|
||||
case fs::error::toolong: return "Path too long";
|
||||
case fs::error::nospace: return "Not enough space on the device";
|
||||
case fs::error::xdev: return "Device mismatch";
|
||||
|
||||
+26
-2
@@ -198,6 +198,19 @@ namespace fs
|
||||
// Return "path" plus an ending delimiter (if missing) if "path" is an existing directory. Otherwise, an empty string
|
||||
std::string get_path_if_dir(const std::string& path);
|
||||
|
||||
// Check whether the path is the bare name of a drive (e.g. "E:"), that is a root path whose trailing delimiter was
|
||||
// trimmed: such a path does not point to the root of the drive but to the current directory of that drive, so the
|
||||
// delimiter must be restored before using or storing it.
|
||||
// NOTE: always false on the other platforms, where a name ending with ':' is a regular path component
|
||||
inline bool is_drive_name([[maybe_unused]] std::string_view path)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return !path.empty() && path.back() == ':';
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Get file information
|
||||
bool get_stat(const std::string& path, stat_t& info);
|
||||
|
||||
@@ -213,6 +226,13 @@ namespace fs
|
||||
// Check whether the path points to an existing symlink
|
||||
bool is_symlink(const std::string& path);
|
||||
|
||||
// Check whether the path points to a raw device (e.g. "\\.\E:" on Windows, "/dev/sr0" on Linux, "/dev/rdisk2" on macOS)
|
||||
bool is_optical_raw_device(const std::string& path);
|
||||
|
||||
// Check whether the path points to an optical drive or to a mounted disc image (either the raw device itself or the
|
||||
// mount point of the disc/image). If so, provide the raw device in "raw_device" if requested
|
||||
bool get_optical_raw_device(const std::string& path, std::string* raw_device = nullptr);
|
||||
|
||||
// Get filesystem information
|
||||
bool statfs(const std::string& path, device_stat& info);
|
||||
|
||||
@@ -243,8 +263,8 @@ namespace fs
|
||||
// Set file access/modification time
|
||||
bool utime(const std::string& path, s64 atime, s64 mtime);
|
||||
|
||||
// Synchronize filesystems (TODO)
|
||||
void sync();
|
||||
// Synchronize the filesystem containing the given path (only that filesystem where supported)
|
||||
void sync(const std::string& path);
|
||||
|
||||
class file final
|
||||
{
|
||||
@@ -490,6 +510,9 @@ namespace fs
|
||||
}
|
||||
};
|
||||
|
||||
// Enable sparse-file semantics when required by the host platform.
|
||||
bool set_sparse(const file& file);
|
||||
|
||||
class dir final
|
||||
{
|
||||
std::unique_ptr<dir_base> m_dir{};
|
||||
@@ -683,6 +706,7 @@ namespace fs
|
||||
notempty,
|
||||
readonly,
|
||||
isdir,
|
||||
notdir,
|
||||
toolong,
|
||||
nospace,
|
||||
xdev,
|
||||
|
||||
+40
-6
@@ -244,7 +244,6 @@ namespace asmjit
|
||||
|
||||
void vec_load_unaligned(u32 esize, const Operand& v, const x86::Mem& src);
|
||||
void vec_store_unaligned(u32 esize, const Operand& v, const x86::Mem& dst);
|
||||
void vec_partial_move(u32 esize, const Operand& dst, const Operand& src);
|
||||
|
||||
void _vec_binary_op(x86::Inst::Id sse_op, x86::Inst::Id vex_op, x86::Inst::Id evex_op, const Operand& dst, const Operand& lhs, const Operand& rhs);
|
||||
|
||||
@@ -434,13 +433,35 @@ namespace asmjit
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
struct jit_write_guard
|
||||
{
|
||||
jit_write_guard() noexcept
|
||||
{
|
||||
pthread_jit_write_protect_np(false);
|
||||
|
||||
// Ensure stores are not reordered by the compiler
|
||||
atomic_fence_acq_rel();
|
||||
}
|
||||
|
||||
~jit_write_guard() noexcept
|
||||
{
|
||||
// Ensure stores are not reordered by the compiler
|
||||
atomic_fence_seq_cst();
|
||||
|
||||
pthread_jit_write_protect_np(true);
|
||||
}
|
||||
};
|
||||
#else
|
||||
#define jit_write_guard [[maybe_unused]] int
|
||||
#endif
|
||||
|
||||
// Build runtime function with asmjit::X86Assembler
|
||||
template <typename FT, typename Asm = native_asm, typename F>
|
||||
inline FT build_function_asm(std::string_view name, F&& builder, ::jit_runtime* custom_runtime = nullptr, bool reduced_size = false)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
pthread_jit_write_protect_np(false);
|
||||
#endif
|
||||
jit_write_guard jit_guard;
|
||||
|
||||
using namespace asmjit;
|
||||
|
||||
auto& rt = custom_runtime ? *custom_runtime : get_global_runtime();
|
||||
@@ -493,6 +514,10 @@ inline FT build_function_asm(std::string_view name, F&& builder, ::jit_runtime*
|
||||
return reinterpret_cast<FT>(uptr(result));
|
||||
}
|
||||
|
||||
#if defined(__INTELLISENSE__) && !defined(LLVM_AVAILABLE)
|
||||
#define LLVM_AVAILABLE
|
||||
#endif
|
||||
|
||||
#ifdef LLVM_AVAILABLE
|
||||
|
||||
namespace llvm
|
||||
@@ -521,7 +546,7 @@ class jit_compiler final
|
||||
atomic_t<usz> m_disk_space = umax;
|
||||
|
||||
public:
|
||||
jit_compiler(const std::unordered_map<std::string, u64>& _link, const std::string& _cpu, u32 flags = 0, std::function<u64(const std::string&)> symbols_cement = {}) noexcept;
|
||||
jit_compiler(const std::unordered_map<std::string, u64>& _link, std::string_view _cpu, u32 flags = 0, std::function<u64(const std::string&)> symbols_cement = {}) noexcept;
|
||||
jit_compiler& operator=(thread_state) noexcept;
|
||||
~jit_compiler() noexcept;
|
||||
|
||||
@@ -539,9 +564,15 @@ public:
|
||||
// Add module (path to obj cache dir)
|
||||
void add(std::unique_ptr<llvm::Module> _module, const std::string& path);
|
||||
|
||||
// Returns false after LLVM fatal recovery. The compiler must be discarded.
|
||||
bool try_add(std::unique_ptr<llvm::Module> _module, const std::string& path, std::string& error);
|
||||
|
||||
// Add module (not cached)
|
||||
void add(std::unique_ptr<llvm::Module> _module);
|
||||
|
||||
// Returns false after LLVM fatal recovery. The compiler must be discarded.
|
||||
bool try_add(std::unique_ptr<llvm::Module> _module, std::string& error);
|
||||
|
||||
// Add object (path to obj file)
|
||||
bool add(const std::string& path);
|
||||
|
||||
@@ -554,11 +585,14 @@ public:
|
||||
// Finalize
|
||||
void fin();
|
||||
|
||||
// Returns false after LLVM fatal recovery. The compiler must be discarded.
|
||||
bool try_fin(std::string& error);
|
||||
|
||||
// Get compiled function address
|
||||
u64 get(const std::string& name);
|
||||
|
||||
// Get CPU info
|
||||
static std::string cpu(const std::string& _cpu);
|
||||
static std::string cpu(std::string_view _cpu);
|
||||
|
||||
// Get system triple (PPU)
|
||||
static std::string triple1();
|
||||
|
||||
@@ -122,7 +122,7 @@ static u8* get_jit_memory()
|
||||
// Reserve 2G memory (magic static)
|
||||
static void* const s_memory2 = []() -> void*
|
||||
{
|
||||
void* ptr = utils::memory_reserve(0x80000000);
|
||||
void* ptr = utils::memory_reserve(0x80000000, true);
|
||||
#ifdef CAN_OVERCOMMIT
|
||||
utils::memory_commit(ptr, 0x80000000);
|
||||
utils::memory_protect(ptr, 0x40000000, utils::protection::wx);
|
||||
@@ -316,10 +316,10 @@ void jit_runtime::finalize() noexcept
|
||||
#endif
|
||||
// Reset JIT memory
|
||||
#ifdef CAN_OVERCOMMIT
|
||||
utils::memory_reset(get_jit_memory(), 0x80000000);
|
||||
utils::memory_reset(get_jit_memory(), 0x80000000, true);
|
||||
utils::memory_protect(get_jit_memory(), 0x40000000, utils::protection::wx);
|
||||
#else
|
||||
utils::memory_decommit(get_jit_memory(), 0x80000000);
|
||||
utils::memory_decommit(get_jit_memory(), 0x80000000, true);
|
||||
#endif
|
||||
|
||||
s_code_pos = 0;
|
||||
@@ -348,7 +348,7 @@ jit_runtime_base& asmjit::get_global_runtime()
|
||||
{
|
||||
custom_runtime() noexcept
|
||||
{
|
||||
ensure(m_pos.raw() = static_cast<uchar*>(utils::memory_reserve(size)));
|
||||
ensure(m_pos.raw() = static_cast<uchar*>(utils::memory_reserve(size, true)));
|
||||
|
||||
// Initialize "end" pointer
|
||||
m_max = m_pos + size;
|
||||
|
||||
+123
-14
@@ -12,6 +12,12 @@
|
||||
|
||||
#include <charconv>
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <pthread.h>
|
||||
#elif defined(ANDROID)
|
||||
#include "util/cctype.hpp"
|
||||
#endif
|
||||
|
||||
LOG_CHANNEL(jit_log, "JIT");
|
||||
|
||||
#ifdef LLVM_AVAILABLE
|
||||
@@ -50,6 +56,44 @@ LOG_CHANNEL(jit_log, "JIT");
|
||||
#include "Emu/CPU/Backends/AArch64/AArch64Common.h"
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
thread_local std::string* g_llvm_fatal_message = nullptr;
|
||||
|
||||
template <typename F>
|
||||
bool run_recoverable_llvm(F&& func, std::string& error)
|
||||
{
|
||||
error.clear();
|
||||
|
||||
// Run LLVM codegen in a disposable thread. If LLVM invokes the fatal
|
||||
// handler, only this helper thread exits.
|
||||
named_thread worker("LLVM JIT", [&]()
|
||||
{
|
||||
#if defined(__APPLE__)
|
||||
pthread_jit_write_protect_np(false);
|
||||
#endif
|
||||
g_llvm_fatal_message = &error;
|
||||
|
||||
std::forward<F>(func)();
|
||||
|
||||
g_llvm_fatal_message = nullptr;
|
||||
#if defined(__APPLE__)
|
||||
pthread_jit_write_protect_np(true);
|
||||
#endif
|
||||
});
|
||||
|
||||
worker();
|
||||
const bool result = static_cast<thread_state>(worker) == thread_state::finished;
|
||||
|
||||
if (!result && error.empty())
|
||||
{
|
||||
error = "LLVM crash recovery invoked";
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
const bool jit_initialize = []() -> bool
|
||||
{
|
||||
llvm::InitializeNativeTarget();
|
||||
@@ -199,7 +243,7 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
|
||||
MemoryManager1(std::function<u64(const std::string&)> symbols_cement = {}) noexcept
|
||||
: m_symbols_cement(std::move(symbols_cement))
|
||||
{
|
||||
auto ptr = reinterpret_cast<u8*>(utils::memory_reserve(c_max_size * 3));
|
||||
auto ptr = reinterpret_cast<u8*>(utils::memory_reserve(c_max_size * 3, true));
|
||||
m_code_mems = ptr;
|
||||
// ptr += c_max_size;
|
||||
// m_data_ro_mems = ptr;
|
||||
@@ -218,7 +262,7 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
|
||||
// utils::memory_decommit(m_code_mems, how_much(code_ptr));
|
||||
// utils::memory_decommit(m_data_ro_mems, how_much(data_ro_ptr));
|
||||
// utils::memory_decommit(m_data_rw_mems, how_much(data_rw_ptr));
|
||||
utils::memory_decommit(m_code_mems, c_max_size * 3);
|
||||
utils::memory_decommit(m_code_mems, c_max_size * 3, true);
|
||||
}
|
||||
|
||||
llvm::JITSymbol findSymbol(const std::string& name) override
|
||||
@@ -509,9 +553,9 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
std::string jit_compiler::cpu(const std::string& _cpu)
|
||||
std::string jit_compiler::cpu(std::string_view _cpu)
|
||||
{
|
||||
std::string m_cpu = _cpu;
|
||||
std::string m_cpu = std::string(_cpu);
|
||||
|
||||
if (m_cpu.empty())
|
||||
{
|
||||
@@ -639,7 +683,7 @@ bool jit_compiler::add_sub_disk_space(ssz space)
|
||||
}).second;
|
||||
}
|
||||
|
||||
jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, const std::string& _cpu, u32 flags, std::function<u64(const std::string&)> symbols_cement) noexcept
|
||||
jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, std::string_view _cpu, u32 flags, std::function<u64(const std::string&)> symbols_cement) noexcept
|
||||
: m_context(new llvm::LLVMContext)
|
||||
, m_cpu(cpu(_cpu))
|
||||
{
|
||||
@@ -649,6 +693,13 @@ jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, co
|
||||
llvm::install_fatal_error_handler([](void*, const char* msg, bool)
|
||||
{
|
||||
const std::string_view out = msg ? msg : "";
|
||||
|
||||
if (g_llvm_fatal_message)
|
||||
{
|
||||
*g_llvm_fatal_message = out;
|
||||
thread_ctrl::silent_exit();
|
||||
}
|
||||
|
||||
fmt::throw_exception("LLVM Emergency Exit Invoked: '%s'", out);
|
||||
}, nullptr);
|
||||
|
||||
@@ -658,11 +709,7 @@ jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, co
|
||||
std::string result;
|
||||
|
||||
auto null_mod = std::make_unique<llvm::Module> ("null_", *m_context);
|
||||
#if LLVM_VERSION_MAJOR >= 21 && (LLVM_VERSION_MINOR >= 1 || LLVM_VERSION_MAJOR >= 22)
|
||||
null_mod->setTargetTriple(llvm::Triple(jit_compiler::triple1()));
|
||||
#else
|
||||
null_mod->setTargetTriple(jit_compiler::triple1());
|
||||
#endif
|
||||
|
||||
std::unique_ptr<llvm::RTDyldMemoryManager> mem;
|
||||
|
||||
@@ -676,11 +723,7 @@ jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, co
|
||||
else
|
||||
{
|
||||
mem = std::make_unique<MemoryManager2>(std::move(symbols_cement));
|
||||
#if LLVM_VERSION_MAJOR >= 21 && (LLVM_VERSION_MINOR >= 1 || LLVM_VERSION_MAJOR >= 22)
|
||||
null_mod->setTargetTriple(llvm::Triple(jit_compiler::triple2()));
|
||||
#else
|
||||
null_mod->setTargetTriple(jit_compiler::triple2());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -701,6 +744,15 @@ jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, co
|
||||
else
|
||||
attributes.push_back("-dotprod");
|
||||
|
||||
// The recompilers emit i8mm intrinsics (e.g. ummla) gated on utils::has_i8mm().
|
||||
// The JIT target features must advertise i8mm too, otherwise the backend fails
|
||||
// with "Cannot select: intrinsic %llvm.aarch64.neon.ummla" whenever the resolved
|
||||
// -mcpu does not already imply it (e.g. the cortex-a78 fallback on Apple silicon).
|
||||
if (utils::has_i8mm())
|
||||
attributes.push_back("+i8mm");
|
||||
else
|
||||
attributes.push_back("-i8mm");
|
||||
|
||||
if (utils::has_sve())
|
||||
attributes.push_back("+sve");
|
||||
else
|
||||
@@ -788,6 +840,33 @@ void jit_compiler::add(std::unique_ptr<llvm::Module> _module, const std::string&
|
||||
}
|
||||
}
|
||||
|
||||
bool jit_compiler::try_add(std::unique_ptr<llvm::Module> _module, const std::string& path, std::string& error)
|
||||
{
|
||||
ObjectCache cache{path, this};
|
||||
m_engine->setObjectCache(&cache);
|
||||
|
||||
const auto ptr = _module.get();
|
||||
m_engine->addModule(std::move(_module));
|
||||
|
||||
if (!run_recoverable_llvm([&]()
|
||||
{
|
||||
m_engine->generateCodeForModule(ptr);
|
||||
}, error))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_engine->setObjectCache(nullptr);
|
||||
|
||||
for (auto& func : ptr->functions())
|
||||
{
|
||||
// Delete IR to lower memory consumption
|
||||
func.deleteBody();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void jit_compiler::add(std::unique_ptr<llvm::Module> _module)
|
||||
{
|
||||
const auto ptr = _module.get();
|
||||
@@ -801,6 +880,28 @@ void jit_compiler::add(std::unique_ptr<llvm::Module> _module)
|
||||
}
|
||||
}
|
||||
|
||||
bool jit_compiler::try_add(std::unique_ptr<llvm::Module> _module, std::string& error)
|
||||
{
|
||||
const auto ptr = _module.get();
|
||||
m_engine->addModule(std::move(_module));
|
||||
|
||||
if (!run_recoverable_llvm([&]()
|
||||
{
|
||||
m_engine->generateCodeForModule(ptr);
|
||||
}, error))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto& func : ptr->functions())
|
||||
{
|
||||
// Delete IR to lower memory consumption
|
||||
func.deleteBody();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool jit_compiler::add(const std::string& path)
|
||||
{
|
||||
auto cache = ObjectCache::load(path);
|
||||
@@ -852,6 +953,14 @@ void jit_compiler::fin()
|
||||
m_engine->finalizeObject();
|
||||
}
|
||||
|
||||
bool jit_compiler::try_fin(std::string& error)
|
||||
{
|
||||
return run_recoverable_llvm([&]()
|
||||
{
|
||||
m_engine->finalizeObject();
|
||||
}, error);
|
||||
}
|
||||
|
||||
u64 jit_compiler::get(const std::string& name)
|
||||
{
|
||||
return m_engine->getGlobalValueAddress(name);
|
||||
@@ -932,7 +1041,7 @@ const char * fallback_cpu_detection()
|
||||
return "cortex-a78";
|
||||
}
|
||||
|
||||
std::transform(result.begin(), result.end(), result.begin(), ::tolower);
|
||||
std::transform(result.begin(), result.end(), result.begin(), utils::tolower<char>);
|
||||
return result;
|
||||
}();
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
#include "LUrlParser.h"
|
||||
#include "util/cctype.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
@@ -36,7 +37,7 @@ static bool IsSchemeValid( const std::string& SchemeName )
|
||||
{
|
||||
return std::all_of(SchemeName.cbegin(), SchemeName.cend(), [](const auto& c)
|
||||
{
|
||||
return isalpha(c) || c == '+' || c == '-' || c == '.';
|
||||
return utils::isalpha(c) || c == '+' || c == '-' || c == '.';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+25
-10
@@ -3,6 +3,7 @@
|
||||
#include "cfmt.h"
|
||||
#include "util/endian.hpp"
|
||||
#include "util/v128.hpp"
|
||||
#include "util/cctype.hpp"
|
||||
|
||||
#include <locale>
|
||||
#include <codecvt>
|
||||
@@ -16,12 +17,12 @@
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4996)
|
||||
#elif defined(__clang__)
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
#elif defined(_MSC_VER)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4996)
|
||||
#else
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
@@ -198,12 +199,12 @@ fmt::base57_result fmt::base57_result::from_string(std::string_view str)
|
||||
{
|
||||
auto to_val = [](u8 c) -> u64
|
||||
{
|
||||
if (std::isdigit(c))
|
||||
if (utils::isdigit(c))
|
||||
{
|
||||
return c - '0';
|
||||
}
|
||||
|
||||
if (std::isupper(c))
|
||||
if (utils::isupper(c))
|
||||
{
|
||||
// Omitted characters
|
||||
if (c == 'B' || c == 'D' || c == 'I' || c == 'O')
|
||||
@@ -231,7 +232,7 @@ fmt::base57_result fmt::base57_result::from_string(std::string_view str)
|
||||
return c - 'A' + 10;
|
||||
}
|
||||
|
||||
if (std::islower(c))
|
||||
if (utils::islower(c))
|
||||
{
|
||||
// Omitted characters
|
||||
if (c == 'l')
|
||||
@@ -611,7 +612,7 @@ void fmt_class_string<std::source_location>::format(std::string& out, u64 arg)
|
||||
#ifdef _WIN32
|
||||
if (DWORD error = GetLastError())
|
||||
{
|
||||
fmt::append(out, " (error=%s)", error, fmt::win_error_to_string(error));
|
||||
fmt::append(out, " (error=%s)", fmt::win_error_to_string(error));
|
||||
}
|
||||
#else
|
||||
if (int error = errno)
|
||||
@@ -630,6 +631,13 @@ namespace fmt
|
||||
thread_ctrl::emergency_exit(out);
|
||||
}
|
||||
|
||||
[[noreturn]] void raw_verify_error(std::source_location loc, std::source_location propagated_loc, const char8_t* msg, usz object)
|
||||
{
|
||||
std::string out;
|
||||
fmt::append(out, "%s (object: 0x%x)%s%s", msg ? msg : u8"Verification failed", object, loc, propagated_loc);
|
||||
thread_ctrl::emergency_exit(out);
|
||||
}
|
||||
|
||||
[[noreturn]] void raw_range_error(std::source_location loc, std::string_view index, usz container_size)
|
||||
{
|
||||
std::string out;
|
||||
@@ -921,6 +929,13 @@ std::string_view fmt::trim_front_sv(std::string_view source, std::string_view va
|
||||
void fmt::trim_back(std::string& source, std::string_view values)
|
||||
{
|
||||
const usz index = source.find_last_not_of(values);
|
||||
|
||||
if (index == source.npos)
|
||||
{
|
||||
source.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
source.resize(index + 1);
|
||||
}
|
||||
|
||||
@@ -938,7 +953,7 @@ std::string fmt::to_upper(std::string_view string)
|
||||
{
|
||||
std::string result;
|
||||
result.resize(string.size());
|
||||
std::transform(string.begin(), string.end(), result.begin(), ::toupper);
|
||||
std::transform(string.begin(), string.end(), result.begin(), utils::toupper<char>);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -946,7 +961,7 @@ std::string fmt::to_lower(std::string_view string)
|
||||
{
|
||||
std::string result;
|
||||
result.resize(string.size());
|
||||
std::transform(string.begin(), string.end(), result.begin(), ::tolower);
|
||||
std::transform(string.begin(), string.end(), result.begin(), utils::tolower<char>);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+30
-8
@@ -23,19 +23,19 @@ inline void strcpy_trunc(D&& dst, const T& src)
|
||||
}
|
||||
|
||||
// Convert string to signed integer
|
||||
bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max);
|
||||
bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max, std::string_view name = {});
|
||||
|
||||
// Convert string to unsigned integer
|
||||
bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max);
|
||||
bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max, std::string_view name = {});
|
||||
|
||||
// Convert string to unsigned int128_t
|
||||
bool try_to_uint128(u128* out, std::string_view value);
|
||||
bool try_to_uint128(u128* out, std::string_view value, std::string_view name = {});
|
||||
|
||||
// Convert string to float
|
||||
bool try_to_float(f64* out, std::string_view value, f64 min, f64 max);
|
||||
bool try_to_float(f64* out, std::string_view value, f64 min, f64 max, std::string_view name = {});
|
||||
|
||||
// Convert float to string locale independent
|
||||
bool try_to_string(std::string* out, const f64& value);
|
||||
bool try_to_string(std::string* out, f64 value, std::string_view name = {});
|
||||
|
||||
// Get the file extension of a file path ("png", "jpg", etc.)
|
||||
std::string get_file_extension(const std::string& file_path);
|
||||
@@ -161,7 +161,7 @@ namespace fmt
|
||||
std::string_view trim_back_sv(std::string_view source, std::string_view values = " \t");
|
||||
|
||||
template <typename T>
|
||||
std::string merge(const T& source, std::string_view separator)
|
||||
std::string merge(const T& source, std::string_view separator, bool is_skip_empty = false)
|
||||
{
|
||||
if (source.empty())
|
||||
{
|
||||
@@ -180,6 +180,23 @@ namespace fmt
|
||||
auto it = source.begin();
|
||||
auto end = source.end();
|
||||
|
||||
if (is_skip_empty)
|
||||
{
|
||||
for (; it != end; ++it)
|
||||
{
|
||||
if (it->empty()) continue;
|
||||
|
||||
if (!result.empty() && !separator.empty())
|
||||
{
|
||||
result.append(separator);
|
||||
}
|
||||
|
||||
result.append(*it);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
for (--end; it != end; ++it)
|
||||
{
|
||||
result.append(*it);
|
||||
@@ -192,7 +209,7 @@ namespace fmt
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::string merge(std::initializer_list<T> sources, std::string_view separator)
|
||||
std::string merge(std::initializer_list<T> sources, std::string_view separator, bool is_skip_empty = false)
|
||||
{
|
||||
if (!sources.size())
|
||||
{
|
||||
@@ -213,6 +230,11 @@ namespace fmt
|
||||
|
||||
for (const auto& v : sources)
|
||||
{
|
||||
if (v.empty()) continue;
|
||||
|
||||
std::string sub = fmt::merge(v, separator, is_skip_empty);
|
||||
if (sub.empty()) continue;
|
||||
|
||||
if (first)
|
||||
{
|
||||
first = false;
|
||||
@@ -222,7 +244,7 @@ namespace fmt
|
||||
result.append(separator);
|
||||
}
|
||||
|
||||
result.append(fmt::merge(v, separator));
|
||||
result.append(std::move(sub));
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
+827
-54
File diff suppressed because it is too large
Load Diff
+13
-12
@@ -129,7 +129,7 @@ public:
|
||||
const native_entry entry_point;
|
||||
|
||||
// Set name for debugger
|
||||
static void set_name(std::string);
|
||||
static void set_name(std::string name);
|
||||
|
||||
private:
|
||||
// Thread handle (platform-specific)
|
||||
@@ -232,11 +232,7 @@ public:
|
||||
}
|
||||
|
||||
// Set current thread name (not recommended)
|
||||
static void set_name(std::string name)
|
||||
{
|
||||
g_tls_this_thread->m_tname.store(make_single<std::string>(name));
|
||||
g_tls_this_thread->set_name(std::move(name));
|
||||
}
|
||||
static void set_name(std::string name);
|
||||
|
||||
// Set thread name (not recommended)
|
||||
template <typename T>
|
||||
@@ -319,6 +315,9 @@ public:
|
||||
// Exit.
|
||||
[[noreturn]] static void emergency_exit(std::string_view reason);
|
||||
|
||||
// Exit the current named thread as errored without reporting a fatal error.
|
||||
[[noreturn]] static void silent_exit() noexcept;
|
||||
|
||||
// Get current thread (may be nullptr)
|
||||
static thread_base* get_current()
|
||||
{
|
||||
@@ -801,31 +800,30 @@ public:
|
||||
m_count = 0;
|
||||
|
||||
// Create all threads
|
||||
for (u32 i = 0; i < count - 1; i++)
|
||||
for (; m_count < count - 1; m_count++)
|
||||
{
|
||||
// Copy the context
|
||||
std::remove_cvref_t<Context> context(static_cast<const Context&>(f));
|
||||
|
||||
// Perform the check and additional preparations for each context
|
||||
if (!std::invoke(std::forward<CheckAndPrepare>(check), i, context))
|
||||
if (!std::invoke(std::forward<CheckAndPrepare>(check), m_count, context))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_count++;
|
||||
new (static_cast<void*>(m_threads + i)) Thread(std::string(name) + std::to_string(i + 1), std::move(context));
|
||||
new (static_cast<void*>(m_threads + m_count)) Thread(std::string(name) + std::to_string(m_count + 1), std::move(context));
|
||||
}
|
||||
|
||||
// Move the context (if movable)
|
||||
std::remove_cvref_t<Context> context(std::forward<Context>(f));
|
||||
|
||||
if (!std::invoke(std::forward<CheckAndPrepare>(check), m_count - 1, context))
|
||||
if (!std::invoke(std::forward<CheckAndPrepare>(check), m_count, context))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
new (static_cast<void*>(m_threads + m_count)) Thread(std::string(name) + std::to_string(m_count + 1), std::move(context));
|
||||
m_count++;
|
||||
new (static_cast<void*>(m_threads + m_count - 1)) Thread(std::string(name) + std::to_string(m_count - 1), std::move(context));
|
||||
}
|
||||
|
||||
// Default constructor
|
||||
@@ -907,3 +905,6 @@ public:
|
||||
::operator delete(static_cast<void*>(m_threads), std::align_val_t{alignof(Thread)});
|
||||
}
|
||||
};
|
||||
|
||||
usz map_workload(std::string_view thread_name, usz thread_count, usz count, std::function<void(usz)>&& func);
|
||||
usz map_workload(std::string_view thread_name, usz thread_count, std::function<void()>&& func);
|
||||
|
||||
+26
-9
@@ -5,11 +5,13 @@
|
||||
#include "version.h"
|
||||
#include "Emu/IdManager.h"
|
||||
#include "Emu/Memory/vm.h"
|
||||
#include "Emu/emu_callbacks.h"
|
||||
#include "Emu/System.h"
|
||||
#include "Emu/VFS.h"
|
||||
|
||||
#include "util/types.hpp"
|
||||
#include "util/asm.hpp"
|
||||
#include "util/cctype.hpp"
|
||||
|
||||
#include <charconv>
|
||||
#include <regex>
|
||||
@@ -329,7 +331,7 @@ bool patch_engine::load(patch_map& patches_map, const std::string& path, std::st
|
||||
is_valid = false;
|
||||
continue;
|
||||
}
|
||||
else if (serial.size() != 9 || !std::all_of(serial.begin(), serial.end(), [](char c) { return std::isalnum(static_cast<unsigned char>(c)); }))
|
||||
else if (serial.size() != 9 || !std::all_of(serial.begin(), serial.end(), [](char c) { return utils::isalnum(c); }))
|
||||
{
|
||||
append_log_message(log_messages, fmt::format("Error: Serial '%s' invalid (patch: %s, key: %s, location: %s, file: %s)", serial, description, main_key, get_yaml_node_location(serial_node), path), &patch_log.error);
|
||||
is_valid = false;
|
||||
@@ -962,7 +964,7 @@ static usz apply_modification(std::vector<u32>& applied, patch_engine::patch_inf
|
||||
const u32 alloc_size = utils::align(static_cast<u32>(p.value.long_value) + alloc_at % 4096, 4096);
|
||||
|
||||
// Allocate map if needed, if allocated flags will indicate that bit 62 is set (unique identifier)
|
||||
auto alloc_map = vm::reserve_map(vm::any, alloc_at & -0x10000, utils::align(alloc_size, 0x10000), vm::page_size_64k | (1ull << 62));
|
||||
auto alloc_map = vm::reserve_map(vm::any, alloc_at & -0x10000, utils::align(alloc_size, 0x10000), vm::block_size_64k | (1ull << 62));
|
||||
|
||||
u64 flags = vm::alloc_unwritable;
|
||||
|
||||
@@ -1188,7 +1190,7 @@ static usz apply_modification(std::vector<u32>& applied, patch_engine::patch_inf
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
patch_log.error("Failed to allocate 0x%x bytes for code (entry=0x%x)", alloc_size, addr, out_branch);
|
||||
patch_log.error("Failed to allocate 0x%x bytes for code (entry=0x%x)", alloc_size, out_branch);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1386,7 +1388,7 @@ static usz apply_modification(std::vector<u32>& applied, patch_engine::patch_inf
|
||||
|
||||
if (exec_addr)
|
||||
{
|
||||
Emu.GetCallbacks().add_breakpoint(exec_addr);
|
||||
g_emu_callbacks.add_breakpoint(exec_addr);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1434,7 +1436,7 @@ static usz apply_modification(std::vector<u32>& applied, patch_engine::patch_inf
|
||||
|
||||
if (dest_path.empty())
|
||||
{
|
||||
patch_log.error("Failed to patch file path at '%s': destination is not mounted", original_vfs_path, dest_vfs_path);
|
||||
patch_log.error("Failed to patch file path at '%s': destination is not mounted", original_vfs_path);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1803,8 +1805,9 @@ static void append_patches(patch_engine::patch_map& existing_patches, const patc
|
||||
|
||||
bool patch_engine::save_patches(const patch_map& patches, const std::string& path, std::stringstream* log_messages)
|
||||
{
|
||||
fs::file file(path, fs::rewrite);
|
||||
if (!file)
|
||||
fs::pending_file file(path);
|
||||
|
||||
if (!file.file)
|
||||
{
|
||||
append_log_message(log_messages, fmt::format("Failed to open patch file %s (%s)", path, fs::g_tls_error), &patch_log.fatal);
|
||||
return false;
|
||||
@@ -1904,7 +1907,17 @@ bool patch_engine::save_patches(const patch_map& patches, const std::string& pat
|
||||
out << YAML::Flow;
|
||||
out << YAML::BeginSeq;
|
||||
out << fmt::format("%s", data.type);
|
||||
out << fmt::format("0x%.8x", data.offset);
|
||||
|
||||
if (patch_type_uses_hex_offset(data.type))
|
||||
{
|
||||
out << fmt::format("0x%.8x", data.offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
// This element is a path for move_file and hide_file, not an address
|
||||
out << data.original_offset;
|
||||
}
|
||||
|
||||
out << data.original_value;
|
||||
out << YAML::EndSeq;
|
||||
}
|
||||
@@ -1918,7 +1931,11 @@ bool patch_engine::save_patches(const patch_map& patches, const std::string& pat
|
||||
|
||||
out << YAML::EndMap;
|
||||
|
||||
file.write(out.c_str(), out.size());
|
||||
if (file.file.write(out.c_str(), out.size()) < out.size() || !file.commit())
|
||||
{
|
||||
append_log_message(log_messages, fmt::format("Failed to write patch file %s (%s)", path, fs::g_tls_error), &patch_log.fatal);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+22
-6
@@ -146,25 +146,41 @@ public:
|
||||
|
||||
constexpr bool test_and_set(T bit)
|
||||
{
|
||||
bool r = (m_data & shift(bit)) != 0;
|
||||
m_data |= shift(bit);
|
||||
const under s = shift(bit);
|
||||
const bool r = (m_data & s) != 0;
|
||||
m_data |= s;
|
||||
return r;
|
||||
}
|
||||
|
||||
constexpr bool test_and_set(T bit, bool value)
|
||||
{
|
||||
const under s = shift(bit);
|
||||
const bool r = (m_data & s) != 0;
|
||||
m_data = (value ? (m_data | s) : (m_data & ~s));
|
||||
return r;
|
||||
}
|
||||
|
||||
constexpr bool test_and_reset(T bit)
|
||||
{
|
||||
bool r = (m_data & shift(bit)) != 0;
|
||||
m_data &= ~shift(bit);
|
||||
const under s = shift(bit);
|
||||
const bool r = (m_data & s) != 0;
|
||||
m_data &= ~s;
|
||||
return r;
|
||||
}
|
||||
|
||||
constexpr bool test_and_complement(T bit)
|
||||
{
|
||||
bool r = (m_data & shift(bit)) != 0;
|
||||
m_data ^= shift(bit);
|
||||
const under s = shift(bit);
|
||||
const bool r = (m_data & s) != 0;
|
||||
m_data ^= s;
|
||||
return r;
|
||||
}
|
||||
|
||||
constexpr bool test(bs_t arg) const
|
||||
{
|
||||
return (m_data & arg.m_data) != 0;
|
||||
}
|
||||
|
||||
constexpr bool all_of(bs_t arg) const
|
||||
{
|
||||
return (m_data & arg.m_data) == arg.m_data;
|
||||
|
||||
@@ -91,6 +91,24 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
}
|
||||
};
|
||||
|
||||
const auto write_binary = [&](auto value, u64 min_num)
|
||||
{
|
||||
if constexpr (sizeof(value) == 16)
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 128 - utils::clz128(value | 1)), '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 64 - std::countl_zero<u64>(value | 1)), '0');
|
||||
}
|
||||
|
||||
// Write in reversed order
|
||||
for (auto i = out.rbegin(); value; i++, value >>= 1)
|
||||
{
|
||||
*i = static_cast<usz>(value & 0b1) ? '1' : '0';
|
||||
}
|
||||
};
|
||||
|
||||
const auto write_decimal = [&](auto value, s64 min_size)
|
||||
{
|
||||
const usz start = out.size();
|
||||
@@ -635,6 +653,71 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
break;
|
||||
}
|
||||
|
||||
case 'b':
|
||||
case 'B':
|
||||
{
|
||||
if (!src.test(ctx.args)) [[unlikely]]
|
||||
{
|
||||
drop_sequence();
|
||||
break;
|
||||
}
|
||||
|
||||
const usz src_type = src.type(ctx.args);
|
||||
|
||||
if (!ctx.type || src_type > 8)
|
||||
{
|
||||
ctx.type = static_cast<u8>(src_type);
|
||||
|
||||
if (!ctx.type)
|
||||
{
|
||||
ctx.type = src.size_int;
|
||||
}
|
||||
}
|
||||
|
||||
const u64 mask =
|
||||
ctx.type == 1 ? 0xff :
|
||||
ctx.type == 2 ? 0xffff :
|
||||
ctx.type == 4 ? 0xffff'ffffu :
|
||||
0xffff'ffff'ffff'ffffu;
|
||||
|
||||
// Trunc sign-extended signed types
|
||||
const u64 val = src.template get<u64>(ctx.args) & mask;
|
||||
|
||||
const usz start = out.size();
|
||||
|
||||
if (!ctx.dot || ctx.prec)
|
||||
{
|
||||
if (ctx.type >= 16)
|
||||
{
|
||||
u128 val2 = *reinterpret_cast<const u128*>(val);
|
||||
write_binary(val2, ctx.prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
write_binary(val, ctx.prec);
|
||||
}
|
||||
}
|
||||
|
||||
const usz size2 = out.size() - start;
|
||||
|
||||
if (size2 < ctx.width)
|
||||
{
|
||||
// Add padding if necessary
|
||||
if (ctx.zeros && !ctx.left && !ctx.dot)
|
||||
{
|
||||
out.insert(out.begin() + start + (ctx.alter && val ? 2 : 0), ctx.width - size2, '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
out.insert(ctx.left ? out.end() : out.begin() + start, ctx.width - size2, ' ');
|
||||
}
|
||||
}
|
||||
|
||||
src.skip(ctx.args);
|
||||
ctx = {0};
|
||||
break;
|
||||
}
|
||||
|
||||
case 'p':
|
||||
{
|
||||
if (!src.test(ctx.args) || ctx.type) [[unlikely]]
|
||||
|
||||
@@ -29,7 +29,7 @@ void fmt_class_string<cheat_type>::format(std::string& out, u64 arg)
|
||||
|
||||
bool cheat_info::from_str(std::string_view cheat_line)
|
||||
{
|
||||
const auto cheat_vec = fmt::split(cheat_line, {"@@@"}, false);
|
||||
auto cheat_vec = fmt::split(cheat_line, {"@@@"}, false);
|
||||
|
||||
s64 val64 = 0;
|
||||
if (cheat_vec.size() != 5 || !try_to_int64(&val64, cheat_vec[2], 0, cheat_type_max - 1))
|
||||
@@ -38,11 +38,11 @@ bool cheat_info::from_str(std::string_view cheat_line)
|
||||
return false;
|
||||
}
|
||||
|
||||
game = cheat_vec[0];
|
||||
description = cheat_vec[1];
|
||||
game = std::move(cheat_vec[0]);
|
||||
description = std::move(cheat_vec[1]);
|
||||
type = cheat_type{::narrow<u8>(val64)};
|
||||
offset = std::stoul(cheat_vec[3]);
|
||||
red_script = cheat_vec[4];
|
||||
red_script = std::move(cheat_vec[4]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace date_time
|
||||
|
||||
std::string parse_buf;
|
||||
|
||||
if constexpr(separator != 0)
|
||||
if constexpr (separator != 0)
|
||||
parse_buf = std::string("%Y") + separator + "%m" + separator + "%d" + separator + "%H" + separator + "%M" + separator + "%S";
|
||||
else
|
||||
parse_buf = "%Y%m%d%H%M%S";
|
||||
|
||||
+61
-3
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <type_traits>
|
||||
|
||||
@@ -723,15 +724,24 @@ struct coord3_base
|
||||
struct { T width, height, depth; };
|
||||
};
|
||||
|
||||
constexpr coord3_base() : position{}, size{}
|
||||
constexpr coord3_base()
|
||||
: position{}, size{}
|
||||
{
|
||||
}
|
||||
|
||||
constexpr coord3_base(const position3_base<T>& position, const size3_base<T>& size) : position{ position }, size{ size }
|
||||
constexpr coord3_base(const position3_base<T>& position, const size3_base<T>& size)
|
||||
: position{ position }, size{ size }
|
||||
{
|
||||
}
|
||||
|
||||
constexpr coord3_base(T x, T y, T z, T width, T height, T depth) : x{ x }, y{ y }, z{ z }, width{ width }, height{ height }, depth{ depth }
|
||||
constexpr coord3_base(T x, T y, T z, T width, T height, T depth)
|
||||
: x{ x }, y{ y }, z{ z }, width{ width }, height{ height }, depth{ depth }
|
||||
{
|
||||
}
|
||||
|
||||
constexpr coord3_base(const area_base<T>& area, T z = 0, T depth = 1)
|
||||
: x{ area.x1 }, y{ area.y1 }, z{ z }
|
||||
, width{ area.x2 - area.x1 }, height{ area.y2 - area.y1 }, depth{ depth }
|
||||
{
|
||||
}
|
||||
|
||||
@@ -754,6 +764,51 @@ struct coord3_base
|
||||
{
|
||||
return{ static_cast<NT>(x), static_cast<NT>(y), static_cast<NT>(z), static_cast<NT>(width), static_cast<NT>(height), static_cast<NT>(depth) };
|
||||
}
|
||||
|
||||
void flip_horizontal()
|
||||
requires std::is_signed_v<T>
|
||||
{
|
||||
auto x2 = x + width;
|
||||
x = x2;
|
||||
width = -width;
|
||||
}
|
||||
|
||||
void flip_vertical()
|
||||
requires std::is_signed_v<T>
|
||||
{
|
||||
auto y2 = y + height;
|
||||
y = y2;
|
||||
height = -height;
|
||||
}
|
||||
|
||||
bool is_flipped() const
|
||||
requires std::is_signed_v<T>
|
||||
{
|
||||
return width < 0 || height < 0 || depth < 0;
|
||||
}
|
||||
|
||||
area_base<T> to_area() const
|
||||
{
|
||||
return { x, y, x + width, y + height };
|
||||
}
|
||||
|
||||
T abs_width() const
|
||||
requires std::is_signed_v<T>
|
||||
{
|
||||
return width < 0 ? -width : width;
|
||||
}
|
||||
|
||||
T abs_height() const
|
||||
requires std::is_signed_v<T>
|
||||
{
|
||||
return height < 0 ? -height : height;
|
||||
}
|
||||
|
||||
T abs_depth() const
|
||||
requires std::is_signed_v<T>
|
||||
{
|
||||
return depth < 0 ? -depth : depth;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1027,3 +1082,6 @@ using color1u = color1_base<unsigned int>;
|
||||
using color1i = color1_base<int>;
|
||||
using color1f = color1_base<float>;
|
||||
using color1d = color1_base<double>;
|
||||
|
||||
using mat3f = color3_base<float>[3];
|
||||
static_assert(sizeof(mat3f) == sizeof(float) * 3 * 3);
|
||||
|
||||
@@ -28,6 +28,11 @@ class shared_mutex final
|
||||
public:
|
||||
constexpr shared_mutex() = default;
|
||||
|
||||
const atomic_t<u32>& raw() const
|
||||
{
|
||||
return m_value;
|
||||
}
|
||||
|
||||
bool try_lock_shared()
|
||||
{
|
||||
const u32 value = m_value.load();
|
||||
|
||||
@@ -10,6 +10,19 @@ rXmlNode::rXmlNode(const pugi::xml_node& node)
|
||||
handle = node;
|
||||
}
|
||||
|
||||
std::shared_ptr<rXmlNode> rXmlNode::GetChild(std::string_view name)
|
||||
{
|
||||
if (handle)
|
||||
{
|
||||
if (const pugi::xml_node child = handle.child(name))
|
||||
{
|
||||
return std::make_shared<rXmlNode>(child);
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<rXmlNode> rXmlNode::GetChildren()
|
||||
{
|
||||
if (handle)
|
||||
|
||||
@@ -20,6 +20,7 @@ struct rXmlNode
|
||||
{
|
||||
rXmlNode();
|
||||
rXmlNode(const pugi::xml_node& node);
|
||||
std::shared_ptr<rXmlNode> GetChild(std::string_view name);
|
||||
std::shared_ptr<rXmlNode> GetChildren();
|
||||
std::shared_ptr<rXmlNode> GetNext();
|
||||
std::string GetName();
|
||||
|
||||
+7
-1
@@ -41,7 +41,13 @@ void semaphore_base::imp_wait()
|
||||
// Add waiter
|
||||
value += c_waiter;
|
||||
}
|
||||
});
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}).first;
|
||||
|
||||
if (value & c_value_mask)
|
||||
{
|
||||
|
||||
+64
-16
@@ -13,6 +13,33 @@
|
||||
|
||||
namespace utils
|
||||
{
|
||||
void clean_backtrace(std::vector<std::string>& result)
|
||||
{
|
||||
for (usz it = 1, first_in_seq = 0, del_count = 0;;)
|
||||
{
|
||||
if (it >= result.size() || result[it] != result[first_in_seq])
|
||||
{
|
||||
if (del_count)
|
||||
{
|
||||
fmt::append(result[first_in_seq], " x%u", del_count + 1);
|
||||
}
|
||||
|
||||
if (it < result.size())
|
||||
{
|
||||
first_in_seq = it;
|
||||
it++;
|
||||
del_count = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
result.erase(result.begin() + it);
|
||||
del_count++;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
std::string wstr_to_utf8(LPWSTR data, int str_len)
|
||||
{
|
||||
@@ -30,42 +57,61 @@ namespace utils
|
||||
return out.data();
|
||||
}
|
||||
|
||||
std::vector<void*> get_backtrace(int max_depth)
|
||||
std::vector<void*> get_backtrace(int max_depth, PCONTEXT ctx)
|
||||
{
|
||||
static struct sym_initer_t
|
||||
{
|
||||
sym_initer_t() noexcept
|
||||
{
|
||||
SymInitialize(GetCurrentProcess(), NULL, TRUE);
|
||||
}
|
||||
~sym_initer_t() noexcept
|
||||
{
|
||||
SymCleanup(GetCurrentProcess());
|
||||
}
|
||||
} s_initer{};
|
||||
|
||||
std::vector<void*> result = {};
|
||||
|
||||
const auto hProcess = ::GetCurrentProcess();
|
||||
const auto hThread = ::GetCurrentThread();
|
||||
|
||||
CONTEXT context{};
|
||||
RtlCaptureContext(&context);
|
||||
if (ctx)
|
||||
context = *ctx;
|
||||
else
|
||||
RtlCaptureContext(&context);
|
||||
|
||||
STACKFRAME64 stack = {};
|
||||
stack.AddrPC.Mode = AddrModeFlat;
|
||||
stack.AddrStack.Mode = AddrModeFlat;
|
||||
stack.AddrFrame.Mode = AddrModeFlat;
|
||||
#if defined(ARCH_X64)
|
||||
const DWORD machineType = IMAGE_FILE_MACHINE_AMD64;
|
||||
stack.AddrPC.Offset = context.Rip;
|
||||
stack.AddrStack.Offset = context.Rsp;
|
||||
stack.AddrFrame.Offset = context.Rbp;
|
||||
#elif defined(ARCH_ARM64)
|
||||
const DWORD machineType = IMAGE_FILE_MACHINE_ARM64;
|
||||
stack.AddrPC.Offset = context.Pc;
|
||||
stack.AddrStack.Offset = context.Sp;
|
||||
stack.AddrFrame.Offset = context.Fp;
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
|
||||
while (max_depth--)
|
||||
{
|
||||
if (!StackWalk64(
|
||||
IMAGE_FILE_MACHINE_AMD64,
|
||||
hProcess,
|
||||
hThread,
|
||||
&stack,
|
||||
&context,
|
||||
NULL,
|
||||
SymFunctionTableAccess64,
|
||||
SymGetModuleBase64,
|
||||
NULL))
|
||||
machineType,
|
||||
hProcess,
|
||||
hThread,
|
||||
&stack,
|
||||
&context,
|
||||
NULL,
|
||||
SymFunctionTableAccess64,
|
||||
SymGetModuleBase64,
|
||||
NULL))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -100,26 +146,27 @@ namespace utils
|
||||
|
||||
if (sym->NameLen)
|
||||
{
|
||||
const auto function_name = wstr_to_utf8(sym->Name, static_cast<int>(sym->NameLen));
|
||||
std::string function_name = wstr_to_utf8(sym->Name, static_cast<int>(sym->NameLen));
|
||||
|
||||
// Attempt to get file and line information if available
|
||||
DWORD unused2;
|
||||
if (SymGetLineFromAddrW64(hProcess, reinterpret_cast<DWORD64>(pointer), &unused2, &line_info))
|
||||
{
|
||||
const auto full_path = fmt::format("%s:%u %s", wstr_to_utf8(line_info.FileName, -1), line_info.LineNumber, function_name);
|
||||
result.push_back(full_path);
|
||||
std::string full_path = fmt::format("%s:%u %s", wstr_to_utf8(line_info.FileName, -1), line_info.LineNumber, function_name);
|
||||
result.push_back(std::move(full_path));
|
||||
}
|
||||
else
|
||||
{
|
||||
result.push_back(function_name);
|
||||
result.push_back(std::move(function_name));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result.push_back(fmt::format("rpcs3@0xp", pointer));
|
||||
result.push_back(fmt::format("rpcs3@0x%p", pointer));
|
||||
}
|
||||
}
|
||||
|
||||
clean_backtrace(result);
|
||||
return result;
|
||||
}
|
||||
#else
|
||||
@@ -147,6 +194,7 @@ namespace utils
|
||||
|
||||
free(symbols);
|
||||
#endif
|
||||
clean_backtrace(result);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
+12
-2
@@ -2,6 +2,11 @@
|
||||
#include <util/types.hpp>
|
||||
#include <util/logs.hpp>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
namespace utils
|
||||
{
|
||||
namespace stack_trace
|
||||
@@ -9,7 +14,7 @@ namespace utils
|
||||
// Printing utilities
|
||||
|
||||
template <typename T>
|
||||
concept Logger = requires (T& t, const std::string& msg)
|
||||
concept Logger = requires (T& t, std::string_view msg)
|
||||
{
|
||||
{ t.print(msg) };
|
||||
};
|
||||
@@ -23,14 +28,19 @@ namespace utils
|
||||
: log(chan)
|
||||
{}
|
||||
|
||||
void print(const std::string& s)
|
||||
void print(std::string_view s)
|
||||
{
|
||||
log.error("%s", s);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
std::vector<void*> get_backtrace(int max_depth = 255, PCONTEXT ctx = nullptr);
|
||||
#else
|
||||
std::vector<void*> get_backtrace(int max_depth = 255);
|
||||
#endif
|
||||
|
||||
std::vector<std::string> get_backtrace_symbols(const std::vector<void*>& stack);
|
||||
|
||||
FORCE_INLINE void print_trace(stack_trace::Logger auto& logger, int max_depth = 255)
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
#include "stdafx.h"
|
||||
#include "stereo_config.h"
|
||||
#include "Emu/system_config.h"
|
||||
|
||||
stereo_config::stereo_matrices::stereo_matrices(const std::array<color3_base<f32>, 3>& l, const std::array<color3_base<f32>, 3>& r)
|
||||
{
|
||||
for (usz i = 0; i < 3; i++)
|
||||
{
|
||||
left[i] = l[i];
|
||||
right[i] = r[i];
|
||||
}
|
||||
}
|
||||
|
||||
atomic_t<bool> stereo_config::s_live_preview_enabled = false;
|
||||
stereo_config::stereo_matrices stereo_config::m_live_matrices = {};
|
||||
|
||||
const std::unordered_map<stereo_render_mode_options, stereo_config::stereo_matrices> stereo_config::m_matrices =
|
||||
{
|
||||
{stereo_render_mode_options::anaglyph_red_cyan, stereo_matrices(
|
||||
{
|
||||
color3_base<f32>(1, 0, 0),
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 0)
|
||||
},
|
||||
{
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 1, 0),
|
||||
color3_base<f32>(0, 0, 1)
|
||||
}
|
||||
)},
|
||||
{stereo_render_mode_options::anaglyph_red_green, stereo_matrices(
|
||||
{
|
||||
color3_base<f32>(1, 0, 0),
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 0)
|
||||
},
|
||||
{
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 1, 0),
|
||||
color3_base<f32>(0, 0, 0)
|
||||
}
|
||||
)},
|
||||
{stereo_render_mode_options::anaglyph_red_blue, stereo_matrices(
|
||||
{
|
||||
color3_base<f32>(1, 0, 0),
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 0)
|
||||
},
|
||||
{
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 1)
|
||||
}
|
||||
)},
|
||||
{stereo_render_mode_options::anaglyph_magenta_cyan, stereo_matrices(
|
||||
{
|
||||
color3_base<f32>(1, 0, 0),
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 0.5f)
|
||||
},
|
||||
{
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 1, 0),
|
||||
color3_base<f32>(0, 0, 0.5f)
|
||||
}
|
||||
)},
|
||||
{stereo_render_mode_options::anaglyph_trioscopic, stereo_matrices(
|
||||
{
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 1, 0),
|
||||
color3_base<f32>(0, 0, 0)
|
||||
},
|
||||
{
|
||||
color3_base<f32>(1, 0, 0),
|
||||
color3_base<f32>(0, 0, 0),
|
||||
color3_base<f32>(0, 0, 1)
|
||||
}
|
||||
)},
|
||||
{stereo_render_mode_options::anaglyph_amber_blue, stereo_matrices(
|
||||
{
|
||||
color3_base<f32>(1, 0, 0),
|
||||
color3_base<f32>(0, 1, 0),
|
||||
color3_base<f32>(0, 0, 0)
|
||||
},
|
||||
{
|
||||
color3_base<f32>(0, 0, 1.0f / 3.0f),
|
||||
color3_base<f32>(0, 0, 1.0f / 3.0f),
|
||||
color3_base<f32>(0, 0, 1.0f / 3.0f)
|
||||
}
|
||||
)},
|
||||
};
|
||||
|
||||
void stereo_config::update_from_config(bool stereo_enabled)
|
||||
{
|
||||
m_stereo_mode = stereo_enabled ? g_cfg.video.stereo_render_mode.get() : stereo_render_mode_options::disabled;
|
||||
|
||||
if (m_stereo_mode == stereo_render_mode_options::anaglyph_custom)
|
||||
{
|
||||
stereo_config::convert_matrix(m_custom_matrices.left, g_cfg.video.custom_anaglyph_matrices.left.get_map());
|
||||
stereo_config::convert_matrix(m_custom_matrices.right, g_cfg.video.custom_anaglyph_matrices.right.get_map());
|
||||
}
|
||||
}
|
||||
|
||||
const stereo_config::stereo_matrices& stereo_config::matrices() const
|
||||
{
|
||||
if (m_in_emulation && s_live_preview_enabled)
|
||||
{
|
||||
return m_live_matrices;
|
||||
}
|
||||
|
||||
switch (m_stereo_mode)
|
||||
{
|
||||
case stereo_render_mode_options::disabled:
|
||||
case stereo_render_mode_options::side_by_side:
|
||||
case stereo_render_mode_options::over_under:
|
||||
case stereo_render_mode_options::interlaced:
|
||||
break;
|
||||
case stereo_render_mode_options::anaglyph_red_green:
|
||||
case stereo_render_mode_options::anaglyph_red_blue:
|
||||
case stereo_render_mode_options::anaglyph_red_cyan:
|
||||
case stereo_render_mode_options::anaglyph_magenta_cyan:
|
||||
case stereo_render_mode_options::anaglyph_trioscopic:
|
||||
case stereo_render_mode_options::anaglyph_amber_blue:
|
||||
return ::at32(m_matrices, m_stereo_mode);
|
||||
case stereo_render_mode_options::anaglyph_custom:
|
||||
return m_custom_matrices;
|
||||
}
|
||||
|
||||
static const stereo_matrices s_left_only_matrices = stereo_matrices(
|
||||
{
|
||||
color3_base<float>(1, 0, 0),
|
||||
color3_base<float>(0, 1, 0),
|
||||
color3_base<float>(0, 0, 1)
|
||||
},
|
||||
{
|
||||
color3_base<float>(0, 0, 0),
|
||||
color3_base<float>(0, 0, 0),
|
||||
color3_base<float>(0, 0, 0)
|
||||
});
|
||||
return s_left_only_matrices;
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> stereo_config::get_custom_matrix(bool is_left) const
|
||||
{
|
||||
return convert_matrix(is_left ? m_custom_matrices.left : m_custom_matrices.right);
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> stereo_config::convert_matrix(const mat3f& mat)
|
||||
{
|
||||
std::map<std::string, std::string> values {};
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
values[fmt::format("%d%d", i, j)] = fmt::format("%f", mat[i].rgb[j]);
|
||||
}
|
||||
}
|
||||
return values;
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
#pragma once
|
||||
|
||||
#include "geometry.h"
|
||||
#include "Emu/system_config_types.h"
|
||||
#include "util/atomic.hpp"
|
||||
#include "Utilities/StrFmt.h"
|
||||
#include "Utilities/StrUtil.h"
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
|
||||
struct stereo_config
|
||||
{
|
||||
public:
|
||||
struct stereo_matrices
|
||||
{
|
||||
stereo_matrices() = default;
|
||||
stereo_matrices(const std::array<color3_base<f32>, 3>& l, const std::array<color3_base<f32>, 3>& r);
|
||||
|
||||
mat3f left {};
|
||||
mat3f right {};
|
||||
};
|
||||
|
||||
stereo_config(bool in_emulation) : m_in_emulation(in_emulation) {}
|
||||
|
||||
void set_stereo_mode(stereo_render_mode_options mode) { m_stereo_mode = mode; }
|
||||
stereo_render_mode_options stereo_mode() const { return m_stereo_mode; }
|
||||
|
||||
const stereo_matrices& matrices() const;
|
||||
|
||||
void update_from_config(bool stereo_enabled);
|
||||
|
||||
void set_custom_matrices(const stereo_matrices& matrices) { m_custom_matrices = matrices; }
|
||||
static void set_live_matrices(const stereo_matrices& matrices) { m_live_matrices = matrices; }
|
||||
|
||||
std::map<std::string, std::string> get_custom_matrix(bool is_left) const;
|
||||
|
||||
template <typename T>
|
||||
static void convert_matrix(mat3f& mat, const T& values)
|
||||
{
|
||||
mat[0] = {};
|
||||
mat[1] = {};
|
||||
mat[2] = {};
|
||||
|
||||
if (values.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
const std::string key = fmt::format("%d%d", i, j);
|
||||
const auto it = values.find(key);
|
||||
if (it == values.cend()) continue;
|
||||
|
||||
const std::string& val_s = it->second;
|
||||
if (val_s.empty()) continue;
|
||||
|
||||
if (f64 val = 0.0f; try_to_float(&val, val_s, -10.0f, 10.0f))
|
||||
{
|
||||
mat[i].rgb[j] = static_cast<f32>(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static std::map<std::string, std::string> convert_matrix(const mat3f& mat);
|
||||
|
||||
static atomic_t<bool> s_live_preview_enabled;
|
||||
|
||||
private:
|
||||
stereo_matrices m_custom_matrices {};
|
||||
stereo_render_mode_options m_stereo_mode = stereo_render_mode_options::disabled;
|
||||
bool m_in_emulation = false;
|
||||
|
||||
static stereo_matrices m_live_matrices;
|
||||
static const std::unordered_map<stereo_render_mode_options, stereo_matrices> m_matrices;
|
||||
};
|
||||
+1
-1
@@ -74,7 +74,7 @@ enum
|
||||
};
|
||||
#endif
|
||||
|
||||
inline int futex(volatile void* uaddr, int futex_op, uint val, const timespec* timeout = nullptr, uint mask = 0)
|
||||
inline int futex(volatile void* uaddr, int futex_op, uint val, const timespec* timeout = nullptr, [[maybe_unused]] uint mask = 0)
|
||||
{
|
||||
#ifdef __linux__
|
||||
return syscall(SYS_futex, uaddr, futex_op, static_cast<int>(val), timeout, nullptr, static_cast<int>(mask));
|
||||
|
||||
@@ -33,7 +33,7 @@ public:
|
||||
std::lock_guard lock(mutex);
|
||||
if (std::shared_ptr<void> new_val = std::invoke(func); new_val)
|
||||
{
|
||||
storage.push_back(new_val);
|
||||
storage.push_back(std::move(new_val));
|
||||
}
|
||||
delete_unused();
|
||||
}
|
||||
|
||||
+9
-10
@@ -24,29 +24,27 @@ namespace utils
|
||||
return (m_hi << 24) | (m_mid << 16) | (m_lo << 8) | ((uint(m_type) & 0xf) << 4) | (m_type_index & 0xf);
|
||||
}
|
||||
|
||||
std::string version::to_string() const
|
||||
std::string version::to_string(bool simple) const
|
||||
{
|
||||
std::string version = std::to_string(hi()) + "." + std::to_string(mid());
|
||||
std::string version = fmt::format("%d.%d", hi(), mid());
|
||||
|
||||
if (lo())
|
||||
{
|
||||
version += '.';
|
||||
version += std::to_string(lo());
|
||||
fmt::append(version, ".%d", lo());
|
||||
}
|
||||
|
||||
if (type() != version_type::release)
|
||||
if (!simple && type() != version_type::release)
|
||||
{
|
||||
if (!postfix().empty())
|
||||
{
|
||||
version += "-" + postfix();
|
||||
fmt::append(version, "-%s", postfix());
|
||||
}
|
||||
|
||||
version += ' ';
|
||||
version += utils::to_string(type());
|
||||
fmt::append(version, " %s", utils::to_string(type()));
|
||||
|
||||
if (type_index() > 1)
|
||||
{
|
||||
version += " " + std::to_string(type_index());
|
||||
fmt::append(version, " %d", type_index());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +55,8 @@ namespace utils
|
||||
int compare_versions(const std::string& v1, const std::string& v2, bool& ok)
|
||||
{
|
||||
// Check if both version strings are valid
|
||||
ok = std::regex_match(v1, std::regex("[0-9.]*")) && std::regex_match(v2, std::regex("[0-9.]*"));
|
||||
static const std::regex comp = std::regex("[0-9.]*");
|
||||
ok = std::regex_match(v1, comp) && std::regex_match(v2, comp);
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
|
||||
+4
-4
@@ -23,10 +23,10 @@ namespace utils
|
||||
uint m_lo;
|
||||
version_type m_type = version_type::release;
|
||||
uint m_type_index = 1;
|
||||
const char* m_postfix;
|
||||
std::string_view m_postfix;
|
||||
|
||||
public:
|
||||
constexpr version(uint hi, uint mid, uint lo, version_type type, uint type_index, const char* postfix)
|
||||
constexpr version(uint hi, uint mid, uint lo, version_type type, uint type_index, std::string_view postfix)
|
||||
: m_hi(hi)
|
||||
, m_mid(mid)
|
||||
, m_lo(lo)
|
||||
@@ -56,7 +56,7 @@ namespace utils
|
||||
return m_type;
|
||||
}
|
||||
|
||||
std::string postfix() const
|
||||
std::string_view postfix() const
|
||||
{
|
||||
return m_postfix;
|
||||
}
|
||||
@@ -67,7 +67,7 @@ namespace utils
|
||||
}
|
||||
|
||||
uint to_hex() const;
|
||||
std::string to_string() const;
|
||||
std::string to_string(bool simple = false) const;
|
||||
};
|
||||
|
||||
// Generic version comparison (e.g. 0.0.5 vs 1.3)
|
||||
|
||||
@@ -37,10 +37,6 @@ QSlider#sizeSlider::handle:horizontal {
|
||||
QLabel#toolbar_icon_color {
|
||||
color: rgba(64,64,64,255);
|
||||
}
|
||||
/* thumbnail icon color stylesheet */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: rgba(0,100,231,255);
|
||||
}
|
||||
/* gamelist icon color stylesheet */
|
||||
QLabel#gamelist_icon_background_color {
|
||||
color: rgba(209,209,209,255);
|
||||
|
||||
@@ -237,11 +237,6 @@ QLabel#gamelist_icon_background_color {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #262626;
|
||||
}
|
||||
|
||||
/* Set Log colors */
|
||||
QPlainTextEdit#log_frame {
|
||||
background-color: #000; /* Black */
|
||||
|
||||
@@ -573,11 +573,6 @@ QLabel#gamelist_icon_background_color {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #23262d;
|
||||
}
|
||||
|
||||
/* Log colors */
|
||||
QPlainTextEdit#log_frame {
|
||||
background-color: #23262d;
|
||||
|
||||
@@ -208,6 +208,16 @@ QComboBox {
|
||||
padding-bottom: 0.2em;
|
||||
padding-left: 0.4em;
|
||||
}
|
||||
QComboBox QAbstractItemView {
|
||||
background-color: #323232;
|
||||
color: #fff;
|
||||
border: 0.05em solid #1e1e1e;
|
||||
}
|
||||
QComboBox QAbstractItemView::item:selected,
|
||||
QComboBox QAbstractItemView::item:hover {
|
||||
background-color: #444444;
|
||||
color: #fff;
|
||||
}
|
||||
QComboBox::disabled {
|
||||
background-color: #828790;
|
||||
color: #fff;
|
||||
@@ -265,11 +275,6 @@ QLabel#gamelist_icon_background_color {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
/* Set Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #444444;
|
||||
}
|
||||
|
||||
/* Memory Viewer */
|
||||
QLabel#memory_viewer_address_panel {
|
||||
color: #00cbff; /* Font Color: Blue */
|
||||
|
||||
@@ -244,11 +244,6 @@ QLabel#gamelist_icon_background_color {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #262626;
|
||||
}
|
||||
|
||||
/* Set Log colors */
|
||||
QPlainTextEdit#log_frame {
|
||||
background-color: #181d24; /* Black */
|
||||
|
||||
@@ -397,12 +397,6 @@ QLabel#gamelist_icon_background_color {
|
||||
}
|
||||
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #ffd785;
|
||||
}
|
||||
|
||||
|
||||
QLabel#log_level_always {
|
||||
color: #00ffff; /* Cyan */
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -656,11 +656,6 @@ QLabel#color_button {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #370048;
|
||||
}
|
||||
|
||||
/* Debugger colors */
|
||||
QLabel#debugger_frame_breakpoint {
|
||||
color: #000; /* Font Color: Black */
|
||||
|
||||
@@ -664,11 +664,6 @@ QLabel#color_button {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #8500ae;
|
||||
}
|
||||
|
||||
/* Debugger colors */
|
||||
QLabel#debugger_frame_breakpoint {
|
||||
color: #000; /* Font Color: Black */
|
||||
|
||||
@@ -349,24 +349,24 @@ QPushButton:disabled {
|
||||
}
|
||||
|
||||
|
||||
QDialog QDialogButtonBox QPushButton {
|
||||
QDialog QDialogButtonBox QPushButton:default {
|
||||
color: #000000;
|
||||
background-color: #4CC2FF;
|
||||
border-color: #5AC7FF;
|
||||
}
|
||||
|
||||
QDialog QDialogButtonBox QPushButton:hover {
|
||||
QDialog QDialogButtonBox QPushButton:default:hover {
|
||||
background-color: #48B2E9;
|
||||
border-color: #56B8EB;
|
||||
}
|
||||
|
||||
QDialog QDialogButtonBox QPushButton:pressed {
|
||||
QDialog QDialogButtonBox QPushButton:default:pressed {
|
||||
color: #22526A;
|
||||
background-color: #45A4D5;
|
||||
border-color: #45A4D5;
|
||||
}
|
||||
|
||||
QDialog QDialogButtonBox QPushButton:disabled {
|
||||
QDialog QDialogButtonBox QPushButton:default:disabled {
|
||||
color: #ABABAB;
|
||||
background-color: #4C4C4C;
|
||||
border-color: #4C4C4C;
|
||||
@@ -614,10 +614,15 @@ QComboBox QAbstractItemView {
|
||||
QComboBox QAbstractItemView::item {
|
||||
color: #FFFFFF;
|
||||
padding: 4px 6px;
|
||||
margin: 2px 0px;
|
||||
background-color: transparent;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item:hover {
|
||||
background-color: #383838;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item:selected {
|
||||
background-color: #383838;
|
||||
}
|
||||
@@ -642,7 +647,7 @@ QDoubleSpinBox::up-button, QDoubleSpinBox::down-button {
|
||||
border-radius: 4px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
padding: 3px 4px;
|
||||
padding: 3px 4px;
|
||||
}
|
||||
|
||||
QSpinBox::up-button:hover, QSpinBox::down-button:hover,
|
||||
@@ -709,6 +714,16 @@ QSlider::handle:horizontal:disabled {
|
||||
image: url("GuiConfigs/dark/slider-handle-disabled.svg");
|
||||
}
|
||||
|
||||
QSlider::sub-page:horizontal {
|
||||
background-color: #4CC2FF;
|
||||
border-radius: 2px;
|
||||
height: 4px;
|
||||
}
|
||||
|
||||
QSlider::sub-page:horizontal:disabled {
|
||||
background-color: #767A7D;
|
||||
}
|
||||
|
||||
|
||||
/* LINE EDIT */
|
||||
QLineEdit {
|
||||
@@ -791,7 +806,7 @@ QMenuBar::item:pressed {
|
||||
|
||||
QMenu {
|
||||
background-color: #2C2C2C;
|
||||
border: 1px solid #131313;
|
||||
border: 1px solid #3E3E3E;
|
||||
padding: 4px 0px;
|
||||
}
|
||||
|
||||
@@ -799,12 +814,12 @@ QMenu::item {
|
||||
color: #FFFFFF;
|
||||
background-color: transparent;
|
||||
border-radius: 4px;
|
||||
padding: 8px 20px;
|
||||
padding: 4px 20px;
|
||||
margin: 0px 4px;
|
||||
}
|
||||
|
||||
QMenu::item:selected {
|
||||
background-color: #383838;
|
||||
background-color: #353535;
|
||||
}
|
||||
|
||||
QMenu::item:disabled {
|
||||
@@ -814,8 +829,8 @@ QMenu::item:disabled {
|
||||
|
||||
QMenu::separator {
|
||||
height: 1px;
|
||||
background: #131313;
|
||||
margin: 4px 0px;
|
||||
background: #3E3E3E;
|
||||
margin: 4px 8px;
|
||||
}
|
||||
|
||||
QMenu::indicator, QMenu::right-arrow {
|
||||
|
||||
@@ -349,24 +349,24 @@ QPushButton:disabled {
|
||||
}
|
||||
|
||||
|
||||
QDialog QDialogButtonBox QPushButton {
|
||||
QDialog QDialogButtonBox QPushButton:default {
|
||||
color: #FFFFFF;
|
||||
background-color: #0067C0;
|
||||
border-color: #1473C5;
|
||||
}
|
||||
|
||||
QDialog QDialogButtonBox QPushButton:hover {
|
||||
QDialog QDialogButtonBox QPushButton:default:hover {
|
||||
background-color: #1A76C6;
|
||||
border-color: #2C80CA;
|
||||
}
|
||||
|
||||
QDialog QDialogButtonBox QPushButton:pressed {
|
||||
QDialog QDialogButtonBox QPushButton:default:pressed {
|
||||
color: #C2DAEF;
|
||||
background-color: #3284CB;
|
||||
border-color: #3284CB;
|
||||
}
|
||||
|
||||
QDialog QDialogButtonBox QPushButton:disabled {
|
||||
QDialog QDialogButtonBox QPushButton:default:disabled {
|
||||
color: #FFFFFF;
|
||||
background-color: #C5C5C5;
|
||||
border-color: #C5C5C5;
|
||||
@@ -614,10 +614,15 @@ QComboBox QAbstractItemView {
|
||||
QComboBox QAbstractItemView::item {
|
||||
color: #1B1B1B;
|
||||
padding: 4px 6px;
|
||||
margin: 2px 0px;
|
||||
background-color: transparent;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item:hover {
|
||||
background-color: #F0F0F0;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item:selected {
|
||||
background-color: #F0F0F0;
|
||||
}
|
||||
@@ -642,7 +647,7 @@ QDoubleSpinBox::up-button, QDoubleSpinBox::down-button {
|
||||
border-radius: 4px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
padding: 3px 4px;
|
||||
padding: 3px 4px;
|
||||
}
|
||||
|
||||
QSpinBox::up-button:hover, QSpinBox::down-button:hover,
|
||||
@@ -709,6 +714,16 @@ QSlider::handle:horizontal:disabled {
|
||||
image: url("GuiConfigs/light/slider-handle-disabled.svg");
|
||||
}
|
||||
|
||||
QSlider::sub-page:horizontal {
|
||||
background-color: #1A76C6;
|
||||
border-radius: 2px;
|
||||
height: 4px;
|
||||
}
|
||||
|
||||
QSlider::sub-page:horizontal:disabled {
|
||||
background-color: #868788;
|
||||
}
|
||||
|
||||
|
||||
/* LINE EDIT */
|
||||
QLineEdit {
|
||||
@@ -791,7 +806,7 @@ QMenuBar::item:pressed {
|
||||
|
||||
QMenu {
|
||||
background-color: #F9F9F9;
|
||||
border: 1px solid #EEEEEE;
|
||||
border: 1px solid #E5E5E5;
|
||||
padding: 4px 0px;
|
||||
}
|
||||
|
||||
@@ -799,7 +814,7 @@ QMenu::item {
|
||||
color: #1B1B1B;
|
||||
background-color: transparent;
|
||||
border-radius: 4px;
|
||||
padding: 8px 20px;
|
||||
padding: 4px 20px;
|
||||
margin: 0px 4px;
|
||||
}
|
||||
|
||||
@@ -814,8 +829,8 @@ QMenu::item:disabled {
|
||||
|
||||
QMenu::separator {
|
||||
height: 1px;
|
||||
background: #EEEEEE;
|
||||
margin: 4px 0px;
|
||||
background: #E5E5E5;
|
||||
margin: 4px 8px;
|
||||
}
|
||||
|
||||
QMenu::indicator, QMenu::right-arrow {
|
||||
|
||||
@@ -379,11 +379,6 @@ QLabel#gamelist_icon_background_color {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
/* Set Windows Taskbar Thumbnail colors */
|
||||
QLabel#thumbnail_icon_color {
|
||||
color: #4d4940;
|
||||
}
|
||||
|
||||
QLabel#log_level_always {
|
||||
color: #00ffff; /* Cyan */
|
||||
}
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 999 B |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user