mirror of
https://github.com/libretro/RetroArch.git
synced 2026-11-13 04:51:38 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e115baf36 | ||
|
|
d9fabec88e | ||
|
|
4c6b13919c | ||
|
|
d762519b8e | ||
|
|
42537a67e1 | ||
|
|
8098c5978f | ||
|
|
a88bc56ede | ||
|
|
80f36e16d0 | ||
|
|
4ed7ad8465 | ||
|
|
47dbaeabb8 | ||
|
|
2cbed1ac5d | ||
|
|
b49d6e9d3a | ||
|
|
52aabc02ba | ||
|
|
e91e9336a9 | ||
|
|
3c8f539d3b | ||
|
|
0c18da5d49 | ||
|
|
a00ab53ef6 | ||
|
|
dba4ca04ee | ||
|
|
43a65ec65a | ||
|
|
5f8419b8d2 | ||
|
|
42e2d740d3 | ||
|
|
2782b87267 | ||
|
|
4b364fa1e1 | ||
|
|
649f83c82e | ||
|
|
85d60bac8f | ||
|
|
ffdbb968f9 | ||
|
|
20380a8042 | ||
|
|
685948368e | ||
|
|
1099b58793 | ||
|
|
122a68385f | ||
|
|
85bbba84c2 | ||
|
|
69e2bd986d | ||
|
|
439aee616e | ||
|
|
4f78264541 | ||
|
|
cc43f3a355 | ||
|
|
367cf5985d | ||
|
|
bba60163f7 | ||
|
|
8593b10bee | ||
|
|
950823e90b | ||
|
|
01bd76405f | ||
|
|
b74b8b6a6c | ||
|
|
b46a316df9 | ||
|
|
34af28461f | ||
|
|
6e979931a1 | ||
|
|
c7cd327b5b | ||
|
|
dd79629015 | ||
|
|
5b81b6887b | ||
|
|
9d65f7e633 | ||
|
|
60ca3d0ad7 | ||
|
|
9ede38df93 | ||
|
|
52ff31f877 | ||
|
|
6cc9a3f9b4 | ||
|
|
6690790dae | ||
|
|
d03a0a7b51 | ||
|
|
8173db0c4a | ||
|
|
00df029557 | ||
|
|
d998f86f1f | ||
|
|
6f51ef5966 | ||
|
|
4a91b11806 | ||
|
|
6e621a98d9 | ||
|
|
4e49114c5c | ||
|
|
2c956fbe85 | ||
|
|
321ede2256 | ||
|
|
1cdd3c32c0 | ||
|
|
45f90ad89a | ||
|
|
6092de544c | ||
|
|
0e907f01ca | ||
|
|
c1d63ca7c1 | ||
|
|
451a06076d | ||
|
|
5a064ef4ca | ||
|
|
d85eb927c1 | ||
|
|
784904071a | ||
|
|
d903d684a0 | ||
|
|
c2044beedd | ||
|
|
eb78b608d3 | ||
|
|
0b95a8838a | ||
|
|
ecfdc867f8 | ||
|
|
e40d381f6b | ||
|
|
255794d903 | ||
|
|
d1d8386343 | ||
|
|
a7ab21ac15 | ||
|
|
88a93dc648 | ||
|
|
8cc220a4d2 | ||
|
|
11520f9704 | ||
|
|
dee0c5dbca | ||
|
|
f12ac35438 | ||
|
|
42984968f2 | ||
|
|
f96e148f74 | ||
|
|
e2e5366925 | ||
|
|
dc967f41ec | ||
|
|
204f705b35 | ||
|
|
dc10dc4702 | ||
|
|
d8cf551608 | ||
|
|
9c1d40c364 | ||
|
|
3eaf7d5e66 | ||
|
|
6ddbf911e3 | ||
|
|
1979b42834 | ||
|
|
cd01e0a048 | ||
|
|
a7ebae35de | ||
|
|
f9c771b4a8 | ||
|
|
cf3cdbbcc9 | ||
|
|
39279292ef | ||
|
|
fa069c28f3 | ||
|
|
4fb59f5319 | ||
|
|
1b5796b321 | ||
|
|
2c94d9a573 | ||
|
|
cabab419c5 | ||
|
|
ffb1f0b67b | ||
|
|
42ad070a1d | ||
|
|
a4590acde9 | ||
|
|
479a3ab9a3 | ||
|
|
a14d54b3fd | ||
|
|
5d58acd2c0 | ||
|
|
108bbf0bf6 | ||
|
|
d893e880ec | ||
|
|
df4428bd7a | ||
|
|
02132985af | ||
|
|
9aafd3c723 | ||
|
|
7ee5ffcd1c | ||
|
|
703cc7198d | ||
|
|
d924c656b7 | ||
|
|
a0e6a9e1d5 | ||
|
|
cfc511cc6b | ||
|
|
b363ed7d79 | ||
|
|
a68b942d1d | ||
|
|
30bfca0d71 | ||
|
|
a2184bcd07 | ||
|
|
d714520c64 | ||
|
|
5aa26e7eee | ||
|
|
963c01cf48 | ||
|
|
7c3a1a8bf0 | ||
|
|
cec33cbc49 | ||
|
|
2b5496a417 | ||
|
|
8daa90da23 | ||
|
|
e0090010f4 | ||
|
|
bc24092374 | ||
|
|
e04bce7dd0 | ||
|
|
66451f3ef0 | ||
|
|
4f3059c608 | ||
|
|
8eee7b3bb9 | ||
|
|
b2f5262a3b | ||
|
|
78e0ab6c0e | ||
|
|
02ca1a1f01 | ||
|
|
8576169eeb | ||
|
|
9bbc9dd30e | ||
|
|
c63a65ffa5 | ||
|
|
1e2b649a21 | ||
|
|
fa6ca2e39c | ||
|
|
11cba2e805 | ||
|
|
317648ecd4 | ||
|
|
2a6317c52f | ||
|
|
ec2a1e79a0 | ||
|
|
db63e0a60a | ||
|
|
9e7ca7cbbe | ||
|
|
a7a03984f1 | ||
|
|
3abcb2b922 | ||
|
|
05e3a1d7e5 | ||
|
|
ea1ca4edcc | ||
|
|
8eb70071f4 | ||
|
|
4bc39ee1cf | ||
|
|
8a715fab1c | ||
|
|
20f2654884 | ||
|
|
c4534509f7 | ||
|
|
01547ef768 | ||
|
|
42478983a3 | ||
|
|
c09a3b75ab | ||
|
|
7b879c2a2b | ||
|
|
23fb0f3d4d | ||
|
|
b19e83aa6d | ||
|
|
bb4aa82cb3 | ||
|
|
be5985b8e6 | ||
|
|
55b6107eb0 | ||
|
|
2ac89ec04c | ||
|
|
11a4db3120 | ||
|
|
eb425b997b | ||
|
|
9098ac9ea2 | ||
|
|
1597a6893d | ||
|
|
8e84c51c5c | ||
|
|
756afa48f7 | ||
|
|
32a6d97e48 | ||
|
|
1fde6f8aed | ||
|
|
47150cab07 | ||
|
|
26e1b9d66e | ||
|
|
60bdd1d323 | ||
|
|
84781b7f3a | ||
|
|
f089e1ccf5 | ||
|
|
cd4f22c275 | ||
|
|
15df55d011 | ||
|
|
6f68571805 | ||
|
|
5a690b7ac8 | ||
|
|
c9211aff57 | ||
|
|
52050739a1 | ||
|
|
b183abbb0f | ||
|
|
2ae0583ac5 | ||
|
|
0644190121 | ||
|
|
7841f07e08 | ||
|
|
9364deb539 | ||
|
|
c31bfb4dc8 | ||
|
|
03247eceba | ||
|
|
a88bf59b27 | ||
|
|
47456cf94b | ||
|
|
f64da5cb1e | ||
|
|
aed8b7943d | ||
|
|
b97462c8a4 | ||
|
|
6fce0435a1 | ||
|
|
be886bf2aa | ||
|
|
c2bc40bbc3 | ||
|
|
781835d53c | ||
|
|
12b22b7904 | ||
|
|
fc491e9ea4 | ||
|
|
9ff44cc682 | ||
|
|
38f9a1b1f0 | ||
|
|
5fc12c7761 | ||
|
|
b1425bcd91 | ||
|
|
66602f4ff8 | ||
|
|
091b1c88c2 | ||
|
|
fa5d8b6f86 | ||
|
|
be9eefeb22 | ||
|
|
774f63d9db | ||
|
|
ac8985a38f | ||
|
|
0c7f0df41a | ||
|
|
80dd4548e1 | ||
|
|
ba6e53c2e4 | ||
|
|
e7082d3e5b | ||
|
|
9071acf2ce | ||
|
|
ce95dcaf79 | ||
|
|
5db62e73da | ||
|
|
58b22b0a6e | ||
|
|
cfbaa0c89d | ||
|
|
2a21a3f893 | ||
|
|
8ba8772edb | ||
|
|
a87d15e361 | ||
|
|
2660182d52 | ||
|
|
5c2a2ca485 | ||
|
|
35f1a4af8c | ||
|
|
57c3b1b041 | ||
|
|
73b5bf438b | ||
|
|
d9565b6619 | ||
|
|
d6229ed70d | ||
|
|
9707f1f622 | ||
|
|
eb20c10713 | ||
|
|
573eddb5a4 | ||
|
|
c1aeafbe3d | ||
|
|
7f54f410f4 | ||
|
|
69bdf581f4 | ||
|
|
f6d361ad08 | ||
|
|
876419294d | ||
|
|
54372f2524 | ||
|
|
77f5433f22 | ||
|
|
9aa736b522 | ||
|
|
a2ea198fdd | ||
|
|
3f163eaa8d | ||
|
|
7d488aa200 | ||
|
|
dc217b313c | ||
|
|
ddf45fdad2 | ||
|
|
4524ff7cd7 | ||
|
|
797d3f871c | ||
|
|
6b5e9a3224 | ||
|
|
03c1283fcb | ||
|
|
ce02161255 | ||
|
|
5e2649a6f5 | ||
|
|
155a490f4e | ||
|
|
cb90fdb802 | ||
|
|
55a8404d01 | ||
|
|
2baa3be2da | ||
|
|
d15942f6c8 | ||
|
|
3b93c7c36d | ||
|
|
81b2cc0d14 | ||
|
|
137c468ca4 | ||
|
|
05a344d831 | ||
|
|
058adf247c | ||
|
|
d896d59e8e | ||
|
|
df4e715738 | ||
|
|
06606407f4 | ||
|
|
45896eb26e | ||
|
|
ad29b70d9e | ||
|
|
26133d8336 | ||
|
|
4feed0031e | ||
|
|
2460603ea5 | ||
|
|
41ffca2b6f | ||
|
|
98b847cad9 | ||
|
|
df8df6c18b | ||
|
|
f2ae16e125 | ||
|
|
4a9f136aa9 | ||
|
|
0d12472e74 | ||
|
|
8175f3c98e | ||
|
|
fdf9f82593 | ||
|
|
08f1fb5b38 | ||
|
|
0010bffb63 | ||
|
|
b2124a1f89 | ||
|
|
c97fbbb155 | ||
|
|
eddcde84b6 | ||
|
|
be76958070 | ||
|
|
b42897d0b6 | ||
|
|
7b5ea63329 | ||
|
|
4990bebd8a | ||
|
|
50e522c9ce | ||
|
|
37d926fc0d | ||
|
|
de09440d1c | ||
|
|
ec197c441e | ||
|
|
1f45018ee8 | ||
|
|
9dca8de90f | ||
|
|
9059b4962e | ||
|
|
af64bbb627 | ||
|
|
361b252de2 | ||
|
|
aae94efcfb | ||
|
|
7413d05705 | ||
|
|
4bbc226335 | ||
|
|
bd17e13ef7 | ||
|
|
1f2403392e | ||
|
|
543e4bca16 | ||
|
|
9219eb5aaf | ||
|
|
cd42d02020 | ||
|
|
d98a0e2dce | ||
|
|
255cd3a937 | ||
|
|
4f568fa68f | ||
|
|
82c009d405 | ||
|
|
35fce65656 | ||
|
|
01da7b95e2 | ||
|
|
c79966bd62 | ||
|
|
2fb53ba687 | ||
|
|
473f94ed58 | ||
|
|
7dbe75e89b | ||
|
|
9448896586 | ||
|
|
68d67d8e4e | ||
|
|
351fe36a6d | ||
|
|
2aeb95cbd4 | ||
|
|
cb78470471 | ||
|
|
78b030d8b8 | ||
|
|
445921ac5d | ||
|
|
c1b3ef6661 | ||
|
|
742c49cee7 | ||
|
|
7063f3df13 | ||
|
|
802d501c39 | ||
|
|
b8374826ac | ||
|
|
412d158d2e | ||
|
|
73a5ad91a1 | ||
|
|
1d63f67877 | ||
|
|
f0e80e365a | ||
|
|
d3887545ee | ||
|
|
ab53d57079 | ||
|
|
bb73fc6a89 | ||
|
|
6de048371f | ||
|
|
7501b010f4 | ||
|
|
c3943836dd | ||
|
|
e587f1a60e | ||
|
|
e732edbd9a | ||
|
|
f8fc3fbbf8 | ||
|
|
5b3253c7aa | ||
|
|
09f85d130d | ||
|
|
bcf34b8f3b | ||
|
|
b8f5f22a87 | ||
|
|
110339c1cc | ||
|
|
b8c41812bf | ||
|
|
52e1c38cf1 | ||
|
|
c8b64bef1d | ||
|
|
2cec960ada | ||
|
|
b42c1a2eda | ||
|
|
c74d145167 | ||
|
|
fce29caff7 | ||
|
|
58b7fa58e3 | ||
|
|
40eb37ba46 | ||
|
|
b88377d277 | ||
|
|
30a4610b12 | ||
|
|
88f7515d1d | ||
|
|
f78c0a8cc9 | ||
|
|
9fda2bdebd | ||
|
|
0701b99039 | ||
|
|
0a33e562f4 | ||
|
|
a3cce404b6 | ||
|
|
7965549204 | ||
|
|
0bf6c9b239 | ||
|
|
171dd52984 | ||
|
|
27a0e6a1a4 | ||
|
|
13b5450ff9 | ||
|
|
9e908b1255 | ||
|
|
fed9490471 | ||
|
|
898bed26f0 | ||
|
|
cfcb107caf | ||
|
|
26a5fdcba4 | ||
|
|
6e5b786329 | ||
|
|
ec5dcce74c | ||
|
|
4439e2fcb5 | ||
|
|
2c635e9e1b | ||
|
|
e9916df9d0 | ||
|
|
ff65c836c2 | ||
|
|
6083450d4e | ||
|
|
ba0d5705fc | ||
|
|
5644bd43b1 | ||
|
|
4163a84d62 | ||
|
|
14a6c42e0d | ||
|
|
072a93d00c | ||
|
|
b8faf43040 | ||
|
|
433547caa0 | ||
|
|
a9495b8846 | ||
|
|
293e45f551 | ||
|
|
0427f08511 | ||
|
|
76ee0ab97e | ||
|
|
24d4547605 | ||
|
|
fb7589e253 | ||
|
|
99a971b105 | ||
|
|
c2be385fe4 | ||
|
|
1392afea46 | ||
|
|
5fe273195b | ||
|
|
a10abdd929 | ||
|
|
ae9bdba06f | ||
|
|
af97efdc17 | ||
|
|
b2f61389ff | ||
|
|
e16ae7a641 | ||
|
|
56797b8841 | ||
|
|
ec336442bd | ||
|
|
f976078ef2 | ||
|
|
dd8ba82513 | ||
|
|
c8c54b61ef | ||
|
|
2016218fc7 | ||
|
|
994dfa714b | ||
|
|
b695ef4591 | ||
|
|
78d1efac12 | ||
|
|
fd84dc5e24 | ||
|
|
3ad6c9c84b | ||
|
|
0135a33a7c | ||
|
|
0fedfa220f | ||
|
|
8ae3fe1e80 | ||
|
|
3b9f131930 | ||
|
|
eb429f9211 | ||
|
|
c1fc796bf7 | ||
|
|
4d406c95d3 | ||
|
|
ef0038de2a | ||
|
|
21ad64ab77 | ||
|
|
13be887d2d | ||
|
|
358ffbd3b9 | ||
|
|
2d659c3484 | ||
|
|
00167caf54 | ||
|
|
941c3b9678 | ||
|
|
f2ee7c8f0b | ||
|
|
479a8a6e64 | ||
|
|
7b5d338bed | ||
|
|
9f9710beb6 | ||
|
|
11f63f379b | ||
|
|
40a4b395d7 | ||
|
|
8ddacead9f | ||
|
|
93ae674624 | ||
|
|
6cc47f8ee0 | ||
|
|
ec35ce7fdc | ||
|
|
06f5f40cb3 | ||
|
|
56619d7276 | ||
|
|
3ae7e9f8df | ||
|
|
a5ca6c24de | ||
|
|
a50fd86f3e | ||
|
|
8cf3a48106 | ||
|
|
da3548e680 | ||
|
|
810f837596 | ||
|
|
22f2cf1e56 | ||
|
|
3af84d73e9 | ||
|
|
8b796d3b47 | ||
|
|
ea0d3b5fd8 | ||
|
|
6b781d5a9b | ||
|
|
009d979b6c | ||
|
|
eafb2b060d | ||
|
|
aa753eb492 | ||
|
|
b697ff8acd | ||
|
|
7759c83b13 | ||
|
|
4b4c1f130c | ||
|
|
b9ada7bb28 | ||
|
|
e2f351ed20 | ||
|
|
eab924f428 | ||
|
|
2293abd424 | ||
|
|
aa2e9b9a00 | ||
|
|
9997d2d7ab | ||
|
|
044bd03a13 | ||
|
|
e44242db93 | ||
|
|
dd65d901ee | ||
|
|
16aac7bfac | ||
|
|
c2b8b3f1e1 | ||
|
|
9552f87157 | ||
|
|
2b10350edc | ||
|
|
9f4a9e9cd6 | ||
|
|
02bc3ee1e8 | ||
|
|
a62cac03e6 | ||
|
|
63f5723b27 | ||
|
|
434f046244 | ||
|
|
63c7deb583 | ||
|
|
a1210d63cc | ||
|
|
23916f88c7 | ||
|
|
fc8b76708a | ||
|
|
e179a8e568 | ||
|
|
fec69828a9 | ||
|
|
a1ed747a7f | ||
|
|
2386ec8f0c | ||
|
|
7cfbe73288 | ||
|
|
c637686a76 | ||
|
|
fda235518a | ||
|
|
1c45a070d1 | ||
|
|
922d5a00e1 | ||
|
|
24ca499570 | ||
|
|
b70451d550 | ||
|
|
602d3d285c | ||
|
|
bcefb124f3 | ||
|
|
3db672a60d | ||
|
|
d6fca804b4 | ||
|
|
1fd777106d | ||
|
|
d3519a2b82 | ||
|
|
18912ac23d | ||
|
|
230198fe4a | ||
|
|
089c64f427 | ||
|
|
950bf29c27 | ||
|
|
2e26a05875 | ||
|
|
d1f4279b8f | ||
|
|
31ff7e384f | ||
|
|
fa37234a49 | ||
|
|
a1752db25a | ||
|
|
737718ba5d | ||
|
|
8bf11e9b18 | ||
|
|
bc226305d7 | ||
|
|
e030986837 | ||
|
|
bcbad532e6 | ||
|
|
88b8e5a16a | ||
|
|
d9bbe604e9 | ||
|
|
67f0df94f9 | ||
|
|
53beaee6e6 | ||
|
|
5b562c4c24 | ||
|
|
1a2fdffd5b | ||
|
|
8ada7049c2 | ||
|
|
93e8edf2f9 | ||
|
|
8ce192de82 | ||
|
|
376b62e8fa | ||
|
|
64c30610f5 | ||
|
|
b6561ee9ca | ||
|
|
cf1bc2634d | ||
|
|
2f836f786f | ||
|
|
1431a0b275 | ||
|
|
1c8b6bebce | ||
|
|
cebc01cb1e | ||
|
|
2ac18a621a | ||
|
|
51b868b6a4 | ||
|
|
c9c2d8a0b6 | ||
|
|
54a07eaa60 | ||
|
|
3f5eb55405 | ||
|
|
77829a8e5b | ||
|
|
1d4462b198 | ||
|
|
62bb1d4da4 | ||
|
|
cdaf08b908 | ||
|
|
af3006c3d7 | ||
|
|
5c3a7a7e7f | ||
|
|
3613b666e5 | ||
|
|
3689a719fd | ||
|
|
5397f1c046 | ||
|
|
4991245cdf | ||
|
|
5e772350b4 | ||
|
|
eb92274f9b | ||
|
|
b5fe162c32 | ||
|
|
c4b4961ed1 | ||
|
|
32a4607eb6 | ||
|
|
cfe68a4c2d | ||
|
|
cde22645e5 | ||
|
|
4ea0f232ef | ||
|
|
0c9499a88e | ||
|
|
3a057d594b | ||
|
|
a8a5372c6b | ||
|
|
cff87ab1e0 | ||
|
|
9b73f2a38c | ||
|
|
4cdd5dce38 | ||
|
|
020ee2d289 | ||
|
|
de8267d2e2 | ||
|
|
942d82593b | ||
|
|
a86e8e0f36 | ||
|
|
c8940c130d | ||
|
|
4a388668a3 | ||
|
|
5e3fd8e95e | ||
|
|
9c4fde00ce | ||
|
|
6591b53547 | ||
|
|
7d6c0417eb | ||
|
|
268bf61da6 | ||
|
|
506271e769 | ||
|
|
5e88958e26 | ||
|
|
6408da2ae4 | ||
|
|
b3a4c02d05 | ||
|
|
2518ad47d9 | ||
|
|
65534f0286 | ||
|
|
8c7e785661 | ||
|
|
1db42a5611 | ||
|
|
44a254264b | ||
|
|
d2d16ea171 | ||
|
|
89f5eefb92 | ||
|
|
9fe01ff0c8 | ||
|
|
8894caddc2 | ||
|
|
852eb8ab8e | ||
|
|
d717f3537a | ||
|
|
4478167634 | ||
|
|
dd612a6637 | ||
|
|
923dc52f87 | ||
|
|
80c1b54b52 | ||
|
|
421bcb07d3 | ||
|
|
eaba575c9e | ||
|
|
31674f9246 | ||
|
|
9f4b3b0fc6 | ||
|
|
7cbb79277d | ||
|
|
6044f8b335 | ||
|
|
d24498bdf1 | ||
|
|
00d7c40c7a | ||
|
|
a97c884159 | ||
|
|
5ad36f7040 | ||
|
|
2f57d3cbea | ||
|
|
6652bb4795 | ||
|
|
955e25fc39 | ||
|
|
2052f1595c | ||
|
|
f2bb7e29a4 | ||
|
|
a6030f89fe | ||
|
|
3cd320fa83 | ||
|
|
ec9efcb4b0 | ||
|
|
6dcaa04a93 | ||
|
|
70957aa52a | ||
|
|
1c4cb37e61 | ||
|
|
875791b40c | ||
|
|
6dc758a080 | ||
|
|
ede03659ca | ||
|
|
4b4a8693ac | ||
|
|
0edd97d5db | ||
|
|
a9cf718e75 | ||
|
|
52e8c102fc | ||
|
|
29e9a54000 | ||
|
|
f522cfcce8 | ||
|
|
04016ed4a6 | ||
|
|
e1e6f2db51 | ||
|
|
6fa4350ade | ||
|
|
70f57974c7 | ||
|
|
4f2566ad50 | ||
|
|
a4f143a71a | ||
|
|
2037de5b33 | ||
|
|
6173d11b62 | ||
|
|
060ad38905 | ||
|
|
41fd598195 | ||
|
|
0fced84f93 | ||
|
|
50cb20592c | ||
|
|
1eeb3dcf30 | ||
|
|
a3d3e18369 | ||
|
|
69ec94fe47 | ||
|
|
41cee583e3 | ||
|
|
4713bf5cef | ||
|
|
c346e1f816 | ||
|
|
3d677ee90c | ||
|
|
e43111d9cb | ||
|
|
2768655267 | ||
|
|
057ae3c134 | ||
|
|
e64b4c1d24 | ||
|
|
aeb3f692d5 | ||
|
|
af01b97a11 | ||
|
|
d9ab59cb4a | ||
|
|
4a20709645 | ||
|
|
647bdc5cbd | ||
|
|
115e779cf0 | ||
|
|
3387170d62 | ||
|
|
03ea12d334 | ||
|
|
a8fdfd77ce | ||
|
|
cb5de27631 | ||
|
|
d9ccd3a737 | ||
|
|
5874bb8b27 | ||
|
|
2f42fc5932 | ||
|
|
0bbd5b7a45 | ||
|
|
d1c130d60a | ||
|
|
692f37b91a | ||
|
|
13279eb0d4 | ||
|
|
9e5f00ba27 | ||
|
|
1e21bf5074 | ||
|
|
51c1064609 | ||
|
|
a188826a10 | ||
|
|
24dd7409bc | ||
|
|
cc2d70f044 | ||
|
|
7b5b14b0a7 | ||
|
|
969475254f | ||
|
|
2cc776d2d9 | ||
|
|
5852251d56 | ||
|
|
182ad31c63 | ||
|
|
2a36fa0855 | ||
|
|
ad1aa59ce1 | ||
|
|
6d37d014a0 | ||
|
|
bc522c3fa5 | ||
|
|
73b9b5b270 | ||
|
|
4b90fcdeac | ||
|
|
7eaa771d57 | ||
|
|
521f4bfefc | ||
|
|
6800fadafe | ||
|
|
26c6c34817 | ||
|
|
3f98cbc52d | ||
|
|
9ace693ec0 | ||
|
|
0aff65e77b | ||
|
|
8c63ea2515 | ||
|
|
f9f0c5aea6 | ||
|
|
5eee8daa4f | ||
|
|
d4dd1f71a5 | ||
|
|
25888db0af | ||
|
|
2b19a50775 | ||
|
|
8c0b15052a | ||
|
|
5e904c4dc3 | ||
|
|
54fd445c75 | ||
|
|
27a7ab20e2 | ||
|
|
646efb91e1 | ||
|
|
c805fd3213 | ||
|
|
2d83b58703 | ||
|
|
582f967fb0 | ||
|
|
12af4ed7e3 | ||
|
|
f5623edec1 | ||
|
|
0be52f8a49 | ||
|
|
83410572cc | ||
|
|
70fba3e92e | ||
|
|
41541128c5 | ||
|
|
cdaf907467 | ||
|
|
f22af81e7d | ||
|
|
9107e5767c | ||
|
|
6946f878ef | ||
|
|
f1158b988c | ||
|
|
fb073544d2 | ||
|
|
a8d8523747 | ||
|
|
ef9a3c2007 | ||
|
|
b0a549716f | ||
|
|
435af0f982 | ||
|
|
8c2c094830 | ||
|
|
feb39a114d | ||
|
|
b7f56fc551 | ||
|
|
9631719061 | ||
|
|
056a5d1466 | ||
|
|
493dd1749c | ||
|
|
f5a880b6c5 | ||
|
|
ec624f7baa | ||
|
|
d3a55ef732 | ||
|
|
b910e6230f | ||
|
|
69949187f6 | ||
|
|
b53f635441 | ||
|
|
c31d4e6b69 | ||
|
|
706875160e | ||
|
|
a8eaf82e06 | ||
|
|
82666abbdd | ||
|
|
e7c909fe66 | ||
|
|
d9673b8c8f | ||
|
|
383fdae18f | ||
|
|
9d5a54ced4 | ||
|
|
50b4492fef | ||
|
|
eff8c31ffd | ||
|
|
89c7d1a835 | ||
|
|
7d517a431d | ||
|
|
718e9eaf37 | ||
|
|
fe42f6bb73 | ||
|
|
f1f248dd11 | ||
|
|
cab004f08a | ||
|
|
1545285953 | ||
|
|
31d9fedf47 | ||
|
|
6c4c93e17b | ||
|
|
ba452c204b | ||
|
|
70c57beea9 | ||
|
|
edb308ceb2 | ||
|
|
2ab7da36f2 | ||
|
|
cfd0731422 | ||
|
|
494c0f8fe4 | ||
|
|
1d1c7e5a0d | ||
|
|
bde18ba86a | ||
|
|
9088137051 | ||
|
|
cc50eaa88f | ||
|
|
86b78e2fea | ||
|
|
57bbf7c944 | ||
|
|
84369cf6ba | ||
|
|
3981b1cc82 | ||
|
|
e8d2ea7a56 | ||
|
|
1fabb661a6 | ||
|
|
709d6a2214 | ||
|
|
ca9c022a7f | ||
|
|
34b8b457c7 | ||
|
|
6d184abf84 | ||
|
|
05500c6c39 | ||
|
|
306fed32f6 | ||
|
|
67c3c93aec | ||
|
|
7b351da006 | ||
|
|
cc73de48d6 | ||
|
|
cc52f140d0 | ||
|
|
4093616e09 | ||
|
|
96cfa57d1b | ||
|
|
ef4261e1f8 | ||
|
|
4fe372662a | ||
|
|
43b890a269 | ||
|
|
6a4a522244 | ||
|
|
dd721def41 | ||
|
|
81a623c2b6 | ||
|
|
1534e81bed | ||
|
|
718d9801da | ||
|
|
42c5bb970e | ||
|
|
26c01dd34c | ||
|
|
98daa0d28c | ||
|
|
01667b5fc3 | ||
|
|
4a9e1e6c7e | ||
|
|
f5b33c8912 | ||
|
|
35269cce93 | ||
|
|
685db05032 | ||
|
|
39dbfd1db4 | ||
|
|
57cd3fdf06 | ||
|
|
1d2dd249f3 | ||
|
|
cdfb8348b0 | ||
|
|
211a8a149b | ||
|
|
c2b7ebbcdf | ||
|
|
c4ee0463aa | ||
|
|
edfafd9fad | ||
|
|
9c749f03eb | ||
|
|
58b9b6c875 | ||
|
|
29929acdba | ||
|
|
3c192419dd | ||
|
|
7b8983a0e0 | ||
|
|
e74161bc6c | ||
|
|
10e6ea21a3 | ||
|
|
ba8a07a2b6 | ||
|
|
a8e3917613 | ||
|
|
1e9b94ded4 | ||
|
|
2f3ef75bf6 | ||
|
|
3ad4b057f9 | ||
|
|
1fc64df5f6 | ||
|
|
1e6ccb2310 | ||
|
|
29a28f0d02 | ||
|
|
aa5ddee807 | ||
|
|
7a3ddcd77d | ||
|
|
63644ac761 | ||
|
|
df3af35ee4 | ||
|
|
84de78e7c9 | ||
|
|
e519ccd0be | ||
|
|
470756e22c | ||
|
|
09e54d1e75 | ||
|
|
38c8369e58 | ||
|
|
9fb170bcd4 | ||
|
|
e1d0514ec5 | ||
|
|
ad7612eef3 | ||
|
|
33cf0e160c | ||
|
|
b78c48c2c3 | ||
|
|
778b42de58 | ||
|
|
2f392f2260 | ||
|
|
ad34f4845b | ||
|
|
36802f7133 | ||
|
|
ca782bd015 | ||
|
|
7b3aaa6bbb | ||
|
|
16d12e804c | ||
|
|
25be09acd3 | ||
|
|
621e220177 | ||
|
|
a305a48a11 | ||
|
|
877a7f8d6c | ||
|
|
702bc18128 | ||
|
|
78c27dc77a | ||
|
|
0de4efae44 | ||
|
|
ded0e13623 | ||
|
|
afe68f9cd8 | ||
|
|
d51cd37fa8 | ||
|
|
695203212c | ||
|
|
7d849ac8fb | ||
|
|
3ecde62930 | ||
|
|
ab7c2f23cf | ||
|
|
0554e3cb3d | ||
|
|
c9dcc18fa4 | ||
|
|
43c521de44 | ||
|
|
4ef5eb1eb2 | ||
|
|
1a07476138 | ||
|
|
3f2ba2e791 | ||
|
|
9dc963e15a | ||
|
|
fb28c79e13 | ||
|
|
1e751d00ea | ||
|
|
548c5dc925 | ||
|
|
9c100ded3a | ||
|
|
5160f35bd8 | ||
|
|
34d3641d0a | ||
|
|
4198a0d3a8 | ||
|
|
8f0ef54455 | ||
|
|
e92331cf1f | ||
|
|
3a3c4f60bf | ||
|
|
19a8a815f0 | ||
|
|
35bf716766 | ||
|
|
3883616d93 | ||
|
|
de0b34aa0a | ||
|
|
e14fc1b087 | ||
|
|
53d07b30cc | ||
|
|
0b294faa71 | ||
|
|
d995fa045a | ||
|
|
5ed60cde04 | ||
|
|
bb27496e2e | ||
|
|
9b8c596057 | ||
|
|
30555f8132 | ||
|
|
a319db9119 | ||
|
|
b5eabf633a | ||
|
|
a27912b816 | ||
|
|
156d3629e6 | ||
|
|
4f9a3f6813 | ||
|
|
3b6b067fe5 | ||
|
|
1ac544b612 | ||
|
|
e3a78e0ecf | ||
|
|
58e6ca9ad4 | ||
|
|
0c40b2b3ef | ||
|
|
6642868b86 | ||
|
|
14c63e0cd5 | ||
|
|
fcb4933671 | ||
|
|
571d9708e1 | ||
|
|
bd319de5cf | ||
|
|
78a67bd775 | ||
|
|
3744f2454c | ||
|
|
39aae2872d | ||
|
|
e9a35c1cab | ||
|
|
d87fa1799e | ||
|
|
9eb8472805 | ||
|
|
6921ca44a7 | ||
|
|
7b4a4d1da4 | ||
|
|
60cfbce48b | ||
|
|
3e3a84a602 | ||
|
|
0e4857c8f6 | ||
|
|
68021903c9 | ||
|
|
f803ee2c0b | ||
|
|
c40f2ae5bb | ||
|
|
8d71714446 | ||
|
|
cc6a5a6077 | ||
|
|
004588d627 | ||
|
|
49d0045434 | ||
|
|
f5c7b1bf73 | ||
|
|
6972492fb4 | ||
|
|
311a7d40d2 | ||
|
|
c88ffa56ff | ||
|
|
05b1785f24 | ||
|
|
9b99393c20 | ||
|
|
38c70d5705 | ||
|
|
8def289271 | ||
|
|
88abadce43 | ||
|
|
7f7680da6e | ||
|
|
7b71f22e85 | ||
|
|
c4d6c9541c | ||
|
|
5a468c8b3e | ||
|
|
12e68bf477 | ||
|
|
1040e57c94 | ||
|
|
b18219687c | ||
|
|
e6fcf73a1e | ||
|
|
b92ac7d439 | ||
|
|
0e3026d41f | ||
|
|
3346124d21 | ||
|
|
89c405b196 | ||
|
|
69305fda96 | ||
|
|
8cf629b3c2 | ||
|
|
25c6499c5d | ||
|
|
bdf9969c7e | ||
|
|
62c2842c86 | ||
|
|
e8fe4e26ff | ||
|
|
1085e553d5 | ||
|
|
e38808b17c | ||
|
|
21f15d5cbd | ||
|
|
0c42b643a9 | ||
|
|
28bf33cd78 | ||
|
|
7f0f36fb7a | ||
|
|
941b369016 | ||
|
|
a85ed986de | ||
|
|
21d0320e42 | ||
|
|
843503e92a | ||
|
|
08dfd58994 | ||
|
|
ed24d05752 | ||
|
|
28d30064b6 | ||
|
|
7bac0220dc | ||
|
|
cb510f04d8 | ||
|
|
92dc0dc6d0 | ||
|
|
fa9290cf1e | ||
|
|
1fcdddf579 | ||
|
|
ce4c750326 | ||
|
|
ce99109001 | ||
|
|
8a15f0094a | ||
|
|
3a2a365ec9 | ||
|
|
3529f2da4c | ||
|
|
64bbe5b646 | ||
|
|
2427d90f48 | ||
|
|
6c49ae5152 | ||
|
|
0d1fd657ab | ||
|
|
b4cadb1a16 | ||
|
|
a2192b14db | ||
|
|
ae467486ba | ||
|
|
88d162452a | ||
|
|
3fa60d08de | ||
|
|
1eb612135b | ||
|
|
7e3a400cb7 | ||
|
|
48b6b4ca8e | ||
|
|
c2319b3a21 | ||
|
|
9a50205867 | ||
|
|
b1503bc7c8 | ||
|
|
d5d4c1a319 | ||
|
|
8988e2d34b | ||
|
|
9588eb451b | ||
|
|
acfa3fc4d4 | ||
|
|
6ef5fa1aa5 | ||
|
|
af140741bc | ||
|
|
ddc860d4b0 | ||
|
|
c1f4a7536a | ||
|
|
b91c342ff4 | ||
|
|
352519c91e | ||
|
|
f3b82dc998 | ||
|
|
9f3a2db44e | ||
|
|
018a0baed6 | ||
|
|
ddaeb2b24b | ||
|
|
51183787af | ||
|
|
2e3b6c5a17 | ||
|
|
f5a8e16109 | ||
|
|
950cd41dfa | ||
|
|
0b86348711 | ||
|
|
c8555924e0 | ||
|
|
a029cb9fc5 | ||
|
|
5b668ae421 | ||
|
|
99e9a1ea0d | ||
|
|
56159976af | ||
|
|
ac4b49f1c2 | ||
|
|
875bb8bda3 | ||
|
|
c76e46d930 | ||
|
|
baf67a7dff | ||
|
|
adb5c4c7dd | ||
|
|
5303ecee22 | ||
|
|
233456df47 | ||
|
|
725ee77383 | ||
|
|
289be872f3 | ||
|
|
910da74519 | ||
|
|
2e0f85ac93 | ||
|
|
ef2e51b4f6 | ||
|
|
af3980ff66 | ||
|
|
e3cbd2e62f | ||
|
|
d98731d5d9 | ||
|
|
ca4328b53c | ||
|
|
26bed1e264 | ||
|
|
4dec80e9e3 | ||
|
|
587a425f77 | ||
|
|
8096ced303 | ||
|
|
86e8aeaaa5 | ||
|
|
223cae66c1 | ||
|
|
d6058bba82 | ||
|
|
3249c10215 | ||
|
|
c957e07399 | ||
|
|
df1fefd775 | ||
|
|
d521945479 | ||
|
|
74fb8cb7b2 | ||
|
|
887999904b | ||
|
|
545e5fd6ab | ||
|
|
ac5e151d1e | ||
|
|
c8d269e5de | ||
|
|
e7173e974b | ||
|
|
7b0d527ffe | ||
|
|
6f5f600f47 | ||
|
|
ad8a1174f7 | ||
|
|
24b5e5234f | ||
|
|
1d438d8d06 | ||
|
|
891372c4b1 | ||
|
|
3de030ba74 | ||
|
|
a6dd70a320 | ||
|
|
ffe79897e5 | ||
|
|
b01aabf7d1 | ||
|
|
304e13ac16 | ||
|
|
c1d41e190c | ||
|
|
13df7795fc | ||
|
|
f559798750 | ||
|
|
e88568625c | ||
|
|
0716fa02d6 | ||
|
|
325a8a4cbd | ||
|
|
b0820ca1db | ||
|
|
8d44c0c752 | ||
|
|
5b5a086fd3 | ||
|
|
f7e6d9e7b8 | ||
|
|
1f43533ff9 | ||
|
|
4f5616cb91 | ||
|
|
23ba478f82 | ||
|
|
ff3b033815 | ||
|
|
a08840de6d | ||
|
|
ed34643f01 | ||
|
|
1d7cae2ceb | ||
|
|
1f2e42cdc2 | ||
|
|
2cb67d1172 | ||
|
|
5813228c6c | ||
|
|
a9c496e01f | ||
|
|
dea5b5347d | ||
|
|
f39e554586 | ||
|
|
f646fea03f | ||
|
|
f9ae48c3f6 | ||
|
|
a9154373fc | ||
|
|
2004545f96 | ||
|
|
e80fb4f386 | ||
|
|
83958a4402 | ||
|
|
8292f31ea0 | ||
|
|
d0a9de01a3 | ||
|
|
c809ecd623 | ||
|
|
2ff9bfb24d | ||
|
|
ab34a0a34f | ||
|
|
c5e2099dd9 | ||
|
|
5a2e4237c4 | ||
|
|
9d0585a280 | ||
|
|
f0ef3904d5 | ||
|
|
7fe952ddeb | ||
|
|
73bcd7a692 | ||
|
|
316c07c226 | ||
|
|
2a579f4418 | ||
|
|
8f8fbab4f9 | ||
|
|
411ff301c7 | ||
|
|
2fb7ba22e5 | ||
|
|
92c472c227 | ||
|
|
761a17ccd8 | ||
|
|
f466cc5143 | ||
|
|
47067b691e | ||
|
|
83a262ceae | ||
|
|
15c661a374 | ||
|
|
43d24114b3 | ||
|
|
e4a3946998 | ||
|
|
0087928aa5 | ||
|
|
2d2bd625c6 | ||
|
|
4589fde775 | ||
|
|
8b8d9e0841 | ||
|
|
19c68fad43 | ||
|
|
6e4228b054 | ||
|
|
5972ed9cc6 | ||
|
|
2dc0fdcfee | ||
|
|
4fd3cac319 | ||
|
|
66eed86ccf | ||
|
|
79dc998a7b | ||
|
|
75a33b3662 | ||
|
|
ac72d19f5c | ||
|
|
49e584c6f6 | ||
|
|
d30d2abe10 | ||
|
|
637266be03 | ||
|
|
05744bb69f | ||
|
|
7531223846 | ||
|
|
7ba551864b | ||
|
|
0988f7fb8a | ||
|
|
d016a0929b | ||
|
|
b01ae6b366 | ||
|
|
309af5d526 | ||
|
|
66d98af48b | ||
|
|
97ee822f35 | ||
|
|
4646da6df8 | ||
|
|
6f6a4e59df | ||
|
|
4a95cb7b54 | ||
|
|
e81e53bdf6 | ||
|
|
ae48da5ebf | ||
|
|
3d24439276 | ||
|
|
6b0a46d5d2 | ||
|
|
456346e0c6 | ||
|
|
1440b46eb0 | ||
|
|
9f7e55e59d | ||
|
|
ef13fc1b9e | ||
|
|
513dcdc502 | ||
|
|
b17e274ff6 | ||
|
|
29774bd84a | ||
|
|
95f0b6e0b8 | ||
|
|
ab8af924c0 | ||
|
|
a0e12fecde | ||
|
|
af52212e6d | ||
|
|
ff7f56e996 | ||
|
|
261adaf100 | ||
|
|
b9c32276bf | ||
|
|
e639d2b09a | ||
|
|
2cc841a6cb | ||
|
|
9194a3b24d | ||
|
|
b5d9ed60e7 | ||
|
|
7a1e97f8c0 | ||
|
|
fb7b1ec1a0 | ||
|
|
9729b5a917 | ||
|
|
53fffbd670 | ||
|
|
8643cb22dd | ||
|
|
47582ffa41 | ||
|
|
f48c668447 | ||
|
|
8bcd74bf42 | ||
|
|
92f6c33d34 | ||
|
|
c61f6aafc1 | ||
|
|
e24274a314 | ||
|
|
00590f2077 | ||
|
|
353ca34a49 | ||
|
|
bc01a94f07 | ||
|
|
5a8106308e | ||
|
|
532fd88e2f | ||
|
|
42e8890c91 | ||
|
|
8d3f25f20f | ||
|
|
fe03ba76f9 | ||
|
|
9b9e0a03fa | ||
|
|
d078a7131f | ||
|
|
be1b97c7c0 | ||
|
|
249c0f4fb5 | ||
|
|
3a1510ca88 | ||
|
|
19331636bd | ||
|
|
997136c029 | ||
|
|
3c4a959b83 | ||
|
|
157260d05d | ||
|
|
f65fefb462 | ||
|
|
3180cbd103 | ||
|
|
c0c9caec22 | ||
|
|
4d79396cc3 | ||
|
|
7c5cca2dba | ||
|
|
1e0c74e818 | ||
|
|
f0faedddf9 | ||
|
|
b4aca85a0c | ||
|
|
e12655915d | ||
|
|
58e7355942 | ||
|
|
cfbc3d4317 | ||
|
|
7e6fc5ab4d | ||
|
|
8b6c330253 | ||
|
|
ef78f5b3c3 | ||
|
|
a8a88efcb2 | ||
|
|
e93857cd9b | ||
|
|
0310f6dafd | ||
|
|
9c06b1a0fb | ||
|
|
7c57124aed | ||
|
|
856eb3df89 | ||
|
|
e7f5423d53 | ||
|
|
442101e7ae | ||
|
|
0d8c4ce3ae | ||
|
|
1197104b60 | ||
|
|
ab5bb981df | ||
|
|
2509d8e88f | ||
|
|
a33353399f | ||
|
|
c4a98a62d3 | ||
|
|
497180e506 | ||
|
|
f0e1ab37cc | ||
|
|
53194e10b5 | ||
|
|
25231d5c92 | ||
|
|
400f97a163 | ||
|
|
d857fb3234 | ||
|
|
5dc3f40451 | ||
|
|
e138bfbfaf | ||
|
|
c9b39a41e9 | ||
|
|
cf0f16596c | ||
|
|
8b138d8bb1 | ||
|
|
320d4917bd | ||
|
|
a780755af7 | ||
|
|
7246d0d053 | ||
|
|
8794360b65 | ||
|
|
6b9f8be3fb | ||
|
|
bae318dbc2 | ||
|
|
11ece8b373 | ||
|
|
efb0b87c1d | ||
|
|
7986561598 | ||
|
|
0aecf033b6 | ||
|
|
3c6bea1113 | ||
|
|
7f8c13ae09 | ||
|
|
7403b3de8a | ||
|
|
925ec7bc82 | ||
|
|
30e8ec6543 | ||
|
|
91fd05133b | ||
|
|
c796f3268b | ||
|
|
b4da4940eb | ||
|
|
26bb0105c0 | ||
|
|
2e215c4efd | ||
|
|
d9dccf0c78 | ||
|
|
6b279a2581 | ||
|
|
66f621f810 | ||
|
|
dfa1288988 | ||
|
|
fdad03e878 | ||
|
|
ee92c6d679 | ||
|
|
4ccff43919 | ||
|
|
050ac1e9cf | ||
|
|
28eec1489a | ||
|
|
76f0c14289 | ||
|
|
c20e83e50a | ||
|
|
e1debd6f11 | ||
|
|
932d12a684 | ||
|
|
a9bb8d08f2 | ||
|
|
927d801463 | ||
|
|
018209d6c2 | ||
|
|
375621394c | ||
|
|
37a5e7ff08 | ||
|
|
7fb7d4e74c | ||
|
|
649aee49ba | ||
|
|
67ea016c09 | ||
|
|
38135c505b | ||
|
|
f13a4b10ee | ||
|
|
0611581b28 | ||
|
|
3bfd6ababd | ||
|
|
ea53d4ab38 | ||
|
|
4a533447a1 | ||
|
|
16d62001e0 | ||
|
|
00577b8950 | ||
|
|
27ab57bc05 | ||
|
|
b92dcd1334 | ||
|
|
086c68bca7 | ||
|
|
2a0833378d | ||
|
|
c4dfa1e12a | ||
|
|
ae18fc808d | ||
|
|
92b09a9f60 | ||
|
|
abcfe03059 | ||
|
|
9e8dd390b2 | ||
|
|
ee5e7f8034 | ||
|
|
3b3eaa1e24 | ||
|
|
1e315bb61b | ||
|
|
e2a703896f | ||
|
|
d2f3af69f4 | ||
|
|
84eb05c917 | ||
|
|
bbe688cd05 | ||
|
|
d81e756fa7 | ||
|
|
8a4e8f4ae9 | ||
|
|
f4c5036c3c | ||
|
|
35a528a3e0 | ||
|
|
783f16b198 | ||
|
|
238d72d187 | ||
|
|
dde5f67962 | ||
|
|
f2df63e246 | ||
|
|
083a0453c6 | ||
|
|
1a854021a4 | ||
|
|
2da2dd3b0b | ||
|
|
c77861126f | ||
|
|
867bdad010 | ||
|
|
a395bf9355 | ||
|
|
43feea3496 | ||
|
|
0ee8119459 | ||
|
|
adfef2a503 | ||
|
|
252bb3a905 | ||
|
|
c007b68e6b | ||
|
|
4e6f26d2e4 | ||
|
|
9e9ad8d5eb | ||
|
|
b7da58b40b | ||
|
|
7dc961bdd9 | ||
|
|
17bb6f7354 | ||
|
|
68678987c4 | ||
|
|
cd152399a3 | ||
|
|
a4cced8fde | ||
|
|
9786e08228 | ||
|
|
448b988e62 | ||
|
|
92054bcd09 | ||
|
|
540f0d2646 | ||
|
|
b4ea5d3cd5 | ||
|
|
8e3ef34c1f | ||
|
|
3c1e9372ab | ||
|
|
82b327420d | ||
|
|
fb5f557d91 | ||
|
|
b3d5551ad2 | ||
|
|
999f862a6d | ||
|
|
ee2f25b1dc | ||
|
|
006735395c | ||
|
|
cdbae18ae5 | ||
|
|
07416f1a0e | ||
|
|
7c7fe66dfc | ||
|
|
87bf32e889 | ||
|
|
43e608760a | ||
|
|
7d4e5b8ce5 | ||
|
|
6a0a68f8df | ||
|
|
7f958862fe | ||
|
|
e08689ed98 | ||
|
|
c3be8f45fc | ||
|
|
e5ab0f33d1 | ||
|
|
2413c1b8d5 | ||
|
|
ba73bebf3d | ||
|
|
d91800038d | ||
|
|
a0446f778c | ||
|
|
5388448cf3 | ||
|
|
8c39c804ee | ||
|
|
13249f6011 | ||
|
|
d72596142e | ||
|
|
b24d1f06aa | ||
|
|
044619281c | ||
|
|
d42a76dec1 | ||
|
|
6cb6f76add | ||
|
|
e4aa0fd544 | ||
|
|
c16568cf32 | ||
|
|
7a9684b6ea | ||
|
|
7efe1160e1 | ||
|
|
df0f334b97 | ||
|
|
e7cbc2cd5c | ||
|
|
436fc6706b | ||
|
|
591bb36e03 | ||
|
|
809e22ec1a | ||
|
|
874510152e | ||
|
|
3e706fe5b2 | ||
|
|
c465fda58a | ||
|
|
7c7eeff0fb | ||
|
|
2497ac4584 | ||
|
|
b8b2a2dae4 | ||
|
|
3cb73ccd03 | ||
|
|
f5c5b872db | ||
|
|
c32cb51755 | ||
|
|
cfa90a4a36 | ||
|
|
f0bf2df92f | ||
|
|
935393b391 | ||
|
|
212f32e2fd | ||
|
|
ead6c2b0dc | ||
|
|
a8a2294f27 | ||
|
|
f9c81f358a | ||
|
|
9b76446b48 | ||
|
|
9b0ff1fd0d | ||
|
|
6505080d64 | ||
|
|
be861cf55d | ||
|
|
681443cc45 | ||
|
|
4c92d43fe2 | ||
|
|
9e31c2de34 | ||
|
|
83ac24e7f1 | ||
|
|
9ae4031d13 | ||
|
|
20366f3d3c | ||
|
|
000eaf712a | ||
|
|
888a4bfe37 | ||
|
|
4ad03e6553 | ||
|
|
5a147fe46f | ||
|
|
577e254e9e | ||
|
|
c5fc9cf5ce | ||
|
|
0d543baa4b | ||
|
|
3aa8afd60d | ||
|
|
1aa95f6cc4 | ||
|
|
daea169e5d | ||
|
|
b1337d0a21 | ||
|
|
8ec6447b18 | ||
|
|
87f34eb12f | ||
|
|
788ae60d12 | ||
|
|
3e35fb8672 | ||
|
|
d63daacdf9 | ||
|
|
efe72dea94 | ||
|
|
a7dd320653 | ||
|
|
203b4d7f80 | ||
|
|
2b0164f551 | ||
|
|
31263970ad | ||
|
|
7be7815933 | ||
|
|
bdc31234d5 | ||
|
|
e8ff0fddca | ||
|
|
f3c6799b4e | ||
|
|
3e891c6237 | ||
|
|
f588e7f646 | ||
|
|
b4b758466f | ||
|
|
d4d19555e0 | ||
|
|
ee9c6ef5ba | ||
|
|
267800abaa | ||
|
|
5c25cf1ad6 | ||
|
|
4598f186a8 | ||
|
|
83b815df17 | ||
|
|
7f75bcfcb5 | ||
|
|
4f27a740ba | ||
|
|
250468a1ba | ||
|
|
304cd05dc6 | ||
|
|
4d7b627421 | ||
|
|
e20151a048 | ||
|
|
68664fdf1d | ||
|
|
8b43e1b4ef | ||
|
|
4aae293e3d | ||
|
|
3de0bf27d2 | ||
|
|
49e07b3e82 | ||
|
|
c1b5860320 | ||
|
|
801fa3459c | ||
|
|
05cf2ee8ba | ||
|
|
ad725cefc2 | ||
|
|
b99838b06b | ||
|
|
dcf1138040 | ||
|
|
869a8cfcba | ||
|
|
26f6e0bccf | ||
|
|
9a78994fe2 | ||
|
|
1f553ac1c4 | ||
|
|
814835aa8f | ||
|
|
5b59f0dcda | ||
|
|
544df2f03c | ||
|
|
a6995c0336 | ||
|
|
e06a6b62c8 | ||
|
|
fb04376722 | ||
|
|
d1276258ea | ||
|
|
ffca8af2c6 | ||
|
|
e678b39de6 | ||
|
|
9d9c24f94b | ||
|
|
7873b5f044 | ||
|
|
69b84d9d02 | ||
|
|
bdc999ca45 | ||
|
|
d5985c35ae | ||
|
|
ddd12aab36 | ||
|
|
8f65c2cf72 | ||
|
|
f581260daa | ||
|
|
62bd4960e1 | ||
|
|
bd5f151077 | ||
|
|
70d0c1ce6f | ||
|
|
18a90d81d2 | ||
|
|
6fd784375a | ||
|
|
6ad38b4140 | ||
|
|
8fd43c0927 | ||
|
|
534f09373e | ||
|
|
52fae101e8 | ||
|
|
8d5d91a5a4 | ||
|
|
e65c816ed0 | ||
|
|
a7d679d391 | ||
|
|
c5cb509f1b | ||
|
|
c6f3b4a6da | ||
|
|
be39981ba3 | ||
|
|
da1ace4668 | ||
|
|
ca4ce9f136 | ||
|
|
dd6cbce0eb | ||
|
|
e75e2ede92 | ||
|
|
5f8020b32e | ||
|
|
860f94e914 | ||
|
|
dc24530382 | ||
|
|
84f04ae984 | ||
|
|
48ffe8dac3 | ||
|
|
1c302f26b3 | ||
|
|
dfe64e3735 | ||
|
|
d7ddeeb40c | ||
|
|
1215f4eb59 | ||
|
|
10ec720686 | ||
|
|
6d5fc4a36b | ||
|
|
4933b89736 | ||
|
|
3958235c89 | ||
|
|
d3bc82d2c3 | ||
|
|
da60c1bb96 | ||
|
|
2e034c1574 | ||
|
|
35001e64c2 | ||
|
|
bdfd6d3175 | ||
|
|
7841b639ec | ||
|
|
35977efe43 | ||
|
|
b5c87aaef8 | ||
|
|
c66b4249ca | ||
|
|
a451d6927a | ||
|
|
178e4e7d29 | ||
|
|
d592959be8 | ||
|
|
f87bd0c190 | ||
|
|
3c9664f099 | ||
|
|
43b65be030 | ||
|
|
899c21257c | ||
|
|
1bda81560e | ||
|
|
09f595e0a8 | ||
|
|
2333b7f31a | ||
|
|
8f42e5f9a7 | ||
|
|
a18b29743e | ||
|
|
8baf0f6340 | ||
|
|
a1951b51b6 | ||
|
|
8bad0b6b7e | ||
|
|
a03d4485b0 | ||
|
|
c0e088ca07 | ||
|
|
97d8db7aae | ||
|
|
bea4f8aad3 | ||
|
|
8d3b22091c | ||
|
|
cbeb8944eb | ||
|
|
dcfa8cc7ba | ||
|
|
32e4aea068 | ||
|
|
2f25db03ba | ||
|
|
570884dc2b | ||
|
|
70602487be | ||
|
|
2077ffa2ca | ||
|
|
2637bd648b | ||
|
|
ee4d86237f | ||
|
|
55bc96e00b | ||
|
|
29f8189d0e | ||
|
|
e10ae3dca1 | ||
|
|
d74398b262 | ||
|
|
a1fe704d22 | ||
|
|
b96bdeeed7 | ||
|
|
9678b1f9ed | ||
|
|
a10c7e3ac2 | ||
|
|
f7217702e2 | ||
|
|
9d59fcaded | ||
|
|
e2378680ef | ||
|
|
e7d6c63863 | ||
|
|
9954ae57a9 | ||
|
|
f61621f753 | ||
|
|
c02f922c10 | ||
|
|
a62ec9217f | ||
|
|
6232e0abd3 | ||
|
|
d5f7839d12 | ||
|
|
d1ebb58580 | ||
|
|
67d00f4772 | ||
|
|
0138398f0c | ||
|
|
040ded3443 | ||
|
|
09d8cce474 | ||
|
|
09df109531 | ||
|
|
e895b9f101 | ||
|
|
f74126ec77 | ||
|
|
ae21ebddc8 | ||
|
|
def374c2b9 | ||
|
|
f638fff16d | ||
|
|
4f5b16b245 | ||
|
|
1167a06a5a | ||
|
|
80991a00f0 | ||
|
|
0ef1b342e4 | ||
|
|
13ed047e13 | ||
|
|
50c3673dfc | ||
|
|
670cbc8903 | ||
|
|
96f2f24ce3 | ||
|
|
d4c9768138 | ||
|
|
254dacb66b | ||
|
|
92bd0fc47a | ||
|
|
4d3507097a | ||
|
|
8dc2ea114f | ||
|
|
db5358f70f | ||
|
|
ccb8b98008 | ||
|
|
795be81f4a | ||
|
|
cc50cefd30 | ||
|
|
5b2ed8a08d | ||
|
|
adbd442448 | ||
|
|
f642066f05 | ||
|
|
b1d0fec02e | ||
|
|
a4ca31e197 | ||
|
|
40b17e4875 | ||
|
|
b99501d5d7 | ||
|
|
0c1568c4ab | ||
|
|
45b02df36b | ||
|
|
182afe9561 | ||
|
|
38bbb2b3e1 | ||
|
|
177d2a5903 | ||
|
|
29d954bab2 | ||
|
|
69ffcf5648 | ||
|
|
360fdfedbc | ||
|
|
cd495a09f1 | ||
|
|
4914a41c2c | ||
|
|
105bfcafe5 | ||
|
|
0bd8629baa | ||
|
|
81ab6d575a | ||
|
|
daad8bcca0 | ||
|
|
0524d4ae49 | ||
|
|
63b7d74272 | ||
|
|
42d3dd68ed | ||
|
|
ca6b07cc47 | ||
|
|
22ada33990 | ||
|
|
c4583a62fb | ||
|
|
a326be71f3 | ||
|
|
212318f95b | ||
|
|
8ce4ed7164 | ||
|
|
9dcc941ec5 | ||
|
|
6802fa1324 | ||
|
|
341cd0da36 | ||
|
|
8476fd0559 | ||
|
|
6c8d87ac04 | ||
|
|
a438d4f4da | ||
|
|
b03f1d4c7f | ||
|
|
a4bad00133 | ||
|
|
b1fa971d35 | ||
|
|
a96be2cdce | ||
|
|
160d90f22a | ||
|
|
3a1c59d461 | ||
|
|
7d908da30f | ||
|
|
add0cedc48 | ||
|
|
fe51b44d98 | ||
|
|
7effd2171c | ||
|
|
1557b15c40 | ||
|
|
897809cc75 | ||
|
|
ad03277e3c | ||
|
|
ad523ebae0 | ||
|
|
472fe9a991 | ||
|
|
a10db7c280 | ||
|
|
71c12aab32 | ||
|
|
385b0b71e7 | ||
|
|
0913849b87 | ||
|
|
d67666f9fa | ||
|
|
5128237228 | ||
|
|
5bb85ee5d5 | ||
|
|
227a4585af | ||
|
|
172f49437f | ||
|
|
deb1151f04 | ||
|
|
b6a79462d5 | ||
|
|
4c9e2d98c1 | ||
|
|
55a1837494 | ||
|
|
74547c0a81 | ||
|
|
f00fb6d1ea | ||
|
|
a75059f94b | ||
|
|
765f8d4c8c | ||
|
|
602623dc50 | ||
|
|
fb223ac377 | ||
|
|
26b3ccf2e5 | ||
|
|
c2ed8783ee | ||
|
|
94cefaf1c5 | ||
|
|
cd29beb00d | ||
|
|
0ae51061f6 | ||
|
|
a6c9bb95f0 | ||
|
|
fd7bc416ce | ||
|
|
f5bc061b26 | ||
|
|
3a76aac226 | ||
|
|
b23863ae85 | ||
|
|
d19dd12b30 | ||
|
|
795801b1f5 | ||
|
|
01a65fa5ba | ||
|
|
e43f34376d | ||
|
|
58fc9ce9ca | ||
|
|
dc5afdccf9 | ||
|
|
a7e4bfe479 | ||
|
|
010b2cb109 | ||
|
|
283c95399c | ||
|
|
dd07038e14 | ||
|
|
a5a0437bda | ||
|
|
314de68297 | ||
|
|
bdc159f0b4 | ||
|
|
2d99847529 | ||
|
|
02a6243718 | ||
|
|
d7e6152d45 | ||
|
|
27c5ffeb76 | ||
|
|
0c17faa78f | ||
|
|
d4e9abe363 | ||
|
|
5ecc426741 | ||
|
|
f671c37a0d | ||
|
|
1933bc1eaf | ||
|
|
c356e71b0a | ||
|
|
a3eef7442f | ||
|
|
d3419e7490 | ||
|
|
4e27394b87 | ||
|
|
f21412ab59 | ||
|
|
b89663e213 | ||
|
|
8ae08cf23d | ||
|
|
6c82a3802e | ||
|
|
387cb8bf8b | ||
|
|
19f9ffc99f | ||
|
|
65d2c53bfe | ||
|
|
976b659e2b | ||
|
|
3b207990ce | ||
|
|
0ec3a8a449 | ||
|
|
8b11d9f039 | ||
|
|
3be4eac555 | ||
|
|
a2a5ca0d01 | ||
|
|
79536a4767 | ||
|
|
8fe2fe7b62 | ||
|
|
41230c05b1 | ||
|
|
2dbb13d8dd | ||
|
|
8d6c7d6753 | ||
|
|
8525b9e9cb | ||
|
|
c8c05306a3 | ||
|
|
0f06e44b90 | ||
|
|
cb3d4ac722 | ||
|
|
e00449c410 | ||
|
|
3ee89a16ef | ||
|
|
4f50b2c698 | ||
|
|
428b3a8cc0 | ||
|
|
d8b3132a3c | ||
|
|
c2ca8b3a2d | ||
|
|
a4c19457ce | ||
|
|
22dda9f398 | ||
|
|
d3e62c62f2 | ||
|
|
cee58b354d | ||
|
|
92f93e9e4f | ||
|
|
d79b6e8574 | ||
|
|
1b0ab1c05f | ||
|
|
391a02fe45 | ||
|
|
2ec6d189ff | ||
|
|
903668aecf | ||
|
|
47dc7e3db8 | ||
|
|
23d521935f | ||
|
|
6b7f794494 | ||
|
|
573fb445c4 | ||
|
|
90ad9c567b | ||
|
|
b1db052bea | ||
|
|
c182916554 | ||
|
|
068529929b | ||
|
|
b3d3e5dd06 | ||
|
|
85c672a0f6 | ||
|
|
ab94af68c1 | ||
|
|
682462fb20 | ||
|
|
75eef8a2c9 | ||
|
|
0cb791ad5b | ||
|
|
c6bd3da1c3 | ||
|
|
5280286415 | ||
|
|
08f26eb097 | ||
|
|
d36941b81d | ||
|
|
3ea96c2587 | ||
|
|
51b9854a19 | ||
|
|
72b2da20e8 | ||
|
|
7f2d8742c2 | ||
|
|
3a94c52426 | ||
|
|
9af520fa54 | ||
|
|
c1a5bf944a | ||
|
|
d7113372cb | ||
|
|
46cacfc60e | ||
|
|
d3aae85014 | ||
|
|
2ba45d0acb | ||
|
|
cf8f2ac56c | ||
|
|
2ed50d2579 | ||
|
|
6d09d29093 | ||
|
|
bd63d28b0f | ||
|
|
1a55b37046 | ||
|
|
63a0f7a637 | ||
|
|
49b908e3c6 | ||
|
|
6609a749a3 | ||
|
|
4224900f47 | ||
|
|
71d5f120a9 | ||
|
|
5684c72e35 | ||
|
|
53356fe61a | ||
|
|
898044933a | ||
|
|
f4dd0f27ed | ||
|
|
e3af337a78 | ||
|
|
ebc335319e | ||
|
|
7c7d0f596a | ||
|
|
561012c3ba | ||
|
|
7a37476b9a | ||
|
|
65564b415d | ||
|
|
25d428fde0 | ||
|
|
f7675bb48a | ||
|
|
10d09eaed3 | ||
|
|
4d148ff078 | ||
|
|
b10d4e9412 | ||
|
|
166c0c2311 | ||
|
|
d5cd51644e | ||
|
|
903648f1fe | ||
|
|
3cc0c5a60a | ||
|
|
97627559a6 | ||
|
|
e497b8f534 | ||
|
|
12cd9e5c88 | ||
|
|
cec672a71d | ||
|
|
cccf8a9870 | ||
|
|
a0f3010159 | ||
|
|
4e5509e206 | ||
|
|
c855eb38d8 | ||
|
|
a59eec01e1 | ||
|
|
6e880ef686 | ||
|
|
8980d92efa | ||
|
|
43561dc389 | ||
|
|
b00bf17153 | ||
|
|
b229f267e4 | ||
|
|
6b82089d6c | ||
|
|
550e8fff6b | ||
|
|
633277ddd0 | ||
|
|
5d5200d20b | ||
|
|
31a7e5628c | ||
|
|
481e970424 | ||
|
|
ec302bc4fc | ||
|
|
47af95469a | ||
|
|
4ac25e09ce | ||
|
|
4493ece2f2 | ||
|
|
26dea23b5d | ||
|
|
1cea12bf57 | ||
|
|
05dd4bbb51 | ||
|
|
09da302b8d | ||
|
|
95286408ed | ||
|
|
26543a3636 | ||
|
|
7bf5da8de4 | ||
|
|
e7149effa7 | ||
|
|
808a54e217 | ||
|
|
bb2251a7b2 | ||
|
|
2f525187a1 | ||
|
|
13ea2ceaa6 | ||
|
|
5c15b306d6 | ||
|
|
b7ced5763b | ||
|
|
f74225721d | ||
|
|
f0bdb61fd8 | ||
|
|
9a6ab81739 | ||
|
|
c71469c715 | ||
|
|
e6d64f72ec | ||
|
|
fc9edda0ef | ||
|
|
084bad5aaa | ||
|
|
98227a886b | ||
|
|
3a1abbed4c | ||
|
|
45a012eb71 | ||
|
|
980058ea4c | ||
|
|
8e59430f93 | ||
|
|
4f91a12f73 | ||
|
|
4b8f3ec5b5 | ||
|
|
bba8d9cd30 | ||
|
|
46d876d607 | ||
|
|
205eb10f43 | ||
|
|
01e01f480e | ||
|
|
1c031466fc | ||
|
|
ff96d914f4 | ||
|
|
278498da48 | ||
|
|
b030f044f4 | ||
|
|
1d86fc07b1 | ||
|
|
5d56d09b8d | ||
|
|
386199e422 | ||
|
|
851ee94c5c | ||
|
|
9526e3f14b | ||
|
|
d86eb46f15 | ||
|
|
2992cbd261 | ||
|
|
914e330ef2 | ||
|
|
f320eb45d8 | ||
|
|
60f335cf02 | ||
|
|
1b395e664f | ||
|
|
8040e7d168 | ||
|
|
9d5d7edf9a | ||
|
|
136163ba4f | ||
|
|
23c9b86f64 | ||
|
|
afb2a4abbf | ||
|
|
c4f69b1eb7 | ||
|
|
d6e7ae3769 | ||
|
|
0ea75894c1 | ||
|
|
0278e78989 | ||
|
|
3b977c8747 | ||
|
|
789db436bb | ||
|
|
2be5ffe4e9 | ||
|
|
369348ebaf | ||
|
|
dad077adf3 | ||
|
|
3b2a3c1277 | ||
|
|
e5674b146d | ||
|
|
ebd3e65f46 | ||
|
|
2d946d0d95 | ||
|
|
cb0c145e3d | ||
|
|
de604a79ab | ||
|
|
172f75e5c0 | ||
|
|
df62b6d78f | ||
|
|
2d274f1369 | ||
|
|
e47b7526bc | ||
|
|
310bf3328e | ||
|
|
4467f811e0 | ||
|
|
637ff87e3f | ||
|
|
c9c50f286c | ||
|
|
59d6ad6b05 | ||
|
|
950f6bb752 | ||
|
|
9c37356267 | ||
|
|
835acec8f3 | ||
|
|
a6d64696e3 | ||
|
|
f4d93587a3 | ||
|
|
d0c40e3295 | ||
|
|
a92943d66c | ||
|
|
3f34f5072f | ||
|
|
bf35c1faf5 | ||
|
|
108643473d | ||
|
|
e8a2a39d72 | ||
|
|
e0cfa01e99 | ||
|
|
d645478f89 | ||
|
|
a0ab7ab6fc | ||
|
|
7090de541a | ||
|
|
5cb7d29c17 | ||
|
|
2f64329c98 | ||
|
|
732fe2e996 | ||
|
|
d02dbcfedd | ||
|
|
a97557f2e4 | ||
|
|
b004202cbf | ||
|
|
2e0f921ded | ||
|
|
b7a17442d9 | ||
|
|
699a21fa87 | ||
|
|
4c95d1af4e | ||
|
|
013117318c | ||
|
|
e93244e0cb | ||
|
|
71030e4d81 | ||
|
|
7eb41e7057 | ||
|
|
ec53a400a7 | ||
|
|
bb0840956f | ||
|
|
dd01ae8ebc | ||
|
|
1105d1019d | ||
|
|
d918c1791a | ||
|
|
b1773cc73b | ||
|
|
83a03b6679 | ||
|
|
f3b3fc3935 | ||
|
|
fff9a4f0c5 | ||
|
|
1f6b90a4f9 | ||
|
|
bc5349061f | ||
|
|
70e3ddb224 | ||
|
|
5e20a7ef5e | ||
|
|
0fd00ca82f | ||
|
|
1fafdb2843 | ||
|
|
c142ee19ba | ||
|
|
880391d0c5 | ||
|
|
9dbad614a5 | ||
|
|
0c6bb6660a | ||
|
|
a4bb8f130b | ||
|
|
dce610747b | ||
|
|
84e6c2a185 | ||
|
|
446e44cb09 | ||
|
|
eb58b8c0b5 | ||
|
|
51964eee20 | ||
|
|
8bda4553ed | ||
|
|
b8951b9934 | ||
|
|
0b7edbad28 | ||
|
|
baf065b789 | ||
|
|
609dde0988 | ||
|
|
41b5387203 | ||
|
|
2311936580 | ||
|
|
ed4558fadd | ||
|
|
b1d56207e3 | ||
|
|
0d5a8c6aaa | ||
|
|
9de9a79925 | ||
|
|
ed0a624b12 | ||
|
|
8627d638e1 | ||
|
|
3990254a7c | ||
|
|
51290457dd | ||
|
|
2c2ab2a7b9 | ||
|
|
a7f21e6cea | ||
|
|
309dbacb67 | ||
|
|
110dda6e48 | ||
|
|
58457ef16c | ||
|
|
55e7c16dea | ||
|
|
51bc64559b | ||
|
|
4c6d46137c | ||
|
|
debbd9f15b | ||
|
|
712910dec0 | ||
|
|
8999235373 | ||
|
|
8c2fe0a9ae | ||
|
|
9651299e79 | ||
|
|
fdb7f972a6 | ||
|
|
12e82baeb3 | ||
|
|
a41ee25518 | ||
|
|
cd20966fc8 | ||
|
|
d3e0d03301 | ||
|
|
2cb6416572 | ||
|
|
3fd40c03bf | ||
|
|
e5b236898f | ||
|
|
67cfff2520 | ||
|
|
68467da7ac | ||
|
|
6b0a62d6ff | ||
|
|
5ff4ee96e4 | ||
|
|
e1603c0f44 | ||
|
|
5ceb73c1cf | ||
|
|
5f631b3499 | ||
|
|
076fddd9d9 | ||
|
|
bcfa6d7e0e | ||
|
|
2c37fb1f5e | ||
|
|
e0fdd8d39e | ||
|
|
cb48ae6989 | ||
|
|
cde2d7c18c | ||
|
|
28b2a34191 | ||
|
|
07a2dc5aa9 | ||
|
|
bfbbd858fb | ||
|
|
564a4758de | ||
|
|
f1b9b8cb73 | ||
|
|
5bb084c32b | ||
|
|
97beb90b8f | ||
|
|
8eca1a0459 | ||
|
|
e7e7a284f5 | ||
|
|
baf7013941 | ||
|
|
7bf6bac63f | ||
|
|
74a09844c2 | ||
|
|
65e071e470 | ||
|
|
e005044f64 | ||
|
|
d788531ae5 | ||
|
|
5ed63521b1 | ||
|
|
3b492142db | ||
|
|
6b99e07043 | ||
|
|
85d64602ff | ||
|
|
c2852bdefe | ||
|
|
e5ffeff36e | ||
|
|
bece92abb2 | ||
|
|
79b51595a5 | ||
|
|
d89fb0e7c4 | ||
|
|
ca83be1db4 | ||
|
|
64c515bac4 | ||
|
|
ff6d79b2cc | ||
|
|
96018412c0 | ||
|
|
35b8c4cb05 | ||
|
|
063e1a5d33 | ||
|
|
f54cd38f2e | ||
|
|
04a5cbab4f | ||
|
|
823f6b1047 | ||
|
|
2db0d1f518 | ||
|
|
cd9ca691ca | ||
|
|
ec254f817d | ||
|
|
84251b02bd | ||
|
|
f0e889b552 | ||
|
|
b490c774bf | ||
|
|
9f66968d1b | ||
|
|
12da79730f | ||
|
|
982e35db45 | ||
|
|
941b5f83f3 | ||
|
|
3fc8aa7071 | ||
|
|
8c76e82e2f | ||
|
|
5ef559f6d8 | ||
|
|
0421d463f8 | ||
|
|
bb3e7fad66 | ||
|
|
d7c2eba4fd | ||
|
|
e31ba43b5a | ||
|
|
5d428d471c | ||
|
|
a934e13309 | ||
|
|
d631da7d11 | ||
|
|
08239ead20 | ||
|
|
7c0e80a415 | ||
|
|
0ff69ec3df | ||
|
|
cad21249e0 | ||
|
|
acfe7ab16d | ||
|
|
652923d056 | ||
|
|
4d18f3e9b7 | ||
|
|
df06a0effe | ||
|
|
e13ffc7507 | ||
|
|
12ec690044 | ||
|
|
7f4139c427 | ||
|
|
74cd84399f | ||
|
|
f762ea6412 | ||
|
|
46e26d9682 | ||
|
|
057e57e0b6 | ||
|
|
7f6b9fb31a | ||
|
|
a034909ae9 | ||
|
|
f785e4b045 | ||
|
|
8870632918 | ||
|
|
3ff13783fa | ||
|
|
54c7109cee | ||
|
|
fe98aab910 | ||
|
|
260be59c9e | ||
|
|
2688805872 | ||
|
|
ed84fd73a3 | ||
|
|
255790b664 | ||
|
|
491c0457a6 | ||
|
|
764990bb59 | ||
|
|
ac72ba5af8 | ||
|
|
846d9ed391 | ||
|
|
21381ff990 | ||
|
|
f43d7cc2d4 | ||
|
|
193d40bae4 | ||
|
|
6d8cbd2c4b | ||
|
|
14c24e1fab | ||
|
|
d0a2315098 | ||
|
|
3d510bcaba | ||
|
|
f75b588b0f | ||
|
|
399f039b9e | ||
|
|
e290e9193d | ||
|
|
646eba5a92 | ||
|
|
096f992cc0 | ||
|
|
f538e04fd2 | ||
|
|
f72e127f5f | ||
|
|
7e7429cadd | ||
|
|
4d36f0d356 | ||
|
|
7867b09a0e | ||
|
|
eb4e365820 | ||
|
|
f57ca1abba | ||
|
|
e8bc606c20 | ||
|
|
9f9191819d | ||
|
|
17cdbc305c | ||
|
|
a0faec186d | ||
|
|
6b4b5ec2a1 | ||
|
|
4a931c3bef | ||
|
|
0e20be17cc | ||
|
|
36cbcb12b2 | ||
|
|
e54e12876b | ||
|
|
d198bef37b | ||
|
|
cfcce71392 | ||
|
|
571eafd149 | ||
|
|
3f598a0f9c | ||
|
|
c0482ff2ea | ||
|
|
3952761812 | ||
|
|
f8ac94353a | ||
|
|
d0d1c5bb37 | ||
|
|
24aa0f7fe6 | ||
|
|
60e087b8e7 | ||
|
|
9ddd8417c8 | ||
|
|
363e7294b6 | ||
|
|
b0aa447d5f | ||
|
|
a96672c0fc | ||
|
|
bf5d3437f0 | ||
|
|
689805ecbb | ||
|
|
a4564b8939 | ||
|
|
ff9701685f | ||
|
|
528edf7e82 | ||
|
|
00397a33f0 | ||
|
|
276b7a03f1 | ||
|
|
6d0286efbd | ||
|
|
920e89a506 | ||
|
|
8f1aa8c2c3 | ||
|
|
376ad6d61d | ||
|
|
90874b434e | ||
|
|
bcf8ff3d0a | ||
|
|
c8227c95dd | ||
|
|
b8cd37aef7 | ||
|
|
f853632260 | ||
|
|
e9c73bd9a6 | ||
|
|
ef27a660a7 | ||
|
|
d4a1f2ef85 | ||
|
|
60faeffde0 | ||
|
|
481f31fe8f | ||
|
|
8a989b65ee | ||
|
|
826b2245ec | ||
|
|
61c6dc5a70 | ||
|
|
bfc46120bb | ||
|
|
b63387ca4f | ||
|
|
4e2f2e0458 | ||
|
|
72a6e71e72 | ||
|
|
7748ac207c | ||
|
|
f852209040 | ||
|
|
32c62a7fe1 | ||
|
|
51d6b467d6 | ||
|
|
638b65c828 | ||
|
|
4e7a8a6478 | ||
|
|
17153b4aae | ||
|
|
ee95aa401d | ||
|
|
ff81118ffc | ||
|
|
fdac368153 | ||
|
|
7f3bf75788 | ||
|
|
506b524db0 | ||
|
|
21b8ae9e52 | ||
|
|
14c67fde7f | ||
|
|
7ca666a0e9 | ||
|
|
c26c9483ec | ||
|
|
a01e6652df | ||
|
|
57c00e7e26 | ||
|
|
a67896ab2b | ||
|
|
142503d3b5 | ||
|
|
fe9022afe0 | ||
|
|
64d3408188 | ||
|
|
ffd9b1bede | ||
|
|
daf52cb32e | ||
|
|
92d572285e | ||
|
|
59302e816c | ||
|
|
7325147d83 | ||
|
|
d6592b6b0a | ||
|
|
3460214467 | ||
|
|
38b486eb6b | ||
|
|
a2e1d622e1 | ||
|
|
c6139b7285 | ||
|
|
dbe0705880 | ||
|
|
4b471a6e01 | ||
|
|
a87192f8d0 | ||
|
|
f425d8dc8b | ||
|
|
9e25601a56 | ||
|
|
fca5af7ac3 | ||
|
|
1af0ede1a6 | ||
|
|
e7733abc40 | ||
|
|
4171c93bff | ||
|
|
dd2c9c911b | ||
|
|
de052537ec | ||
|
|
68bc6b37ae | ||
|
|
548d1bae9e | ||
|
|
c89e557158 | ||
|
|
62dda5fdbf | ||
|
|
22f24bd48f | ||
|
|
eeb0c65b6e | ||
|
|
b23fcf238b | ||
|
|
79698981ad | ||
|
|
ab4e3e8c75 | ||
|
|
4bee4429aa | ||
|
|
269ee7e672 | ||
|
|
8d6b70c22c | ||
|
|
e786059506 | ||
|
|
d48d4385d9 | ||
|
|
1521be8acb | ||
|
|
76c97bbfad | ||
|
|
1b931dd410 | ||
|
|
77baa1c930 | ||
|
|
d41b7770c4 | ||
|
|
4f145a4f4f | ||
|
|
fc7dc3cef7 | ||
|
|
0dbfd721b3 | ||
|
|
243505b7cb | ||
|
|
04af898fe5 | ||
|
|
9e1c5747f6 | ||
|
|
ab49806a5f | ||
|
|
e24934d5ea | ||
|
|
8ab162ffb1 | ||
|
|
614e5bc44f | ||
|
|
c1137ee3fa | ||
|
|
6cfe0ea77c | ||
|
|
d89b7f93b2 | ||
|
|
a6b114e423 | ||
|
|
90f2ebeac1 | ||
|
|
60cca4d9d2 | ||
|
|
9b2752ff07 | ||
|
|
16c4035e1c | ||
|
|
b5eba22aaf | ||
|
|
98b572d17a | ||
|
|
76c6e01534 | ||
|
|
15b1281075 | ||
|
|
e4ef930b47 | ||
|
|
19e86a2b19 | ||
|
|
46b62b4a63 | ||
|
|
7874d179da | ||
|
|
341a4d50ea | ||
|
|
b8328a9fdf | ||
|
|
5b8411fe77 | ||
|
|
682d8f23e9 | ||
|
|
34a9224334 | ||
|
|
88ee7cbfa8 | ||
|
|
70e472e9e2 | ||
|
|
e9adb44c4a | ||
|
|
81f8cae52a | ||
|
|
36e67108fb | ||
|
|
f0bad7b091 | ||
|
|
354c50039b | ||
|
|
b9c69e24a9 | ||
|
|
6319262b9c | ||
|
|
78e02bf3dd | ||
|
|
3492ba5fd6 | ||
|
|
f9ed6cbbfe | ||
|
|
98a573033d | ||
|
|
066089873b | ||
|
|
8032ff6e19 | ||
|
|
99d5dba6ae | ||
|
|
0b0455975b | ||
|
|
4b34894b59 | ||
|
|
311ee2db62 | ||
|
|
dfafcb0513 | ||
|
|
28520af599 | ||
|
|
207795abfd | ||
|
|
495ad41741 | ||
|
|
d591529e7a | ||
|
|
3a5dace583 | ||
|
|
e2952586d1 | ||
|
|
5f456d067e | ||
|
|
ef2ddf6912 | ||
|
|
05c1f9c9aa | ||
|
|
0c2fbd178d | ||
|
|
85814137ea | ||
|
|
34792a3493 | ||
|
|
148e15bca0 | ||
|
|
a3806194ee | ||
|
|
c4c8778017 | ||
|
|
ecd117d80d | ||
|
|
b142a44fd0 | ||
|
|
ed4aae2d18 |
No files matched your search
+1
-1
@@ -1,6 +1,6 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [twinaphex]
|
||||
github: [libretro]
|
||||
patreon: libretro
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
|
||||
+1
-1
@@ -174,7 +174,7 @@ retroarch_switch.nso
|
||||
|
||||
# PS2
|
||||
ps2/irx/*.c
|
||||
ps2/libcdvd/lib/
|
||||
*.irx
|
||||
|
||||
# Wayland
|
||||
gfx/common/wayland/idle-inhibit-unstable-v1.c
|
||||
|
||||
+19
-1
@@ -32,18 +32,24 @@ matrix:
|
||||
env: CXX_BUILD=1 CROSS_COMPILE=x86_64-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501"
|
||||
- compiler: gcc
|
||||
env: CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: CC="gcc-8 --sysroot=/" CXX="g++-8 --sysroot=/"
|
||||
- compiler: gcc
|
||||
env: C89_BUILD=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: CXX_BUILD=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_MENU=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_NETWORKING=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_OVERLAY=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_CDROM=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_VIDEO_LAYOUT=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_THREADS=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: DISABLE_AUDIOMIXER=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
@@ -103,9 +109,13 @@ matrix:
|
||||
- cd pkg/android/phoenix
|
||||
- ./gradlew assembleNormalRelease
|
||||
|
||||
jobs:
|
||||
allow_failure:
|
||||
- os: osx
|
||||
|
||||
before_install:
|
||||
- |
|
||||
if [ "$CC" = gcc-8 ]; then
|
||||
if [[ "$CC" =~ ^gcc-8.* ]]; then
|
||||
# Install a more recent gcc than the default
|
||||
sudo apt-get install -y g++-8
|
||||
elif [ "$CC" = clang-6.0 ]; then
|
||||
@@ -130,6 +140,10 @@ before_script:
|
||||
if [ -n "$DISABLE_OVERLAY" ]; then
|
||||
ARGS="$ARGS --disable-overlay"
|
||||
fi
|
||||
- |
|
||||
if [ -n "$DISABLE_NETWORKING" ]; then
|
||||
ARGS="$ARGS --disable-networking"
|
||||
fi
|
||||
- |
|
||||
if [ -n "$DISABLE_CDROM" ]; then
|
||||
ARGS="$ARGS --disable-cdrom"
|
||||
@@ -138,6 +152,10 @@ before_script:
|
||||
if [ -n "$DISABLE_VIDEO_LAYOUT" ]; then
|
||||
ARGS="$ARGS --disable-video_layout"
|
||||
fi
|
||||
- |
|
||||
if [ -n "$DISABLE_THREADS" ]; then
|
||||
ARGS="$ARGS --disable-threads --disable-glslang"
|
||||
fi
|
||||
- |
|
||||
if [ -n "$DISABLE_AUDIOMIXER" ]; then
|
||||
ARGS="$ARGS --disable-audiomixer"
|
||||
|
||||
Vendored
+4
-4
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
|
||||
"terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
|
||||
"terminal.integrated.env.windows": {
|
||||
"PATH": "/mingw64/lib/ccache/bin:/mingw64/lib/ccache/bin:/mingw64/lib/ccache/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:$PATH",
|
||||
"MSYSTEM": "MINGW64",
|
||||
},
|
||||
"terminal.integrated.cursorBlinking": true,
|
||||
|
||||
"editor.tabSize": 3,
|
||||
"editor.detectIndentation": false,
|
||||
"editor.renderWhitespace": "all",
|
||||
"editor.insertSpaces": true,
|
||||
"editor.formatOnSave": false,
|
||||
"files.associations": {
|
||||
"frontend_driver.h": "c",
|
||||
"*.in": "c",
|
||||
@@ -42,7 +42,7 @@
|
||||
"core_info.h": "c",
|
||||
"thread": "c",
|
||||
"xlocale": "c",
|
||||
"menu_widgets.h": "c",
|
||||
"gfx_widgets.h": "c",
|
||||
"message_queue.h": "c",
|
||||
"task_queue.h": "c",
|
||||
"fifo_queue.h": "c",
|
||||
@@ -52,7 +52,7 @@
|
||||
"ozone_display.h": "c",
|
||||
"verbosity.h": "c",
|
||||
"retroarch.h": "c",
|
||||
"menu_animation.h": "c",
|
||||
"gfx_animation.h": "c",
|
||||
"netplay.h": "c",
|
||||
"scaler.h": "c",
|
||||
"deque": "c",
|
||||
|
||||
+282
@@ -1,5 +1,285 @@
|
||||
# Future
|
||||
|
||||
# 1.8.9
|
||||
- AUTO SAVESTATES: Ensure save states are correctly flushed to disk when quitting RetroArch (fixes broken save states when exiting RetroArch - without first closing content - with 'Auto Save State' enabled)
|
||||
- BUILTIN CORES: Builtin cores like ffmpeg and imageviewer would previously try to erroneously load a dynamic core named 'builtin' - this would fail and would just be a wasteful operation - this now skips dylib loading in libretro_get_system_info for builtin cores
|
||||
- CHEEVOS: Report API errors when unlocking achievements or submitting leaderboards
|
||||
- CHEEVOS: Support less common file extensions
|
||||
- CHEEVOS: Disable hardcore mode when playing BSV file
|
||||
- CHEEVOS: Correctly report unlocked non-hardcore achievements when hardcore is paused
|
||||
- CHEEVOS/M3U: Bugfix - did not handle absolute/relative paths in M3U files correctly before
|
||||
- CHEEVOS/M3U: Bugfix - it didn't handle comments/directives
|
||||
- CHEEVOS/M3U: Bugfix - it doesn't handle trailing whitespace
|
||||
- CHEEVOS/M3U: Bugfix - failed when loading M3U files with certain line endings
|
||||
- CORE MANAGEMENT: Add 'core management' menu (Settings -> Core)
|
||||
- CORE MANAGEMENT: Add option to backup/restore installed cores
|
||||
- CORE MANAGEMENT: Improved core selection logic
|
||||
- CORE INFO: Search search optimisations
|
||||
- CORE DOWNLOADER: Rename 'Core Updater' to 'Core Downloader'
|
||||
- CORE DOWNLOADER: Add 'Show Experimental Cores' setting under Settings > Network > Updater
|
||||
- CORE DOWNLOADER: Core licenses are now shown for all entries in the Core Updater menu
|
||||
- CORE DOWNLOADER: Pressing RetroPad select on a Core Updater entry will now display any text in the description field of its info file
|
||||
- CORE DOWNLOADER: Installed cores are now highlighted via a [#] symbol
|
||||
- CORE DOWNLOADER: Pressing RetroPad start on a selected, installed entry opens the Core Information menu (when using Material UI, swiping left or right triggers the same action). This means we can now view bios info etc. - and more importantly delete cores - without jumping through all the hoops of loading a core first and navigating all over the place
|
||||
- CORE DOWNLOADER/UPDATER: Add option to automatically backup cores when updating
|
||||
- DISK CONTROL: Enable 'Load New Disc' while disk tray is open
|
||||
- INPUT: Added a hotkey delay option to allow hotkey input to work properly when it is assigned to another action
|
||||
- INPUT: Remove 'All Users Control Menu' setting, was buggy and will be properly reintroduced after input overhaul
|
||||
- LINUX: Set default saves/save states/system paths
|
||||
- LOCALIZATION: Add Persian language
|
||||
- LOCALIZATION: Add Hebrew language
|
||||
- LOCALIZATION: Add Asturian language
|
||||
- MENU: Proper line wrapping for message dialog boxes
|
||||
- MENU/HOTKEYS: Add sublabels to all hotkey bind entries
|
||||
- MENU/QUICK MENU: Suppress the display of 'empty' quick menu listings when closing content
|
||||
- MENU/OZONE: Performance improvements
|
||||
- MENU/SDL: Add mouse controls
|
||||
- OPENGL1/VITA: Initial changes for HW context without FBO
|
||||
- OVERLAYS: Add options for moving the on-screen overlay
|
||||
- PLAYLISTS/WINDOWS: Fix core path entries in image/video/music history playlists
|
||||
- PS2: Add back CDFS support
|
||||
- SDL/GL: Advertise GLSL support
|
||||
- VIDEO/WIDGETS: Fix heap-use-after-free errors, leading to memory corruption
|
||||
- VITA: Added custom bubbles support
|
||||
- VITA: VitaGL update
|
||||
- VULKAN/WSI: Better frame pacing
|
||||
- VULKAN/WSI: Fix Intel Mesa being broken when using Fences, we have to use Semaphores to acquire the swapchain or the entire GPU stalls
|
||||
- VULKAN/WSI: Add support for either using fences or semaphores when syncing
|
||||
- VULKAN/WSI: Prefer using semaphores for integrated GPUs as it promotes better throughput over fences
|
||||
- VULKAN/WSI/ANDROID: Do not use mailbox emulation on Android
|
||||
- UWP/XBOX: Potentially improve performance by enabling 'Game Mode'
|
||||
|
||||
# 1.8.8
|
||||
- AUDIO/JACK: Fix regression introduced after 1.8.4 - would hang at startup
|
||||
- CHEEVOS: Disable hardcore when cheats are enabled
|
||||
- CHD: Return false when special track cannot be found
|
||||
- DISCORD/MATCHMAKING: Fix Discord 'Ask To Join' functionality
|
||||
- FILE PATH: Various file path handling optimisations
|
||||
- FONT: Fix Arabic, Chinese and Korean font rendering
|
||||
- INPUT MAPPING/REMAPPING: Restore broken 'reset to default' functionality with RetroPad 'start' button
|
||||
- INPUT MAPPING/REMAPPING: Fix 'reset to default' action for analog sticks and undefined core inputs
|
||||
- LOCALIZATION: Update Arabic translation
|
||||
- LOCALIZATION: Update Chinese (Simplified) translation
|
||||
- LOCALIZATION: Update Chinese (Traditional) translation
|
||||
- LOCALIZATION: Update German translation
|
||||
- LOCALIZATION: Update Greek translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- LOCALIZATION: Update French translation
|
||||
- LOCALIZATION: Update Italian translation
|
||||
- LOCALIZATION: Update Japanese translation
|
||||
- LOCALIZATION: Update Korean translation
|
||||
- LOCALIZATION: Update Dutch translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Portuguese Brazilian translation
|
||||
- LOCALIZATION: Update Russian translation
|
||||
- LOCALIZATION: Update Turkish translation
|
||||
- LOCALIZATION: Update Vietnamese translation
|
||||
- LOCALIZATION: Add Slovak translation
|
||||
- MENU: Small buffer optimizations
|
||||
- MENU/THUMBNAILS/BUGFIX: Fix heap-use-after-free error
|
||||
- MENU/OZONE: Add option to sort playlists after name truncation
|
||||
- MENU/OZONE/ANDROIDTV: Default to Ozone menu driver
|
||||
- MENU/OZONE/ANDROID: Gamepad-like devices default to Ozone now (Shield Portable)
|
||||
- NETPLAY: Lower announcement rate
|
||||
- OVERLAYS: Fix memory leak when loading overlays
|
||||
- SHADER PRESETS: Improved shader preset dirs
|
||||
- TIME/DATE: Enable configuration of date seperator in clock and runtime 'last played' displays
|
||||
- VITA: Fix upside-down vertical games
|
||||
- UWP: Enable playlist and savefile compression by default (because of slow file I/O)
|
||||
- WIIU: Gamepad hotplugging support
|
||||
- WIIU: Theoretical multi-gamepad support
|
||||
- VIDEO/WIDGETS: Fix overlapping text when simultaneous pop-up notifications and core/shader messages are being displayed
|
||||
- X11: Fix crash in x11_display_server_get_screen_orientation
|
||||
- X11/XSHM: Allow X11/XHSM video driver to operate without SHM extension
|
||||
- X11/XSHM: Fix compatibility with X11 input driver
|
||||
- XVIDEO: Fix keyboard input initialization
|
||||
- XVIDEO/XWAYLAND: Fix XVideo support on xwayland (by supporting I420 and YZ12)
|
||||
|
||||
# 1.8.7
|
||||
- 3DS: Add IDs for Frodo
|
||||
- 3DS: Enable basic networking / cheevos
|
||||
- CHEEVOS/BUGFIX: Opening achievements list would crash RetroArch with badges enabled (on new games)
|
||||
- CHEEVOS: Option to start a session with all achievements active
|
||||
- CHEEVOS: Don't perform unnecessary cheevos initialisation when cheevos are disabled. Should reduce startup times when loading content.
|
||||
- CORE OPTIONS: Disable 'Use Global Core Options File' by default
|
||||
- DOS/DJGPP: Add 32bit color support for cores
|
||||
- GLCORE: Switch to glcore video driver when requested by a core
|
||||
- LINUX/XDG: Use GenericName correctly in desktop entry
|
||||
- MAC/COCOA: Fix mouse cursor tracking
|
||||
- MENU/MATERIALUI: Add desktop-style playlist view mode
|
||||
- MENU/MATERIALUI/DESKTOPVIEW: When scrolling playlists, show last selected thumbnails while waiting for next entry to load
|
||||
- MENU/MATERIALUI: Limit tab switch rate when input repeat is active
|
||||
- MENU/OZONE: Fix sidebar playlist sort order when 'Truncate Playlist Names' is enabled
|
||||
- MENU/RGUI: Adjusted menu defaults, adjusted default scrolling speed
|
||||
- MENU/RGUI: Enable custom wallpaper when menu size is reduced at low resolutions
|
||||
- MENU/XMB: Limit tab switch rate when input repeat is active
|
||||
- NETPLAY: Fix regressions introduced in 1.8.5
|
||||
- RGUI: Add option to always stretch menu to fill the screen
|
||||
- WIIU: Enable graphics widgets
|
||||
|
||||
# 1.8.6
|
||||
- 3DS: Add IDs for UZEM, TGB Dual, and NeoCD
|
||||
- 3DS: Fix font driver horizontal text alignment
|
||||
- 3DS: Allow button presses up to INPUT_MAX_USERS - this enables the 3DS to bind and use buttons and axis for users up to the maximum set by 'Max Users' in the input settings menu.
|
||||
- 3DS: Disable video filter if upscaled resolution exceeds hardware limits. The 3DS has a maximum video buffer size of 2048x2048. This is sufficient for every core that it supports, but when using software video filters the core output resolution is doubled. This is made worse by the fact that the video filter upscaling buffer size is dependent upon the maximum output resolution of the core - which in some cases is very large indeed (e.g. pcsx-rearmed sets a maximum width of 1024, for enhanced resolution support). The 3DS has very limited 'linear memory' for graphics buffer purposes, and a large base core buffer + video filter buffer can easily exceed this - which may also disable video output, or cause a crash. This PR very simply adds a 3DS-specific check to the video filter initialisation: if the resultant upscaling buffer exceeds the hardware limitation, then the filter is automatically disabled.
|
||||
- 3DS/FONT/BUGFIX: Text colour was wrong: the RGBA channels were muddled, and R was always set to 255
|
||||
- 3DS/FONT/BUGFIX: When drawing multiline strings, the line spacing was completely incorrect
|
||||
- 3DS/FONT: Improves the appearance of the drop shadow effect on notification text.
|
||||
- 3DS/ARCHIVE/7Z: Re-enable 7zip support.
|
||||
- ARCHIVE/ZIP: Expand functionality of 'rzip_stream' interface. This PR expands the functionality of the new rzip_stream archived stream interface such that it now has almost complete feature parity with the standard file_stream interface, and can therefore be used as a drop-in replacement in most situations
|
||||
- AI SERVICE: Hide redundant entries when service is disabled
|
||||
- AI SERVICE: Added in auto-translate support
|
||||
- AI SERVICE: support for NVDA and SAPI narration
|
||||
- AUTOCONFIG: Use correct port index in input device configured/disconnected notifications
|
||||
- BUGFIX: Fix race condition where task could momentarily not be in the queue when reordering
|
||||
- CHEEVOS/BUGFIX: Prevent null reference rendering achievement list while closing application
|
||||
- CHEEVOS/BUGFIX: Report non-memorymap GBA cores as unsupported
|
||||
- COMMANDLINE: Advise against using -s and -S variables on the command line. …
|
||||
- CONFIG FILE: Only write config files to disk when parameters change
|
||||
- CONFIG FILE/BUGFIX: RetroArch no longer crashes when attempting to save a config file after 'unsetting' a parameter (currently, this can be triggered quite easily by manipulating input remaps)
|
||||
- CONFIG FILE/BUGFIX: When using Material UI, RetroArch no longer modifies the wrong setting (or segfaults...) when tapping entries in the Quick Menu > Controls input remapping submenu
|
||||
- CONFIG FILE/BUGFIX: Quite a few real and potential memory leaks have been fixed.
|
||||
- CHD: Fixes a crash caused by ignoring the return value from one of the CHD library functions
|
||||
- FASTFORWARDING: A new Mute When Fast-Forwarding option has been added under Settings > Audio. When enabled, users can fast forward without having to listen to distorted audio.
|
||||
- GLCORE/SLANG: Set filter and wrap mode correctly when intialising shader textures. Before, the glcore shader driver did not correctly initialise loaded textures. The texture filtering and wrap mode were forced on texture creation, but these settings were not recorded - subsequent updates would set garbage values, that would resolve to linear filtering OFF and wrap mode = CLAMP_TO_EDGE.
|
||||
- LOCALIZATION: Update Japanese translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- LOCALIZATION: Update Portuguese Brazilian translation
|
||||
- IOS: Set audio session category to ambient so sound does not get cut off on interruption (phone call/playing back audio)
|
||||
- MAC/IOHIDMANAGER/BUGFIX: Fix for Mayflash N64 adapter. In case last hatswitch does not match cookie. For the mayflash N64 adapter, I was getting a BAD EXC ADDRESS (in mac OS 10.13) for this line (tmp was NULL). Retroarch would crash in the gui if I pressed a button from the DPAD on controller 2. With this change, it no longer crashes in the gui and still registers the button push.
|
||||
- MAC/COCOA: Fix mouse input - this brings back two lines of code that have been removed over time but
|
||||
appear to be required in order for mouse input to work on macOS
|
||||
- METAL/BUGFIX: GPU capture on Metal/OSX/NVidia could crash
|
||||
- METAL/BUGFIX: Taking screenshots could capture black frames. Resulting PNG screenshots were black.
|
||||
- METAL/BUGFIX: Corrupted image due to incorrect viewport copy when taking screenshot
|
||||
- MENU: Prevent font-related segfaults when using extremely small scales/window sizes
|
||||
- MENU: Fix 'gfx_display_draw_texture_slice()'
|
||||
- MENU/FONT: Enable correct vertical alignment of text (+ font rendering fixes)
|
||||
- MENU/RGUI: Enable automatic menu size reduction when running at low resolutions (down to 256x192)
|
||||
- MENU/OZONE: Update timedate style options for Last Played sublabel metadata
|
||||
- MENU/OZONE: Hide 'Menu Color Theme' setting when 'Use preferred system color theme' is enabled
|
||||
- MENU/OZONE: Fix thumbnail switching via 'scan' button functionality
|
||||
- MENU/OZONE: Prevent glitches when rendering Ozone's selection cursor
|
||||
- MENU/OZONE: Enable proper vertical text alignment + thumbnail display improvements
|
||||
- MENU/OZONE: Enable second thumbnail/content metadata toggle using RetroPad 'select'
|
||||
- MENU/OZONE: Refactor footer display
|
||||
- MENU/OZONE: Hide thumbnail button hints when viewing file browser lists
|
||||
- MENU/OZONE/INPUT/BUGFIX: Fix undefined behaviour when using touch screen to change input remaps
|
||||
- MENU/OZONE/INPUT/BUGFIX: It turns out that Windows reports negative pointer coordinates when the mouse cursor goes beyond the left hand edge of the RetroArch window (this doesn't happen on Linux, so I never encountered this issue before!). As a result, if Ozone is currently not showing the sidebar (menu depth > 1), moving the cursor off the left edge of the window generates a false positive 'cursor in sidebar' event - which breaks menu navigation, as described in #10419. With this PR, we now handle 'cursor in sidebar' status correctly in all cases
|
||||
- MENU/OZONE/INPUT/BUGFIX: Pointer input is now correctly disabled when message boxes are displayed
|
||||
- MENU/XMB: Fix thumbnail switching via 'scan' button functionality
|
||||
- ODROID GO ADVANCE: Add DRM HW context driver
|
||||
- PSL1GHT: Initial port
|
||||
- PSL1GHT/KEYBOARD: Implement PSL1GHT keyboard
|
||||
- PLAYLIST/BUGFIX: Improve handling of 'broken' playlists - RetroArch will no longer segfault when attempting to run content via a playlist entry with missing path or core path fields.
|
||||
- PLAYLIST/BUGFIX: Improve handling of 'broken' playlists - when a playlist entry has either core path and/or core name set to NULL, DETECT or an empty string, attempting to load content will fallback to the normal 'core selection' code (currently this happens only if both core path and core name are DETECT - this is wholly inadequate!)
|
||||
- PLAYLIST/BUGFIX: RetroArch will no longer segfault when attempting to fetch content runtime information when core path is NULL
|
||||
- PLAYLIST/BUGFIX: Core name + runtime info will only be displayed on playlists and in the Information submenu if both the core path and core name fields are 'valid' (i.e. not NULL or DETECT)
|
||||
- PLAYLIST/BUGFIX: When handling entries with missing path fields, the menu sorting order now matches that of the playlist sorting order (at present, everything goes out of sync when paths are empty). Moreover, entries with missing path fields can now be 'selected', so users can remove them (currently, hitting A on such an entry immediately tries - and fails - to load the content, so the only way to remove the broken entry is via the Playlist Management > Clean Playlist feature)
|
||||
- PLAYLIST: Add optional per-playlist alphabetical sorting
|
||||
- PLAYLIST: Omit whitespace when writing compressed JSON format playlists
|
||||
- PLAYLIST: Add optional playlist compression
|
||||
- QNX: Support analog sticks
|
||||
- SAVESTATES: Add optional save state compression (enabled by default now)
|
||||
- SRAM: Add optional save (SRAM) file compression
|
||||
- SCANNER: Prevent redundant playlist entries when handling M3U content
|
||||
- SCANNER/ANDROID: Fix content scanner being unable to identify certain games from CHD images (raw data sector/subcode)
|
||||
- TASKS/BUGFIX: Fix task deadlocks
|
||||
- TASKS/SCREENSHOT/BUGFIX: Fix heap-use-after-free error when widgets are disabled
|
||||
- TVOS: Disable overlays for tvOS, fix app icon
|
||||
- VIDEO/WIDGETS/BUGFIX: The font ascender/descender metrics added in #10375 are now used to achieve 'pixel perfect' vertical text alignment
|
||||
- VIDEO/WIDGETS/BUGFIX: Message queue text now uses its own dedicated font. Previously, a single (larger) font was used for all active widgets, and this was scaled down for message queue items. This 'squished' the text a little; more importantly, when using the stb font renderers (on Android. etc.) it caused ugly artefacts around the edges of glyphs due to pixel interpolation errors. Now that a correctly sized font is used, the message queue is always rendered cleanly.
|
||||
- VIDEO/WIDGETS/BUGFIX: Previously, each widget font was 'flushed' (font_driver_flush()) at least once a frame. This is quite a slow operation. Now we only flush fonts if they have actually been used.
|
||||
- VULKAN/BUGFIX: Fix display of statistics text
|
||||
- UNIX/BUGFIX: Fix overflow when computing total memory on i386
|
||||
- WIIU/BUGFIX: Fix font driver horizontal text alignment
|
||||
- WIIU/BUGFIX: Fix non-vertex coordinates in draws using tex shader
|
||||
- WIIU/BUGFIX: Update and fix meta.xml file for the WiiU release. This change makes it so the information from the meta.xml file parsed for the WiiU's Homebrew Launcher is displayed properly.
|
||||
|
||||
# 1.8.5
|
||||
- 3DS: Keep the bottom screen hidden on sleep/wakeup. When the 3DS wakes back up after being closed, the bottom screen needs to be reinitialized. Adding the condition here will cause the screen to be turned on or off based on the state of ctr_bottom_screen_enabled, as you'd expect
|
||||
- ANDROID/CHROMEBOOK/CRASH: Fix Chromebook crashes (on x86 x64) when touching the screen
|
||||
- BUGFIX: Prevent double input when using 'return' key (hardware) to close on-screen keyboard
|
||||
- BUGFIX: Fix mouse capture hotkey not working
|
||||
- BUGFIX: Avoid overflow when calculating multiplying performance counter
|
||||
- BUGFIX: Retroarch overlay displaying "Game remap file loaded." on the overlay instead of "Core remap file loaded." when only a core remap file is present
|
||||
- CHEEVOS/BUGFIX: Achievement triggers could cause Retroarch to Crash
|
||||
- CHEEVOS: Don't block Sameboy core because it only exposes some memory
|
||||
- CHEEVOS: Support for extended Sega CD memory
|
||||
- CHEEVOS: Show RetroAchievements Hash in content information list
|
||||
- CHEEVOS: If the core says it's exposing SYSTEM_RAM, give it the benefit of the doubt
|
||||
- CHEEVOS: RetroAchievements rich presence for RA.org website/Discord
|
||||
- CHEEVOS: Reset token when username or password changes
|
||||
- CHEEVOS: Display measured progress on locked achievements
|
||||
- CHEEVOS: Queue multiple popups
|
||||
- CHEEVOS: Add delay retries to leaderboard submits
|
||||
- CHEEVOS: Prevent buffer overflow when encountering an unknown macro
|
||||
- CORE UPDATER: Prevent hang when fetching core list if HTTP transfer fails
|
||||
- DISK CONTROL: Add disk labels to 'disk inserted' notifications
|
||||
- EMSCRIPTEN: Recreate input event listeners properly
|
||||
- FFMPEG CORE: Fix crash on seeking when using HW decoding in some cases
|
||||
- LIBRETRO: Add disk control interface API extension
|
||||
- LINUX: Avoid possible crash when running retroarch at startup
|
||||
- LINUX/GLX: Fix threaded video crashes/instability because of GLX OML sync callbacks
|
||||
- LOCALIZATION: Update French translation
|
||||
- LOCALIZATION: Update Korean translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- LOCALIZATION: Update Portuguese Brazilian translation
|
||||
- MENU: Add Menu Scroll Acceleration option
|
||||
- MENU: Automatically select currently checked item when opening drop-down lists
|
||||
- MENU: Fix smooth (vertical) line ticker scroll speed
|
||||
- MENU: Don't flush on override/remap messages
|
||||
- MENU/DATETIME: Adds some new timedate styles that follow the DD/MM/YYYY format, found in several European countries
|
||||
- MENU/DATETIME: Modifies the existing translation files in order to accommodate the new options that are now available
|
||||
- MENU/DATETIME: Reorders the timedate view options based on a decreasing order of the quantity of information displayed, so that they are more convenient to switch around and easily categorized
|
||||
- MENU/BUGFIX: Fix bug - if you were in XMB and you would set menu driver to RGUI, you could no longer go to the left or right tab
|
||||
- MENU/MATERIALUI: Add option to remove navigation bar
|
||||
- MENU/OZONE: Add DPI-based scaling
|
||||
- MENU/OZONE: Add rudimentary pointer support
|
||||
- MENU/OZONE: Add 'Nord' and 'Gruvbox Dark' themes
|
||||
- MENU/OZONE/POINTER: Pointer can be used to switch between sidebar and entries list
|
||||
- MENU/OZONE/POINTER: Pointer can be used to select sidebar and entries list items
|
||||
- MENU/OZONE/POINTER: Both sidebar and entries list can be scrolled by dragging
|
||||
- MENU/OZONE/POINTER: Clicking/pressing the header or footer produces a 'cancel' action
|
||||
- MENU/OZONE/POINTER: Cursor focus follows mouse pointer from sidebar to entries list (and vice versa)
|
||||
- MENU/OZONE/POINTER: In entries list, item under cursor is automatically selected (with some fudging to ensure this doesn't break mouse wheel scrolling)
|
||||
- MENU/OZONE/POINTER: In sidebar, item under cursor is not automatically selected (this is too jarring)
|
||||
- MENU/RGUI: Add 'Flux' theme
|
||||
- MENU/XMB: New color themes 'Cube Purple', 'Family Red', etc
|
||||
- NETPLAY/MENU/BUGFIX: Fix Netplay Stateless Mode doesn't save. Affects other netplay settings which can be overridden by commandline option
|
||||
- ODROID GO ADVANCE: Rotation support
|
||||
- NETPLAY/ROOMS/BUGFIX: Prevent out-of-bounds array indexing when displaying/selecting netplay rooms in menus
|
||||
- SCANNER: Add 'Arcade DAT Filter' Option
|
||||
- SCANNER: Add scanning Korea and Asia PS1 discs
|
||||
- SCANNER: Add support for scanning PSP Korean
|
||||
- VIDEO: Set hardware 'Bilinear filtering' off by default
|
||||
- VIDEO/WIDGETS: Widgets are now menu-independent
|
||||
- VIDEO/WIDGETS: Allow notifications to use full screen width when not displaying menu
|
||||
- VIDEO/WIDGETS: DPI-based scaling
|
||||
- VIDEO/WIDGETS: Fix volume widget scaling
|
||||
- VIDEO/WIDGETS: Add independent widget scale override settings for fullscreen/windowed modes
|
||||
- VIDEO/WIDGETS/BUGFIX: Prevent improper display of (old style) OSD text when widgets are enabled
|
||||
- VIDEO/WIDGETS/THREADED/BUGFIX: Fix issue - corruption of menu widgets when running some cores (e.g. VICE) with threaded video enabled
|
||||
- WIFI/CONNMANCTL: Display more characters from SSID
|
||||
|
||||
# 1.8.4
|
||||
- ANDROID/BUGFIX: Prevent crash when Android device is minimized and you go back to the app
|
||||
- CAMERA/BUGFIX: Fix crash when a core requires the camera driver and the platform only has a null driver. This would crash mgba on Wii for example
|
||||
- DISK CONTROL: Cycle Disk Tray now becomes Eject Disk or Insert Disk depending upon current drive state
|
||||
- DISK CONTROL: Current Disk Index is only shown when the current disk has been ejected
|
||||
- DISK CONTROL: The old Insert Disk entry has been changed to Load New Disk, and is only shown when a disk is currently inserted (this is because loading a new disk from the filesystem - i.e. bypassing the m3u playlist disk index interface - automatically ejects and inserts disks, and so cannot be done while the virtual drive is empty)
|
||||
- DISK CONTROL: The Current Disk Index may now be set more easily via a drop-down list.
|
||||
- DISK CONTROL: Selecting Eject Disk automatically moves the menu selection to the Current Disk Index entry
|
||||
- DISK CONTROL: Selecting an index via the Current Disk Index drop-down list automatically moves the menu selection back to Insert Disk
|
||||
- DISK CONTROL: The Disk Control entry sublabels have been changed for greater clarity
|
||||
- DISK CONTROL: All of the horrendous notification spam has been removed. Notifications are now only shown in the event of an error, or when the menu itself does not provide sufficient visual feedback (note that using hotkeys to swap disks still produces the old style notifications, since this is typically only done while content is running - i.e. no menu). The duration of disk-related info notifications has also been reduced to a more sane level.
|
||||
- DISK CONTROL: A new Resume content after changing disks option has been added under Settings > User Interface. When enabled (default setting), content is resumed automatically after selecting either Insert Disk or Load New Disk (when disabled, the menu remains open, obviously...)
|
||||
- DISK CONTROL/BUGFIX: The Disk Control menu now has the correct title
|
||||
- DISK CONTROL/BUGFIX: Selecting a disk via the Load New Disk file browser no longer flushes the user back to the top level menu (it now correctly returns to the Disk Control menu)
|
||||
- LIBNX/SWITCH: Updated libnx integration to v3.0.0. This also cherry-picks libnx commit 583d6bb92dcbb33b6bb4a0fa1a9df6e3725d6ef6, which should fix the requirement having to turn rumble off and on in the system settings once per reboot
|
||||
- PLAYLISTS: Add 'Clean Playlist' option
|
||||
|
||||
# 1.8.3
|
||||
- ANDROID/BUGFIX: Fix 'Install or Restore Core' regression
|
||||
- BUGFIX: Ensure core info is always initialised when calling 'drivers_init()'. This bug could prevent cores from doing content runtime logging
|
||||
@@ -8,6 +288,7 @@
|
||||
- BUGFIX/CRASH/CORE UPDATER: Fix potential double free error
|
||||
- BUGFIX/CRASH/OPENGL/WINDOWS: Fix regression in 1.8.2 that would cause GL-based cores to fail because it would try to erroneously load libGLESv2.dll instead of OpenGL32.dll (cores affected: VitaQuake 2/3/Dhewm3, possibly more)
|
||||
- BUGFIX/MENU/DESKTOP UI: Show desktop menu on startup does not launch Qt UI on Linux
|
||||
- BUGFIX: Entries in the Playlist Thumbnails Updater list were displaying improper sublabels. I have no idea when this broke... The issue is now fixed
|
||||
- CHEEVOS: Don't disable achievement when AddAddress generates an out-of-range address
|
||||
- CHEEVOS: Don't reset triggers/leaderboards that failed to load
|
||||
- CHEEVOS: Don't count unsupported achievements as unlocked
|
||||
@@ -32,6 +313,7 @@
|
||||
- NETPLAY/RELAY: Overall stability has improved. Fixed a memory leak that would cause the relay server to become unresponsive after some time.
|
||||
- NETPLAY/RELAY: Fixed critical bug that would cause all players to be disconnected from the relay server if one player was leaving the game. That bug had been open for one year and we were finally able to fix it.
|
||||
- SWITCH/LIBNX/BUGFIX: Fix onscreen keyboard input regression
|
||||
- THUMBNAIL UPDATER: When waiting for individual thumbnail file http transfers to complete, the task status checking is more accurate. This uses the same method as the new core updater - we now wait until the task is 'really' complete, instead of relying on the (slightly nebulous) 'task finished' state
|
||||
- UWP: Add ANGLE support
|
||||
- UWP: Wire up get_metrics to the fake context of D3D9/10/11/12 driver, enabling proper scaling and mouse/touch gestures
|
||||
- VITA: Re-add Online Updater
|
||||
|
||||
@@ -45,6 +45,8 @@ else
|
||||
DEF_FLAGS += -ffast-math
|
||||
endif
|
||||
|
||||
DEF_FLAGS += -Wall
|
||||
|
||||
ifneq ($(findstring BSD,$(OS)),)
|
||||
DEF_FLAGS += -DBSD
|
||||
LDFLAGS += -L/usr/local/lib
|
||||
@@ -68,7 +70,7 @@ endif
|
||||
include Makefile.common
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang"),1)
|
||||
DEFINES += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
|
||||
DEF_FLAGS += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
|
||||
endif
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "tcc"),1)
|
||||
@@ -80,7 +82,7 @@ endif
|
||||
HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
|
||||
|
||||
ifeq ($(MISSING_DECLS), 1)
|
||||
DEFINES += -Werror=missing-declarations
|
||||
DEF_FLAGS += -Werror=missing-declarations
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_DYLIB), 1)
|
||||
@@ -106,10 +108,20 @@ ifneq ($(findstring Win32,$(OS)),)
|
||||
LDFLAGS += -mwindows
|
||||
endif
|
||||
|
||||
DEF_FLAGS += -Wall $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
|
||||
ifneq ($(CXX_BUILD), 1)
|
||||
ifneq ($(C89_BUILD),)
|
||||
CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
|
||||
else ifeq ($(HAVE_C99), 1)
|
||||
CFLAGS += $(C99_CFLAGS)
|
||||
endif
|
||||
|
||||
CFLAGS += -D_GNU_SOURCE
|
||||
endif
|
||||
|
||||
DEF_FLAGS += $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
|
||||
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
CXXFLAGS += $(DEF_FLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS
|
||||
CXXFLAGS += $(DEF_FLAGS) -D__STDC_CONSTANT_MACROS
|
||||
OBJCFLAGS := $(CFLAGS) -D__STDC_CONSTANT_MACROS
|
||||
|
||||
ifeq ($(HAVE_CXX), 1)
|
||||
@@ -127,29 +139,6 @@ else
|
||||
LINK = $(CC)
|
||||
endif
|
||||
|
||||
ifneq ($(CXX_BUILD), 1)
|
||||
ifneq ($(GNU90_BUILD), 1)
|
||||
ifneq ($(findstring icc,$(CC)),)
|
||||
CFLAGS += -std=c99 -D_GNU_SOURCE
|
||||
else
|
||||
CFLAGS += -std=gnu99 -D_GNU_SOURCE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(C89_BUILD),)
|
||||
CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(NOUNUSED), yes)
|
||||
CFLAGS += -Wno-unused-result
|
||||
CXXFLAGS += -Wno-unused-result
|
||||
endif
|
||||
ifeq ($(NOUNUSED_VARIABLE), yes)
|
||||
CFLAGS += -Wno-unused-variable
|
||||
CXXFLAGS += -Wno-unused-variable
|
||||
endif
|
||||
|
||||
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
ifneq ($(X86),)
|
||||
|
||||
+169
-132
@@ -7,6 +7,24 @@ ifeq ($(HAVE_STACK_USAGE), 1)
|
||||
DEF_FLAGS += -fstack-usage
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NOUNUSED), 1)
|
||||
DEF_FLAGS += $(NOUNUSED_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NOUNUSED_VARIABLE), 1)
|
||||
DEF_FLAGS += $(NOUNUSED_VARIABLE_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CXX11), 1)
|
||||
CXXFLAGS += $(CXX11_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SAPI), 1)
|
||||
LIBS += sapi.dll
|
||||
endif
|
||||
|
||||
|
||||
|
||||
ifeq ($(HAVE_GL_CONTEXT),)
|
||||
HAVE_GL_CONTEXT = 0
|
||||
HAVE_GL_MODERN = 0
|
||||
@@ -158,11 +176,13 @@ OBJ += frontend/frontend_driver.o \
|
||||
intl/msg_hash_us.o \
|
||||
$(LIBRETRO_COMM_DIR)/queues/task_queue.o \
|
||||
tasks/task_content.o \
|
||||
tasks/task_patch.o \
|
||||
tasks/task_save.o \
|
||||
tasks/task_file_transfer.o \
|
||||
tasks/task_image.o \
|
||||
tasks/task_playlist_manager.o \
|
||||
tasks/task_manual_content_scan.o \
|
||||
tasks/task_core_backup.o \
|
||||
$(LIBRETRO_COMM_DIR)/encodings/encoding_utf.o \
|
||||
$(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.o \
|
||||
$(LIBRETRO_COMM_DIR)/encodings/encoding_base64.o \
|
||||
@@ -206,11 +226,13 @@ OBJ += \
|
||||
file_path_str.o \
|
||||
$(LIBRETRO_COMM_DIR)/hash/rhash.o \
|
||||
input/common/input_hid_common.o \
|
||||
input/input_mapper.o \
|
||||
led/led_driver.o \
|
||||
gfx/video_coord_array.o \
|
||||
gfx/video_display_server.o \
|
||||
gfx/video_crt_switch.o \
|
||||
gfx/gfx_display.o \
|
||||
gfx/gfx_animation.o \
|
||||
gfx/gfx_thumbnail_path.o \
|
||||
gfx/gfx_thumbnail.o \
|
||||
configuration.o \
|
||||
$(LIBRETRO_COMM_DIR)/dynamic/dylib.o \
|
||||
cores/dynamic_dummy.o \
|
||||
@@ -220,15 +242,16 @@ OBJ += \
|
||||
tasks/task_autodetect.o \
|
||||
input/input_autodetect_builtin.o \
|
||||
input/input_keymaps.o \
|
||||
input/input_remapping.o \
|
||||
$(LIBRETRO_COMM_DIR)/queues/fifo_queue.o \
|
||||
$(LIBRETRO_COMM_DIR)/compat/compat_fnmatch.o \
|
||||
$(LIBRETRO_COMM_DIR)/compat/compat_posix_string.o \
|
||||
managers/cheat_manager.o \
|
||||
core_info.o \
|
||||
core_backup.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/config_file.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/config_file_userdata.o \
|
||||
runtime_file.o \
|
||||
disk_index_file.o \
|
||||
tasks/task_screenshot.o \
|
||||
tasks/task_powerstate.o \
|
||||
$(LIBRETRO_COMM_DIR)/gfx/scaler/scaler.o \
|
||||
@@ -244,10 +267,21 @@ OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/utils/md5.o \
|
||||
playlist.o \
|
||||
$(LIBRETRO_COMM_DIR)/features/features_cpu.o \
|
||||
performance_counters.o \
|
||||
verbosity.o \
|
||||
$(LIBRETRO_COMM_DIR)/playlists/label_sanitization.o \
|
||||
manual_content_scan.o
|
||||
$(LIBRETRO_COMM_DIR)/time/rtime.o \
|
||||
manual_content_scan.o \
|
||||
disk_control_interface.o
|
||||
|
||||
ifeq ($(HAVE_CONFIGFILE), 1)
|
||||
DEFINES += -DHAVE_CONFIGFILE
|
||||
OBJ += input/input_remapping.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_BLISSBOX), 1)
|
||||
DEFINES += -DHAVE_BLISSBOX
|
||||
OBJ += tasks/task_autodetect_blissbox.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_AUDIOMIXER), 1)
|
||||
DEFINES += -DHAVE_AUDIOMIXER
|
||||
@@ -258,8 +292,6 @@ endif
|
||||
|
||||
ifeq ($(HAVE_RUNAHEAD), 1)
|
||||
DEFINES += -DHAVE_RUNAHEAD
|
||||
OBJ += runahead/mem_util.o \
|
||||
runahead/mylist.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CC_RESAMPLER), 1)
|
||||
@@ -292,7 +324,11 @@ ifeq ($(HAVE_LANGEXTRA), 1)
|
||||
intl/msg_hash_cht.o \
|
||||
intl/msg_hash_ar.o \
|
||||
intl/msg_hash_el.o \
|
||||
intl/msg_hash_tr.o
|
||||
intl/msg_hash_tr.o \
|
||||
intl/msg_hash_sk.o \
|
||||
intl/msg_hash_fa.o \
|
||||
intl/msg_hash_he.o \
|
||||
intl/msg_hash_ast.o
|
||||
endif
|
||||
|
||||
ifneq ($(HAVE_GETOPT_LONG), 1)
|
||||
@@ -401,6 +437,8 @@ ifeq ($(HAVE_QT), 1)
|
||||
|
||||
ifneq ($(findstring Linux,$(OS)),)
|
||||
DEF_FLAGS += -fPIC
|
||||
else ifneq ($(findstring BSD,$(OS)),)
|
||||
DEF_FLAGS += -fPIC
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -734,8 +772,8 @@ ifeq ($(HAVE_MENU), 1)
|
||||
DEFINES += -DHAVE_MENU
|
||||
HAVE_MENU_COMMON = 1
|
||||
|
||||
ifeq ($(HAVE_MENU_WIDGETS), 1)
|
||||
DEFINES += -DHAVE_MENU_WIDGETS
|
||||
ifeq ($(HAVE_GFX_WIDGETS), 1)
|
||||
DEFINES += -DHAVE_GFX_WIDGETS
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RGUI), 1)
|
||||
@@ -780,19 +818,11 @@ ifeq ($(HAVE_LAKKA_SWITCH), 1)
|
||||
DEFINES += -DHAVE_LAKKA_SWITCH
|
||||
endif
|
||||
|
||||
# Does not depend on HAVE_MENU
|
||||
ifeq ($(HAVE_SHADERS_COMMON), 1)
|
||||
OBJ += menu/menu_shader.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/menu_driver.o \
|
||||
menu/menu_setting.o \
|
||||
OBJ += menu/menu_setting.o \
|
||||
menu/widgets/menu_filebrowser.o \
|
||||
menu/widgets/menu_dialog.o \
|
||||
menu/widgets/menu_input_bind_dialog.o \
|
||||
menu/widgets/menu_osk.o \
|
||||
menu/menu_cbs.o \
|
||||
menu/cbs/menu_cbs_ok.o \
|
||||
menu/cbs/menu_cbs_cancel.o \
|
||||
menu/cbs/menu_cbs_select.o \
|
||||
@@ -810,14 +840,17 @@ ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
menu/cbs/menu_cbs_up.o \
|
||||
menu/cbs/menu_cbs_down.o \
|
||||
menu/cbs/menu_cbs_contentlist_switch.o \
|
||||
menu/menu_displaylist.o \
|
||||
menu/menu_animation.o \
|
||||
menu/drivers/menu_generic.o \
|
||||
menu/menu_thumbnail_path.o \
|
||||
menu/menu_thumbnail.o
|
||||
menu/menu_displaylist.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MENU_WIDGETS), 1)
|
||||
OBJ += menu/widgets/menu_widgets.o
|
||||
ifeq ($(HAVE_GFX_WIDGETS), 1)
|
||||
OBJ += gfx/gfx_widgets.o \
|
||||
gfx/widgets/gfx_widget_screenshot.o \
|
||||
gfx/widgets/gfx_widget_volume.o \
|
||||
gfx/widgets/gfx_widget_generic_message.o \
|
||||
gfx/widgets/gfx_widget_libretro_message.o
|
||||
ifeq ($(HAVE_CHEEVOS), 1)
|
||||
OBJ += gfx/widgets/gfx_widget_achievement_popup.o
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -880,9 +913,7 @@ ifeq ($(HAVE_VITA2D), 1)
|
||||
$(DEPS_DIR)/libvita2d/shader/texture_tint_v_gxp.o \
|
||||
$(DEPS_DIR)/libvita2d/shader/texture_tint_f_gxp.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON),1)
|
||||
OBJ += menu/drivers_display/menu_display_vita2d.o
|
||||
endif
|
||||
OBJ += gfx/drivers_display/gfx_display_vita2d.o
|
||||
|
||||
OBJ += gfx/drivers/vita2d_gfx.o \
|
||||
gfx/drivers_font/vita2d_font.o
|
||||
@@ -892,7 +923,7 @@ endif
|
||||
|
||||
ifeq ($(TARGET), retroarch_3ds)
|
||||
OBJ += gfx/drivers/ctr_gfx.o \
|
||||
menu/drivers_display/menu_display_ctr.o \
|
||||
gfx/drivers_display/gfx_display_ctr.o \
|
||||
input/drivers/ctr_input.o \
|
||||
input/drivers_joypad/ctr_joypad.o
|
||||
endif
|
||||
@@ -913,7 +944,7 @@ endif
|
||||
ifeq ($(TARGET), retroarch_wiiu)
|
||||
OBJ += gfx/drivers/gx2_gfx.o \
|
||||
gfx/drivers_font/wiiu_font.o \
|
||||
menu/drivers_display/menu_display_wiiu.o \
|
||||
gfx/drivers_display/gfx_display_wiiu.o \
|
||||
input/drivers/wiiu_input.o \
|
||||
input/drivers_joypad/wiiu_joypad.o \
|
||||
input/drivers_joypad/wiiu/wpad_driver.o \
|
||||
@@ -938,7 +969,7 @@ endif
|
||||
|
||||
ifeq ($(TARGET), retroarch_switch)
|
||||
ifeq ($(HAVE_LIBNX), 1)
|
||||
OBJ += menu/drivers_display/menu_display_switch.o \
|
||||
OBJ += gfx/drivers_display/gfx_display_switch.o \
|
||||
gfx/drivers/switch_nx_gfx.o \
|
||||
audio/drivers/switch_libnx_audren_audio.o \
|
||||
audio/drivers/switch_libnx_audren_thread_audio.o
|
||||
@@ -1094,7 +1125,12 @@ OBJ += gfx/drivers_context/gfx_null_ctx.o
|
||||
|
||||
ifeq ($(HAVE_KMS), 1)
|
||||
HAVE_AND_WILL_USE_DRM = 1
|
||||
|
||||
ifeq ($(HAVE_ODROIDGO2), 1)
|
||||
OBJ += gfx/drivers_context/drm_go2_ctx.o
|
||||
else
|
||||
OBJ += gfx/drivers_context/drm_ctx.o
|
||||
endif
|
||||
DEF_FLAGS += $(GBM_CFLAGS) $(DRM_CFLAGS)
|
||||
LIBS += $(GBM_LIBS) $(DRM_LIBS)
|
||||
endif
|
||||
@@ -1104,10 +1140,6 @@ ifeq ($(HAVE_CACA), 1)
|
||||
OBJ += gfx/drivers/caca_gfx.o gfx/drivers_font/caca_font.o
|
||||
LIBS += $(CACA_LIBS)
|
||||
DEF_FLAGS += $(CACA_CFLAGS)
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_caca.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SIXEL), 1)
|
||||
@@ -1117,10 +1149,6 @@ ifeq ($(HAVE_SIXEL), 1)
|
||||
gfx/drivers_context/sixel_ctx.o
|
||||
LIBS += $(SIXEL_LIBS)
|
||||
DEF_FLAGS += $(SIXEL_CFLAGS)
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_sixel.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NETWORK_VIDEO), 1)
|
||||
@@ -1152,7 +1180,7 @@ ifeq ($(HAVE_VITAGL), 1)
|
||||
OBJ += gfx/drivers/gl1.o \
|
||||
gfx/drivers_font/gl1_raster_font.o \
|
||||
gfx/drivers_context/vita_ctx.o \
|
||||
menu/drivers_display/menu_display_gl1.o
|
||||
gfx/drivers_display/gfx_display_gl1.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
@@ -1160,7 +1188,8 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
DEFINES += -DHAVE_OPENGL
|
||||
OBJ += gfx/drivers/gl.o \
|
||||
$(LIBRETRO_COMM_DIR)/gfx/gl_capabilities.o \
|
||||
gfx/drivers_font/gl_raster_font.o
|
||||
gfx/drivers_font/gl_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_gl.o
|
||||
endif
|
||||
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/glsym/rglgen.o
|
||||
@@ -1168,17 +1197,8 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
ifeq ($(HAVE_OPENGL1), 1)
|
||||
DEFINES += -DHAVE_OPENGL1
|
||||
OBJ += gfx/drivers/gl1.o \
|
||||
gfx/drivers_font/gl1_raster_font.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
ifeq ($(HAVE_GL_MODERN), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gl.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_OPENGL1), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gl1.o
|
||||
endif
|
||||
gfx/drivers_font/gl1_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_gl1.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VIDEOCORE), 1)
|
||||
@@ -1226,11 +1246,8 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
gfx/common/metal/MenuDisplay.o \
|
||||
gfx/common/metal_common.o \
|
||||
gfx/drivers/metal.o \
|
||||
gfx/drivers_font/metal_raster_font.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_metal.o
|
||||
endif
|
||||
gfx/drivers_font/metal_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_metal.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MPV), 1)
|
||||
@@ -1326,7 +1343,8 @@ ifeq ($(HAVE_VULKAN), 1)
|
||||
OBJ += gfx/drivers/vulkan.o \
|
||||
gfx/common/vulkan_common.o \
|
||||
$(LIBRETRO_COMM_DIR)/vulkan/vulkan_symbol_wrapper.o \
|
||||
gfx/drivers_font/vulkan_raster_font.o
|
||||
gfx/drivers_font/vulkan_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_vulkan.o
|
||||
|
||||
ifeq ($(HAVE_SLANG), 1)
|
||||
OBJ += gfx/drivers_shader/shader_vulkan.o
|
||||
@@ -1335,9 +1353,6 @@ ifeq ($(HAVE_VULKAN), 1)
|
||||
ifeq ($(HAVE_VULKAN_DISPLAY), 1)
|
||||
OBJ += gfx/drivers_context/khr_display_ctx.o
|
||||
endif
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_vulkan.o
|
||||
endif
|
||||
NEED_CXX_LINKER = 1
|
||||
DEFINES += -DHAVE_VULKAN
|
||||
INCLUDE_DIRS += -Igfx/include
|
||||
@@ -1346,10 +1361,8 @@ endif
|
||||
ifeq ($(HAVE_OPENGL_CORE), 1)
|
||||
OBJ += gfx/drivers/gl_core.o \
|
||||
gfx/drivers_font/gl_core_raster_font.o \
|
||||
gfx/drivers_shader/shader_gl_core.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gl_core.o
|
||||
endif
|
||||
gfx/drivers_shader/shader_gl_core.o \
|
||||
gfx/drivers_display/gfx_display_gl_core.o
|
||||
|
||||
DEFINES += -DHAVE_OPENGL_CORE
|
||||
NEED_CXX_LINKER = 1
|
||||
@@ -1416,10 +1429,8 @@ ifeq ($(HAVE_D3D10), 1)
|
||||
HAVE_D3D_COMMON = 1
|
||||
OBJ += gfx/drivers/d3d10.o \
|
||||
gfx/common/d3d10_common.o \
|
||||
gfx/drivers_font/d3d10_font.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d10.o
|
||||
endif
|
||||
gfx/drivers_font/d3d10_font.o \
|
||||
gfx/drivers_display/gfx_display_d3d10.o
|
||||
DEFINES += -DHAVE_D3D10
|
||||
endif
|
||||
|
||||
@@ -1427,10 +1438,8 @@ ifeq ($(HAVE_D3D11), 1)
|
||||
HAVE_D3D_COMMON = 1
|
||||
OBJ += gfx/drivers/d3d11.o \
|
||||
gfx/common/d3d11_common.o \
|
||||
gfx/drivers_font/d3d11_font.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d11.o
|
||||
endif
|
||||
gfx/drivers_font/d3d11_font.o \
|
||||
gfx/drivers_display/gfx_display_d3d11.o
|
||||
DEFINES += -DHAVE_D3D11
|
||||
endif
|
||||
|
||||
@@ -1438,10 +1447,8 @@ ifeq ($(HAVE_D3D12), 1)
|
||||
HAVE_D3D_COMMON = 1
|
||||
OBJ += gfx/drivers/d3d12.o \
|
||||
gfx/common/d3d12_common.o \
|
||||
gfx/drivers_font/d3d12_font.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d12.o
|
||||
endif
|
||||
gfx/drivers_font/d3d12_font.o \
|
||||
gfx/drivers_display/gfx_display_d3d12.o
|
||||
DEFINES += -DHAVE_D3D12
|
||||
endif
|
||||
|
||||
@@ -1479,20 +1486,14 @@ ifeq ($(HAVE_D3D8), 1)
|
||||
DEFINES += -DHAVE_D3D8
|
||||
OBJ += gfx/drivers/d3d8.o
|
||||
OBJ += gfx/common/d3d8_common.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d8.o
|
||||
endif
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d8.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_D3D9), 1)
|
||||
DEFINES += -DHAVE_D3D9
|
||||
OBJ += gfx/drivers/d3d9.o
|
||||
OBJ += gfx/common/d3d9_common.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d9.o
|
||||
endif
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d9.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_D3D_COMMON), 1)
|
||||
@@ -1528,8 +1529,9 @@ ifeq ($(HAVE_SHADERS_COMMON), 1)
|
||||
OBJ += gfx/video_shader_parse.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GLSLANG), 1)
|
||||
DEFINES += -DHAVE_GLSLANG
|
||||
ifeq ($(HAVE_BUILTINGLSLANG), 1)
|
||||
NEED_CXX_LINKER = 1
|
||||
HAVE_GLSLANG_COMMON = 1
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
GLSLANG_PLATFORM := Windows
|
||||
@@ -1537,17 +1539,17 @@ ifeq ($(HAVE_GLSLANG), 1)
|
||||
GLSLANG_PLATFORM := Unix
|
||||
endif
|
||||
|
||||
DEFINES += -DHAVE_BUILTINGLSLANG
|
||||
|
||||
INCLUDE_DIRS += \
|
||||
-I$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/$(GLSLANG_PLATFORM) \
|
||||
-I$(DEPS_DIR)/glslang/glslang/OGLCompilersDLL \
|
||||
-I$(DEPS_DIR)/glslang/glslang \
|
||||
-I$(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent \
|
||||
-I$(DEPS_DIR)/glslang/glslang/glslang/Public \
|
||||
-I$(DEPS_DIR)/glslang/glslang/SPIRV \
|
||||
-I$(DEPS_DIR)/glslang
|
||||
-I$(DEPS_DIR)/glslang/glslang/SPIRV
|
||||
|
||||
GLSLANG_SOURCES := \
|
||||
$(wildcard $(DEPS_DIR)/glslang/*.cpp) \
|
||||
gfx/drivers_shader/glslang.cpp \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/SPIRV/*.cpp) \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/glslang/GenericCodeGen/*.cpp) \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/OGLCompilersDLL/*.cpp) \
|
||||
@@ -1559,7 +1561,22 @@ ifeq ($(HAVE_GLSLANG), 1)
|
||||
DEFINES += -DENABLE_HLSL
|
||||
GLSLANG_SOURCES += $(wildcard $(DEPS_DIR)/glslang/glslang/hlsl/*.cpp)
|
||||
endif
|
||||
else ifeq ($(HAVE_GLSLANG),1)
|
||||
HAVE_GLSLANG_COMMON = 1
|
||||
GLSLANG_SOURCES := gfx/drivers_shader/glslang.cpp
|
||||
|
||||
# The order of these libs are somewhat specific
|
||||
LIBS += $(GLSLANG_LIBS) \
|
||||
$(GLSLANG_OSDEPENDENT_LIBS) \
|
||||
$(GLSLANG_OGLCOMPILER_LIBS) \
|
||||
$(GLSLANG_HLSL_LIBS) \
|
||||
$(GLSLANG_SPIRV_LIBS) \
|
||||
$(GLSLANG_SPIRV_TOOLS_OPT_LIBS) \
|
||||
$(GLSLANG_SPIRV_TOOLS_LIBS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GLSLANG_COMMON), 1)
|
||||
DEFINES += -DHAVE_GLSLANG
|
||||
OBJ += $(GLSLANG_SOURCES:.cpp=.o)
|
||||
endif
|
||||
|
||||
@@ -1669,7 +1686,8 @@ endif
|
||||
|
||||
ifeq ($(HAVE_ZLIB_COMMON), 1)
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/file/archive_file_zlib.o \
|
||||
$(LIBRETRO_COMM_DIR)/streams/trans_stream_zlib.o
|
||||
$(LIBRETRO_COMM_DIR)/streams/trans_stream_zlib.o \
|
||||
$(LIBRETRO_COMM_DIR)/streams/rzip_stream.o
|
||||
DEFINES += -DHAVE_ZLIB
|
||||
HAVE_COMPRESSION = 1
|
||||
|
||||
@@ -1728,7 +1746,8 @@ endif
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/formats/bmp/rbmp_encode.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/json/jsonsax.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/json/jsonsax_full.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/image_transfer.o
|
||||
$(LIBRETRO_COMM_DIR)/formats/image_transfer.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/m3u/m3u_file.o
|
||||
|
||||
# Gong embedded core
|
||||
ifeq ($(HAVE_GONG),1)
|
||||
@@ -1748,6 +1767,20 @@ ifeq ($(HAVE_V4L2),1)
|
||||
LIBS += $(V4L2_LIBS)
|
||||
endif
|
||||
|
||||
# Accessibility
|
||||
ifeq ($(HAVE_ACCESSIBILITY), 1)
|
||||
DEFINES += -DHAVE_ACCESSIBILITY
|
||||
|
||||
ifeq ($(HAVE_SAPI), 1)
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
LIBS += -lsapi
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
|
||||
# Things that depend on network availability
|
||||
|
||||
ifeq ($(HAVE_NETWORKING), 1)
|
||||
@@ -1763,10 +1796,11 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
tasks/task_netplay_lan_scan.o \
|
||||
tasks/task_netplay_nat_traversal.o \
|
||||
tasks/task_wifi.o \
|
||||
tasks/task_pl_thumbnail_download.o \
|
||||
tasks/task_netplay_find_content.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += tasks/task_pl_thumbnail_download.o \
|
||||
OBJ += \
|
||||
tasks/task_core_updater.o \
|
||||
menu/menu_networking.o
|
||||
endif
|
||||
@@ -1791,39 +1825,41 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
# Netplay
|
||||
DEFINES += -DHAVE_NETWORK_CMD
|
||||
OBJ += network/netplay/netplay_delta.o \
|
||||
network/netplay/netplay_frontend.o \
|
||||
network/netplay/netplay_handshake.o \
|
||||
network/netplay/netplay_init.o \
|
||||
network/netplay/netplay_io.o \
|
||||
network/netplay/netplay_keyboard.o \
|
||||
network/netplay/netplay_sync.o \
|
||||
network/netplay/netplay_discovery.o \
|
||||
network/netplay/netplay_buf.o \
|
||||
network/netplay/netplay_room_parse.o
|
||||
network/netplay/netplay_handshake.o \
|
||||
network/netplay/netplay_init.o \
|
||||
network/netplay/netplay_io.o \
|
||||
network/netplay/netplay_keyboard.o \
|
||||
network/netplay/netplay_sync.o \
|
||||
network/netplay/netplay_discovery.o \
|
||||
network/netplay/netplay_buf.o \
|
||||
network/netplay/netplay_room_parse.o
|
||||
|
||||
# RetroAchievements
|
||||
ifeq ($(HAVE_CHEEVOS), 1)
|
||||
DEFINES += -DHAVE_CHEEVOS
|
||||
INCLUDE_DIRS += -Ideps/rcheevos/include
|
||||
|
||||
OBJ += cheevos-new/cheevos.o \
|
||||
cheevos-new/badges.o \
|
||||
cheevos-new/fixup.o \
|
||||
cheevos-new/parser.o \
|
||||
cheevos-new/hash.o \
|
||||
OBJ += cheevos/cheevos.o \
|
||||
cheevos/badges.o \
|
||||
cheevos/fixup.o \
|
||||
cheevos/parser.o \
|
||||
cheevos/hash.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/cdfs/cdfs.o \
|
||||
deps/rcheevos/src/rcheevos/trigger.o \
|
||||
deps/rcheevos/src/rcheevos/condset.o \
|
||||
deps/rcheevos/src/rcheevos/condition.o \
|
||||
deps/rcheevos/src/rcheevos/operand.o \
|
||||
deps/rcheevos/src/rcheevos/term.o \
|
||||
deps/rcheevos/src/rcheevos/expression.o \
|
||||
deps/rcheevos/src/rcheevos/value.o \
|
||||
deps/rcheevos/src/rcheevos/lboard.o \
|
||||
deps/rcheevos/src/rcheevos/alloc.o \
|
||||
deps/rcheevos/src/rcheevos/compat.o \
|
||||
deps/rcheevos/src/rcheevos/condition.o \
|
||||
deps/rcheevos/src/rcheevos/condset.o \
|
||||
deps/rcheevos/src/rcheevos/consoleinfo.o \
|
||||
deps/rcheevos/src/rcheevos/format.o \
|
||||
deps/rcheevos/src/rcheevos/lboard.o \
|
||||
deps/rcheevos/src/rcheevos/memref.o \
|
||||
deps/rcheevos/src/rcheevos/operand.o \
|
||||
deps/rcheevos/src/rcheevos/richpresence.o \
|
||||
deps/rcheevos/src/rcheevos/runtime.o \
|
||||
deps/rcheevos/src/rcheevos/runtime_progress.o \
|
||||
deps/rcheevos/src/rcheevos/trigger.o \
|
||||
deps/rcheevos/src/rcheevos/value.o \
|
||||
deps/rcheevos/src/rhash/hash.o \
|
||||
deps/rcheevos/src/rurl/url.o
|
||||
|
||||
ifeq ($(HAVE_LUA), 1)
|
||||
@@ -1872,7 +1908,8 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
ifeq ($(HAVE_DISCORD), 1)
|
||||
NEED_CXX_LINKER = 1
|
||||
DEFINES += -DHAVE_DISCORD
|
||||
INCLUDE_DIRS += -Ideps/discord-rpc/include/ -Ideps/discord-rpc/thirdparty/rapidjson-1.1.0/include/
|
||||
INCLUDE_DIRS += -Ideps/discord-rpc/include \
|
||||
-Ideps/discord-rpc/thirdparty/rapidjson-1.1.0/include/
|
||||
|
||||
ifneq ($(HAVE_THREADS), 1)
|
||||
DEFINES += -DDISCORD_DISABLE_IO_THREAD
|
||||
@@ -1880,8 +1917,7 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
|
||||
OBJ += deps/discord-rpc/src/discord_rpc.o \
|
||||
deps/discord-rpc/src/rpc_connection.o \
|
||||
deps/discord-rpc/src/serialization.o \
|
||||
discord/discord.o
|
||||
deps/discord-rpc/src/serialization.o
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
OBJ += deps/discord-rpc/src/discord_register_win.o \
|
||||
@@ -1930,9 +1966,7 @@ endif
|
||||
|
||||
ifneq ($(findstring FPGA,$(OS)),)
|
||||
OBJ += gfx/drivers/fpga_gfx.o \
|
||||
gfx/drivers_context/fpga_ctx.o \
|
||||
gfx/drivers_font/fpga_font.o \
|
||||
menu/drivers_display/menu_display_fpga.o
|
||||
gfx/drivers_context/fpga_ctx.o
|
||||
endif
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
@@ -1944,11 +1978,9 @@ ifneq ($(findstring Win32,$(OS)),)
|
||||
ifeq ($(HAVE_GDI), 1)
|
||||
OBJ += gfx/drivers/gdi_gfx.o \
|
||||
gfx/drivers_context/gdi_ctx.o \
|
||||
gfx/drivers_font/gdi_font.o
|
||||
gfx/drivers_font/gdi_font.o \
|
||||
gfx/drivers_display/gfx_display_gdi.o
|
||||
LIBS += -lmsimg32
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gdi.o
|
||||
endif
|
||||
endif
|
||||
LIBS += -lhid -lsetupapi
|
||||
endif
|
||||
@@ -1998,10 +2030,6 @@ ifneq ($(findstring DOS,$(OS)),)
|
||||
input/drivers/dos_input.o \
|
||||
input/drivers_joypad/dos_joypad.o \
|
||||
frontend/drivers/platform_dos.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_vga.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_STATIC_VIDEO_FILTERS), 1)
|
||||
@@ -2065,7 +2093,7 @@ ifeq ($(HAVE_MATH_NEON), 1)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VITAGL), 1)
|
||||
DEFINES += -DHAVE_VITAGL -DTRANSPOSE_MATRICES
|
||||
DEFINES += -DHAVE_VITAGL -DSTB_DXT_IMPLEMENTATION -DSKIP_ERROR_HANDLING
|
||||
INCLUDE_DIRS += -I$(DEPS_DIR)/vitaGL/source
|
||||
SOURCES := $(DEPS_DIR)/vitaGL/source $(DEPS_DIR)/vitaGL/source/utils
|
||||
OBJ += $(patsubst %.c,%.o,$(foreach dir,$(SOURCES), $(wildcard $(dir)/*.c)))
|
||||
@@ -2108,4 +2136,13 @@ endif
|
||||
ifeq ($(HAVE_SEGAM), 1)
|
||||
DEFINES += -DHAVE_SEGAM
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_ODROIDGO2), 1)
|
||||
DEFINES += -DHAVE_ODROIDGO2
|
||||
LIBS += -lrga -lpng -lz
|
||||
INCLUDE_DIRS += -I$(DEPS_DIR)/libgo2/include
|
||||
OBJ += $(DEPS_DIR)/libgo2/src/display.o \
|
||||
$(DEPS_DIR)/libgo2/src/queue.o \
|
||||
gfx/drivers/oga_gfx.o
|
||||
endif
|
||||
##################################
|
||||
+5
-3
@@ -50,9 +50,10 @@ endif
|
||||
DEFINES :=
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA
|
||||
#DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_SOCKET_LEGACY -DHAVE_THREADS
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_7ZIP -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA
|
||||
DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA
|
||||
#DEFINES += -DHAVE_SOCKET_LEGACY -DHAVE_THREADS
|
||||
#-DHAVE_SSL -DHAVE_BUILTINMBEDTLS -DMBEDTLS_SSL_DEBUG_ALL
|
||||
#ssl is currently incompatible with griffin due to use of the "static" flag on repeating functions that will conflict when included in one file
|
||||
else
|
||||
@@ -135,6 +136,7 @@ CFLAGS += -I. \
|
||||
-Ideps \
|
||||
-Ideps/7zip \
|
||||
-Ideps/stb \
|
||||
-Ideps/rcheevos/include \
|
||||
-Ilibretro-common/include \
|
||||
-Ilibretro-common/include/compat/zlib
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ OBJ := ctr/ctr_system.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/time/rtime.o \
|
||||
file_path_str.o \
|
||||
verbosity.o
|
||||
|
||||
|
||||
+2
-1
@@ -32,7 +32,7 @@ HAVE_LANGEXTRA = 1
|
||||
HAVE_LIBRETRODB = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_MENU_COMMON = 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_MMAP = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_OPENDINGUX_FBDEV = 1
|
||||
@@ -61,6 +61,7 @@ HAVE_UDEV = 1
|
||||
HAVE_VIDEO_LAYOUT = 1
|
||||
HAVE_XMB = 1
|
||||
HAVE_ZLIB = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
|
||||
OS = Linux
|
||||
TARGET = retroarch
|
||||
|
||||
+2
-1
@@ -20,7 +20,7 @@ HAVE_RJPEG = 0
|
||||
HAVE_RPNG = 1
|
||||
HAVE_EMSCRIPTEN = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_RGUI = 1
|
||||
HAVE_SDL = 0
|
||||
HAVE_SDL2 = 0
|
||||
@@ -29,6 +29,7 @@ HAVE_SHADERPIPELINE = 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_STB_FONT = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
|
||||
MEMORY = 134217728
|
||||
|
||||
|
||||
+126
-8
@@ -75,15 +75,22 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
WHOLE_END := -Wl,--no-whole-archive
|
||||
endif
|
||||
|
||||
STATIC_BUILD = 1
|
||||
ifneq (,$(findstring msvc,$(platform)))
|
||||
LIBS := $(WHOLE_START) $(WHOLE_END)
|
||||
else
|
||||
STATIC_BUILD = 0
|
||||
endif
|
||||
ifneq (,$(findstring unix,$(platform)))
|
||||
STATIC_BUILD = 0
|
||||
endif
|
||||
ifeq (qnx, $(platform))
|
||||
STATIC_BUILD = 0
|
||||
endif
|
||||
|
||||
ifeq ($(STATIC_BUILD), 0)
|
||||
LIBS := $(WHOLE_START) $(WHOLE_END)
|
||||
else
|
||||
LIBS := $(WHOLE_START) -lretro_$(platform) $(WHOLE_END)
|
||||
endif
|
||||
endif
|
||||
|
||||
libogc_platform :=
|
||||
|
||||
@@ -93,7 +100,7 @@ else ifeq ($(platform), wii)
|
||||
libogc_platform := 1
|
||||
endif
|
||||
|
||||
HAVE_MENU_WIDGETS := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
|
||||
# PS3
|
||||
ifeq ($(platform), ps3)
|
||||
@@ -148,7 +155,7 @@ else ifeq ($(libogc_platform), 1)
|
||||
endif
|
||||
|
||||
LIBDIRS += -L.
|
||||
MACHDEP += -DGEKKO -mcpu=750 -meabi -mhard-float -DMSB_FIRST
|
||||
MACHDEP += -DGEKKO -mcpu=750 -meabi -mhard-float
|
||||
|
||||
ifeq ($(platform), ngc)
|
||||
LDFLAGS += $(MACHDEP) -Wl,-Map,$(notdir $(EXT_INTER_TARGET)).map
|
||||
@@ -197,6 +204,7 @@ else ifeq ($(libogc_platform), 1)
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
RARCH_CONSOLE = 1
|
||||
|
||||
ifeq ($(platform), wii)
|
||||
@@ -236,6 +244,7 @@ else ifeq ($(platform), xenon360)
|
||||
HAVE_THREADS := 1
|
||||
HAVE_GETOPT_LONG := 1
|
||||
RARCH_CONSOLE = 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
# PSP
|
||||
else ifeq ($(platform), psp1)
|
||||
@@ -260,6 +269,7 @@ else ifeq ($(platform), psp1)
|
||||
HAVE_KERNEL_PRX := 1
|
||||
#HAVE_LANGEXTRA := 1
|
||||
RARCH_CONSOLE = 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
ifeq ($(BUILD_PRX), 1)
|
||||
LDFLAGS += $(addprefix -L,$(PSPSDK)/lib) -specs=$(PSPSDK)/lib/prxspecs -Wl,-q,-T$(PSPSDK)/lib/linkfile.prx $(LDFLAGS)
|
||||
@@ -317,6 +327,7 @@ else ifeq ($(platform), vita)
|
||||
HAVE_THREADS := 1
|
||||
HAVE_LIBRETRODB := 1
|
||||
RARCH_CONSOLE = 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
else ifeq ($(platform), windows_msvc6_x86)
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
@@ -340,6 +351,7 @@ else ifeq ($(platform), windows_msvc6_x86)
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -383,6 +395,7 @@ else ifeq ($(platform), windows_msvc2003_x86)
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -432,6 +445,7 @@ else ifeq ($(platform), windows_msvc2005_x86)
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -483,6 +497,7 @@ else ifneq (,$(findstring windows_msvc2010,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -557,6 +572,7 @@ else ifneq (,$(findstring windows_msvc2012,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -635,6 +651,7 @@ else ifneq (,$(findstring windows_msvc2013,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -713,6 +730,7 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -780,6 +798,44 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
|
||||
export INCLUDE := $(INCLUDE);libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb
|
||||
export LIB := $(LIB)
|
||||
endif
|
||||
else ifeq (qnx,$(platform))
|
||||
HAVE_AUDIOMIXER := 1
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
HAVE_RBMP := 1
|
||||
HAVE_RTGA := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
HAVE_XMB := 1
|
||||
HAVE_STB_FONT := 1
|
||||
HAVE_THREADS := 1
|
||||
HAVE_LIBRETRODB := 1
|
||||
HAVE_COMMAND := 1
|
||||
HAVE_STDIN_CMD := 1
|
||||
HAVE_CMD := 1
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 0
|
||||
WANT_GLSLANG := 0
|
||||
HAVE_CONFIGFILE := 1
|
||||
CC=qcc -Vgcc_ntoarmv7le
|
||||
CXX=QCC -Vgcc_ntoarmv7le
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
LDFLAGS += -g
|
||||
endif
|
||||
|
||||
PLATCFLAGS += -DHAVE_SHADERPIPELINE -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_OZONE -DHAVE_CC_RESAMPLER -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_GL_SYNC -DHAVE_GLSLANG -DHAVE_BUILTINGLSLANG -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_RUNAHEAD -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_XMB -DRARCH_INTERNAL -DWANT_GLSLANG -DHAVE_XCB -DHAVE_EGL -DHAVE_BB10 -DHAVE_GLSL -DHAVE_AL -DRARCH_MOBILE
|
||||
EXT_TARGET := $(TARGET_NAME)
|
||||
EXT_INTER_TARGET := $(TARGET_NAME)
|
||||
INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/rcheevos/include -Ideps/SPIRV-Cross -Ideps/glslang -I.
|
||||
LIBS += -lEGL -lbps -lscreen -lsocket -lm -lGLESv2 -lOpenAL
|
||||
else ifneq (,$(findstring unix,$(platform)))
|
||||
HAVE_AUDIOMIXER := 1
|
||||
HAVE_RPNG := 1
|
||||
@@ -804,13 +860,54 @@ else ifneq (,$(findstring unix,$(platform)))
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
WANT_GLSLANG := 1
|
||||
WANT_GLSLANG := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
PLATCFLAGS += -D__MMX__ -D__SSE__ -DHAVE_OPENGL -DHAVE_OPENGL1 -DHAVE_GLSL -DHAVE_SHADERPIPELINE -DHAVE_OZONE -DHAVE_CC_RESAMPLER -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_GL_SYNC -DHAVE_SLANG -DHAVE_GLSLANG -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_RUNAHEAD -DHAVE_MENU_WIDGETS -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_VULKAN -DHAVE_XMB -DRARCH_INTERNAL -DWANT_GLSLANG -DHAVE_X11 -DHAVE_XCB -DHAVE_UDEV -DHAVE_PULSE
|
||||
PLATCFLAGS += -D__MMX__ -D__SSE__ -DHAVE_OPENGL -DHAVE_OPENGL1 -DHAVE_GLSL -DHAVE_SHADERPIPELINE -DHAVE_OZONE -DHAVE_CC_RESAMPLER -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_GL_SYNC -DHAVE_SLANG -DHAVE_GLSLANG -DHAVE_BUILTINGLSLANG -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_RUNAHEAD -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_VULKAN -DHAVE_XMB -DRARCH_INTERNAL -DWANT_GLSLANG -DHAVE_X11 -DHAVE_XCB -DHAVE_UDEV -DHAVE_PULSE
|
||||
EXT_TARGET := $(TARGET_NAME)
|
||||
EXT_INTER_TARGET := $(TARGET_NAME)
|
||||
INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/rcheevos/include -Ideps/SPIRV-Cross -Ideps/glslang -I.
|
||||
LIBS += -ldl -lm -lpthread -lGL -ludev -lpulse -lX11 -lX11-xcb -lXxf86vm
|
||||
else ifeq (dos,$(platform))
|
||||
HAVE_AUDIOMIXER := 1
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
HAVE_RBMP := 1
|
||||
HAVE_RTGA := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 0
|
||||
HAVE_NETWORK_CMD := 0
|
||||
HAVE_NETPLAYDISCOVERY := 0
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
HAVE_XMB := 0
|
||||
HAVE_STB_FONT := 1
|
||||
HAVE_THREADS := 0
|
||||
HAVE_LIBRETRODB := 1
|
||||
HAVE_COMMAND := 1
|
||||
HAVE_STDIN_CMD := 1
|
||||
HAVE_CMD := 1
|
||||
HAVE_DYLIB := 0
|
||||
HAVE_DYNAMIC := 0
|
||||
HAVE_GRIFFIN_CPP := 0
|
||||
WANT_GLSLANG := 0
|
||||
HAVE_CONFIGFILE := 1
|
||||
CC=i586-pc-msdosdjgpp-gcc
|
||||
CXX=i586-pc-msdosdjgpp-g++
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
LDFLAGS += -g
|
||||
endif
|
||||
|
||||
PLATCFLAGS += -DHAVE_SHADERPIPELINE -DHAVE_CC_RESAMPLER -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DRARCH_INTERNAL -DHAVE_XCB
|
||||
TARGET_NAME := retrodos
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/SPIRV-Cross -Ideps/glslang -I.
|
||||
LIBS += -lm
|
||||
LIBDIRS += -L.
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring msvc,$(platform)))
|
||||
@@ -972,6 +1069,10 @@ ifeq ($(HAVE_THREADS), 1)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CONFIGFILE), 1)
|
||||
CFLAGS += -DHAVE_CONFIGFILE
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RSOUND), 1)
|
||||
CFLAGS += -DHAVE_RSOUND
|
||||
endif
|
||||
@@ -1080,7 +1181,12 @@ $(APP_BOOTER_DIR)/app_booter.bin:
|
||||
$(MAKE) -C $(APP_BOOTER_DIR)
|
||||
|
||||
pkg: all
|
||||
ifeq ($(platform), wii)
|
||||
ifeq ($(platform), qnx)
|
||||
mkdir -p pkg/qnx/pkg
|
||||
cp -r $(EXT_TARGET) pkg/qnx/pkg/RetroArch
|
||||
cp -r media/canvas.png pkg/qnx/pkg/canvas.png
|
||||
cp -r media/retroarch-96x96.png pkg/qnx/pkg/retroarch-96x96.png
|
||||
else ifeq ($(platform), wii)
|
||||
cp -r $(EXT_TARGET) pkg/wii/CORE.dol
|
||||
else ifeq ($(platform), ngc)
|
||||
cp -r $(EXT_TARGET) pkg/ngc/CORE.dol
|
||||
@@ -1088,6 +1194,18 @@ else ifeq ($(platform), psp1)
|
||||
psp-fixup-imports$(EXT) $(EXT_TARGET)
|
||||
endif
|
||||
|
||||
ifeq ($(platform), qnx)
|
||||
retroarch-dev.bar: pkg
|
||||
ifeq ($(QNX_DEBUGTOKEN),)
|
||||
blackberry-nativepackager -package $@ -devMode pkg/qnx/bar-descriptor.xml -C pkg/qnx/pkg pkg/qnx/pkg/*
|
||||
else
|
||||
blackberry-nativepackager -package $@ -devMode -debugToken $(QNX_DEBUGTOKEN) pkg/qnx/bar-descriptor.xml -C pkg/qnx/pkg pkg/qnx/pkg/*
|
||||
endif
|
||||
|
||||
retroarch-release.bar: pkg
|
||||
blackberry-nativepackager -package $@ pkg/qnx/bar-descriptor.xml -C pkg/qnx/pkg pkg/qnx/pkg/*
|
||||
endif
|
||||
|
||||
shaders-checkout:
|
||||
@if test -d $(SHADER_CG_DIR); then \
|
||||
echo "[SHADER CHECKOUT::] Git pulling common-shaders..."; \
|
||||
|
||||
+3
-2
@@ -36,6 +36,7 @@ HAVE_LIBRETRODB = 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
@@ -52,7 +53,7 @@ HAVE_SWITCH = 1
|
||||
HAVE_LIBNX = 1
|
||||
HAVE_OPENGL = 1
|
||||
HAVE_LANGEXTRA = 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
|
||||
ifeq ($(HAVE_OPENGL), 1)
|
||||
HAVE_EGL = 1
|
||||
@@ -132,7 +133,7 @@ LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs $(ARCH) -Wl,--allow-multiple-de
|
||||
# add things from Makefile.common
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
|
||||
LIBS := -lswresample -lavformat -lavcodec -lavutil -lswscale -lstdc++ -lbz2 -lpng -lz -lnx -lm
|
||||
LIBS := -lswresample -lavformat -lavcodec -lavutil -lswscale -lstdc++ -lbz2 -lpng -lz -lnx -lvpx -lopus -llzma -lm
|
||||
|
||||
ifeq ($(HAVE_OPENGL), 1)
|
||||
LIBS := -lEGL -lglapi -ldrm_nouveau $(LIBS)
|
||||
|
||||
+2
-1
@@ -21,7 +21,7 @@ HAVE_D3D12 := 1
|
||||
HAVE_CG := 1
|
||||
HAVE_OPENGL := 1
|
||||
HAVE_OPENGL1 := 1
|
||||
HAVE_MENU_WIDGETS := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_VULKAN := 1
|
||||
HAVE_XAUDIO := 1
|
||||
HAVE_XINPUT := 1
|
||||
@@ -31,6 +31,7 @@ HAVE_WINMM := 1
|
||||
|
||||
HAVE_RPNG := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_MENU := 1
|
||||
HAVE_RGUI := 1
|
||||
HAVE_XMB := 1
|
||||
|
||||
@@ -15,7 +15,7 @@ LDFLAGS = -L$(PNDSDK)/usr/lib -Wl,-rpath,$(PNDSDK)/usr/lib
|
||||
|
||||
LIBS = -lGLESv2 -lEGL -ldl -lm -lpthread -lrt -lasound
|
||||
DEFINES = -std=gnu99 -DHAVE_THREADS -DHAVE_GETOPT_LONG=1 -DHAVE_GRIFFIN -DRARCH_INTERNAL
|
||||
DEFINES += -D__ARM_ARCH_6__ -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_DYNAMIC -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_OVERLAY -DHAVE_VIDEO_LAYOUT -DHAVE_ALSA -DHAVE_ZLIB -D__linux__
|
||||
DEFINES += -DHAVE_CONFIGFILE -D__ARM_ARCH_6__ -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_DYNAMIC -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_OVERLAY -DHAVE_VIDEO_LAYOUT -DHAVE_ALSA -DHAVE_ZLIB -D__linux__
|
||||
DEFINES += $(INCDIRS)
|
||||
DEFINES += -D__OPENPANDORA__ -DPANDORA
|
||||
DEFINES += -marm -march=armv7-a -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize
|
||||
|
||||
+3
-2
@@ -16,7 +16,7 @@ DEFINES :=
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1
|
||||
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB
|
||||
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB -DHAVE_CONFIGFILE
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
ifeq ($(DEBUG), 1)
|
||||
DEFINES += -DHAVE_NETLOGGER
|
||||
@@ -34,13 +34,14 @@ else
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_EGL := 1
|
||||
HAVE_MENU_WIDGETS := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_GLSL := 1
|
||||
HAVE_OPENGLES := 1
|
||||
HAVE_NETWORKING := 0
|
||||
HAVE_SOCKET_LEGACY := 0
|
||||
HAVE_MENU := 1
|
||||
HAVE_MENU_COMMON := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_RGUI := 0
|
||||
HAVE_MATERIALUI := 0
|
||||
HAVE_XMB := 1
|
||||
|
||||
+15
-34
@@ -1,19 +1,14 @@
|
||||
BUILD_FOR_PCSX2 = 0
|
||||
DEBUG = 0
|
||||
HAVE_KERNEL_PRX = 0
|
||||
HAVE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 0
|
||||
HAVE_THREADS = 0
|
||||
BIG_STACK = 0
|
||||
MUTE_WARNINGS = 1
|
||||
PS2_IP = 192.168.1.150
|
||||
|
||||
TARGET = retroarchps2.elf
|
||||
TARGET_RELEASE = retroarchps2-release.elf
|
||||
|
||||
# Lib CDVD
|
||||
CDVD_DIR = ps2/libcdvd
|
||||
|
||||
# Compile the IRXs first
|
||||
IRX_DIR = ps2/irx
|
||||
IRX_FILES = $(wildcard ps2/irx/*.c)
|
||||
@@ -22,7 +17,7 @@ ifeq ($(DEBUG), 1)
|
||||
OPTIMIZE_LV := -O0 -g
|
||||
RARCH_DEFINES += -DDEBUG
|
||||
else
|
||||
OPTIMIZE_LV := -O2
|
||||
OPTIMIZE_LV := -O3
|
||||
LDFLAGS := -s
|
||||
endif
|
||||
|
||||
@@ -30,20 +25,18 @@ ifeq ($(MUTE_WARNINGS), 1)
|
||||
DISABLE_WARNINGS := -Wno-sign-compare -Wno-unused -Wno-parentheses
|
||||
endif
|
||||
|
||||
INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include -I$(CDVD_DIR)/ee
|
||||
INCDIR += -Ips2 -Ips2/include -Ilibretro-common/include -Ideps -Ideps/stb -Ideps/7zip
|
||||
INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include
|
||||
INCDIR += -Ips2/include -Ilibretro-common/include -Ideps -Ideps/stb -Ideps/7zip
|
||||
INCDIR += -Ideps/pthreads -Ideps/pthreads/platform/ps2 -Ideps/pthreads/platform/helper
|
||||
GPVAL = -G0
|
||||
CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) -ffast-math -fsingle-precision-constant
|
||||
ASFLAGS = $(CFLAGS)
|
||||
|
||||
RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_NO_BUILTINZLIB -DHAVE_RPNG -DHAVE_RJPEG
|
||||
RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
RARCH_DEFINES += -DPS2 -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI
|
||||
RARCH_DEFINES += -DHAVE_ZLIB -DHAVE_NO_BUILTINZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
|
||||
LIBDIR =
|
||||
LDFLAGS += -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L$(CDVD_DIR)/lib -L.
|
||||
LIBS += -lretro_ps2 -lgskit -ldmakit -lgskit_toolkit -laudsrv -lmf -lpadx -lmtap -lmc -lhdd -lsdl -lfileXio -lz
|
||||
LIBS += -lcdvdfs -lpatches -lpoweroff
|
||||
LDFLAGS += -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ports/lib -L.
|
||||
# Lib cdvd is needed to get proper time
|
||||
LIBS += -lretro_ps2 -lpatches -lpoweroff -lgskit -ldmakit -laudsrv -lpadx -lmtap -lz -lcdvd
|
||||
|
||||
ifeq ($(BUILD_FOR_PCSX2), 1)
|
||||
RARCH_DEFINES += -DBUILD_FOR_PCSX2
|
||||
@@ -57,27 +50,17 @@ ifeq ($(HAVE_FILE_LOGGER), 1)
|
||||
CFLAGS += -DHAVE_FILE_LOGGER
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_KERNEL_PRX), 1)
|
||||
CFLAGS += -DHAVE_KERNEL_PRX
|
||||
endif
|
||||
|
||||
ifeq ($(BIG_STACK), 1)
|
||||
CFLAGS += -DBIG_STACK
|
||||
endif
|
||||
|
||||
CFLAGS += $(RARCH_DEFINES)
|
||||
|
||||
# All the IRX objects
|
||||
EE_OBJS += $(IRX_DIR)/freemtap_irx.o $(IRX_DIR)/freepad_irx.o $(IRX_DIR)/freesio2_irx.o $(IRX_DIR)/iomanX_irx.o
|
||||
EE_OBJS += $(IRX_DIR)/fileXio_irx.o $(IRX_DIR)/mcman_irx.o $(IRX_DIR)/mcserv_irx.o $(IRX_DIR)/usbd_irx.o
|
||||
EE_OBJS += $(IRX_DIR)/usbhdfsd_irx.o $(IRX_DIR)/freesd_irx.o $(IRX_DIR)/audsrv_irx.o $(IRX_DIR)/poweroff_irx.o
|
||||
EE_OBJS += $(IRX_DIR)/cdvd_irx.o
|
||||
EE_OBJS += $(IRX_DIR)/cdfs_irx.o
|
||||
|
||||
# Missing objecst on the PS2SDK
|
||||
EE_OBJS += ps2/compat_files/compat_ctype.o ps2/compat_files/time.o ps2/compat_files/ps2_devices.o
|
||||
EE_OBJS += ps2/compat_files/fileXio_cdvd.o ps2/compat_files/ps2_descriptor.o
|
||||
EE_OBJS += ps2/compat_files/ps2_devices.o
|
||||
|
||||
#EE_OBJS = griffin/griffin.o bootstrap/ps2/kernel_functions.o
|
||||
EE_OBJS += griffin/griffin.o
|
||||
|
||||
EE_CFLAGS = $(CFLAGS)
|
||||
@@ -106,7 +89,10 @@ prepare:
|
||||
run:
|
||||
ps2client -h $(PS2_IP) execee host:$(EE_BIN)
|
||||
|
||||
debug: clean prepare all run
|
||||
sim:
|
||||
PCSX2 --elf=$(PWD)/$(EE_BIN) --nogui
|
||||
|
||||
debug: clean all run
|
||||
|
||||
package:
|
||||
ps2-packer $(EE_BIN) $(TARGET_RELEASE)
|
||||
@@ -115,9 +101,4 @@ release: clean all package
|
||||
|
||||
#Include preferences
|
||||
include $(PS2SDK)/samples/Makefile.pref
|
||||
include $(PS2SDK)/samples/Makefile.eeglobal
|
||||
|
||||
#Linking with C++
|
||||
$(EE_BIN): $(EE_OBJS) $(PS2SDK)/ee/startup/crt0.o
|
||||
$(EE_CXX) $(EE_NO_CRT) -T$(PS2SDK)/ee/startup/linkfile $(EE_CXXFLAGS) \
|
||||
-o $(EE_BIN) $(PS2SDK)/ee/startup/crt0.o $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(EE_OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) $(EE_LDFLAGS) $(EE_LIBS)
|
||||
include $(PS2SDK)/samples/Makefile.eeglobal_cpp
|
||||
+3
-2
@@ -69,8 +69,9 @@ endif
|
||||
|
||||
PPU_SRCS = griffin/griffin.c
|
||||
|
||||
#DEFINES += -DHAVE_VIDEO_LAYOUT
|
||||
DEFINES += -DHAVE_MENU -DHAVE_MENU_WIDGETS -DHAVE_RGUI -DHAVE_XMB -DHAVE_OZONE -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DMSB_FIRST -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT -DHAVE_RUNAHEAD -DHAVE_DR_MP3 -DHAVE_DR_FLAC
|
||||
DEFINES += -DHAVE_VIDEO_LAYOUT
|
||||
DEFINES += -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_GFX_WIDGETS -DHAVE_RGUI -DHAVE_XMB -DHAVE_OZONE -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT -DHAVE_RUNAHEAD -DHAVE_DR_MP3 -DHAVE_DR_FLAC
|
||||
DEFINES += -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES
|
||||
|
||||
ifeq ($(DEX_BUILD), 1)
|
||||
DEFINES += -DDEX_BUILD
|
||||
|
||||
@@ -59,6 +59,7 @@ PPU_SRCS = frontend/frontend_salamander.c \
|
||||
libretro-common/streams/file_stream.c \
|
||||
libretro-common/vfs/vfs_implementation.c \
|
||||
libretro-common/file/config_file.c \
|
||||
libretro-common/time/rtime.c \
|
||||
file_path_str.c \
|
||||
verbosity.c
|
||||
|
||||
|
||||
+31
-67
@@ -1,29 +1,39 @@
|
||||
#-------------------------------------------------------------------------------
|
||||
# Clear the implicit built in rules
|
||||
#-------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#-------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(PSL1GHT)),)
|
||||
$(error "Please set PSL1GHT in your environment. export PSL1GHT=<path>")
|
||||
endif
|
||||
|
||||
include $(PSL1GHT)/ppu_rules
|
||||
|
||||
include version.all
|
||||
|
||||
DEBUG = 0
|
||||
HAVE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 1
|
||||
|
||||
PC_DEVELOPMENT_IP_ADDRESS = "192.168.1.7"
|
||||
PC_DEVELOPMENT_UDP_PORT = 3490
|
||||
|
||||
CC = $(PS3DEV)/ppu/bin/ppu-gcc
|
||||
CXX = $(PS3DEV)/ppu/bin/ppu-g++
|
||||
LD = $(PS3DEV)/ppu/bin/ppu-ld
|
||||
|
||||
CONTENT_ID_FULL = UP0001-SSNE10000_00-0000000000000001
|
||||
CONTENTID = UP0001-SSNE10001_00-0000000000000001
|
||||
APPID = SSNE10001
|
||||
TITLE = Retroarch PSL1GHT
|
||||
PACKAGE_BASENAME := retroarch_psl1ght
|
||||
|
||||
ELF_TARGET := retroarch_psl1ght.elf
|
||||
EBOOT_PATH = pkg/ps3/USRDIR/EBOOT.BIN
|
||||
CORE_PATH = pkg/ps3/USRDIR/cores/CORE.SELF
|
||||
SELF_TARGET := $(ELF_TARGET:.elf=.self)
|
||||
CORE_PATH = pkg/psl1ght/pkg/USRDIR/cores/CORE.SELF
|
||||
|
||||
INCLUDE := -I. -I$(PS3DEV)/ppu/include -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb -Ilibretro-common/include/compat/zlib
|
||||
LIBDIRS := -L$(PS3DEV)/ppu/lib -L$(PS3DEV)/portlibs/ppu/lib -L.
|
||||
INCLUDE += -I. -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb -Ilibretro-common/include/compat/zlib -Ilibretro-common/include $(LIBPSL1GHT_INC) -Iinclude
|
||||
LIBDIRS += -L.
|
||||
|
||||
MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__
|
||||
MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__ -mcpu=cell
|
||||
CFLAGS += -Wall $(MACHDEP) $(INCLUDE)
|
||||
LDFLAGS := $(MACHDEP)
|
||||
LIBS := -lrgl_ps3 -lretro_psl1ght -laudio -lrsx -lgcm_sys -lnet -lio -lsysutil -lsysmodule -lm -ljpgdec -lpngdec -llv2 -lnet -lnetctl
|
||||
LIBS := -lretro_psl1ght -laudio -lrsx -lgcm_sys -lnet -lio -lsysutil -lsysmodule -lm -ljpgdec -lpngdec -llv2 -lnet -lnetctl
|
||||
|
||||
# system platform
|
||||
system_platform = unix
|
||||
@@ -38,46 +48,10 @@ endif
|
||||
|
||||
PKG_SCRIPT = tools/ps3/ps3py/pkg.py
|
||||
ifeq ($(shell uname), Linux)
|
||||
PKG_FINALIZE = package_finalize
|
||||
MAKE_SELF_WC = make_self_wc
|
||||
MAKE_SELF = make_self_npdrm
|
||||
PYTHON2 = python2
|
||||
GIT = git
|
||||
else
|
||||
PKG_FINALIZE = package_finalize.exe
|
||||
MAKE_SELF_WC = make_self_wc.exe
|
||||
MAKE_SELF = make_self_npdrm.exe
|
||||
PYTHON2 = python2.exe
|
||||
GIT = git.exe
|
||||
endif
|
||||
# system platform
|
||||
system_platform = unix
|
||||
ifeq ($(shell uname -a),)
|
||||
EXE_EXT = .exe
|
||||
system_platform = win
|
||||
else ifneq ($(findstring Darwin,$(shell uname -a)),)
|
||||
system_platform = osx
|
||||
else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
||||
system_platform = win
|
||||
endif
|
||||
|
||||
PKG_SCRIPT = tools/ps3/ps3py/pkg.py
|
||||
ifeq ($(shell uname), Linux)
|
||||
PKG_FINALIZE = package_finalize
|
||||
MAKE_SELF_WC = make_self_wc
|
||||
MAKE_SELF = make_self_npdrm
|
||||
PYTHON2 = python2
|
||||
GIT = git
|
||||
else
|
||||
PKG_FINALIZE = package_finalize.exe
|
||||
MAKE_SELF_WC = make_self_wc.exe
|
||||
MAKE_SELF = make_self_npdrm.exe
|
||||
PYTHON2 = python2.exe
|
||||
GIT = git.exe
|
||||
endif
|
||||
|
||||
MAKE_FSELF_NPDRM = $(CELL_SDK)/host-win32/bin/make_fself_npdrm.exe
|
||||
MAKE_PACKAGE_NPDRM = $(CELL_SDK)/host-win32/bin/make_package_npdrm.exe
|
||||
|
||||
OBJ = griffin/griffin.o
|
||||
|
||||
@@ -91,8 +65,8 @@ endif
|
||||
|
||||
SHARED_FLAGS :=
|
||||
|
||||
#SHARED_FLAGS += -DHAVE_VIDEO_LAYOUT
|
||||
SHARED_FLAGS += -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER
|
||||
SHARED_FLAGS += -DHAVE_VIDEO_LAYOUT
|
||||
SHARED_FLAGS += -DHAVE_MENU -DHAVE_CONFIGFILE -DRARCH_CONSOLE -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER -DRARCH_INTERNAL -DHAVE_MULTIMAN -DHAVE_RGUI
|
||||
CFLAGS += -std=gnu99 $(SHARED_FLAGS)
|
||||
CXXFLAGS += $(SHARED_FLAGS)
|
||||
|
||||
@@ -103,28 +77,18 @@ else
|
||||
CXXFLAGS += -03 -g
|
||||
endif
|
||||
|
||||
all: $(ELF_TARGET)
|
||||
all: $(SELF_TARGET)
|
||||
|
||||
$(ELF_TARGET): $(OBJ)
|
||||
$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(LIBS)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
create-core: $(SELF_TARGET)
|
||||
cp $(SELF_TARGET) $(CORE_PATH)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
create-npdrm-core:
|
||||
$(MAKE_FSELF_NPDRM) $(ELF_TARGET) $(CORE_PATH)
|
||||
|
||||
create-core:
|
||||
$(MAKE_SELF_WC) $(ELF_TARGET) $(CORE_PATH)
|
||||
|
||||
pkg: $(ELF_TARGET) create-npdrm-core
|
||||
$(MAKE_PACKAGE_NPDRM) pkg/ps3/package.conf ps3/pkg
|
||||
|
||||
pkg-signed: $(ELF_TARGET) create-core
|
||||
$(PYTHON2) $(PKG_SCRIPT) --contentid $(CONTENT_ID_FULL) pkg/ps3 retroarch-ps3-cfw-$(PACKAGE_VERSION).pkg
|
||||
pkg: create-core
|
||||
$(PKG) --contentid $(CONTENTID) pkg/psl1ght/pkg/ $(PACKAGE_BASENAME).pkg
|
||||
# cp $(PACKAGE_BASENAME).pkg $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
# $(PACKAGE_FINALIZE) $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
|
||||
clean:
|
||||
rm -f $(ELF_TARGET)
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
#-------------------------------------------------------------------------------
|
||||
# Clear the implicit built in rules
|
||||
#-------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#-------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(PSL1GHT)),)
|
||||
$(error "Please set PSL1GHT in your environment. export PSL1GHT=<path>")
|
||||
endif
|
||||
|
||||
include $(PSL1GHT)/ppu_rules
|
||||
|
||||
include version.all
|
||||
|
||||
DEBUG = 0
|
||||
HAVE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 1
|
||||
|
||||
PC_DEVELOPMENT_IP_ADDRESS = "192.168.1.7"
|
||||
PC_DEVELOPMENT_UDP_PORT = 3490
|
||||
|
||||
CONTENTID = UP0001-SSNE10001_00-0000000000000001
|
||||
APPID = SSNE10001
|
||||
TITLE = Retroarch PSL1GHT
|
||||
PACKAGE_BASENAME := retroarch_psl1ght
|
||||
|
||||
ELF_TARGET := retroarch_psl1ght_salamander.elf
|
||||
ELF_TARGET_NONSTRIPPED := retroarch_psl1ght_salamander_nonstripped.elf
|
||||
EBOOT_PATH = pkg/psl1ght/pkg/USRDIR/EBOOT.BIN
|
||||
|
||||
INCLUDE += -I. -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb -Ilibretro-common/include/compat/zlib -Ilibretro-common/include $(LIBPSL1GHT_INC) -Iinclude
|
||||
LIBDIRS += -L.
|
||||
|
||||
MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__ -mcpu=cell -mhard-float -fmodulo-sched -ffunction-sections -fdata-sections
|
||||
CFLAGS += -Wall $(MACHDEP) $(INCLUDE)
|
||||
LDFLAGS := $(MACHDEP)
|
||||
LIBS := -lgcm_sys -lrsx -lsysutil -lio -lnet -lsysmodule -lrt -llv2 -lm
|
||||
|
||||
# system platform
|
||||
system_platform = unix
|
||||
ifeq ($(shell uname -a),)
|
||||
EXE_EXT = .exe
|
||||
system_platform = win
|
||||
else ifneq ($(findstring Darwin,$(shell uname -a)),)
|
||||
system_platform = osx
|
||||
else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
||||
system_platform = win
|
||||
endif
|
||||
|
||||
PKG_SCRIPT = tools/ps3/ps3py/pkg.py
|
||||
ifeq ($(shell uname), Linux)
|
||||
GIT = git
|
||||
else
|
||||
GIT = git.exe
|
||||
endif
|
||||
|
||||
OBJ = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_ps3.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/file/retro_dirent.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
libretro-common/file/config_file.o \
|
||||
libretro-common/time/rtime.c \
|
||||
file_path_str.o \
|
||||
verbosity.o
|
||||
|
||||
ifeq ($(HAVE_LOGGER), 1)
|
||||
CFLAGS += -DHAVE_LOGGER
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_FILE_LOGGER), 1)
|
||||
CFLAGS += -DHAVE_FILE_LOGGER
|
||||
endif
|
||||
|
||||
SHARED_FLAGS :=
|
||||
|
||||
SHARED_FLAGS += -DHAVE_VIDEO_LAYOUT
|
||||
SHARED_FLAGS += -DHAVE_MENU -DHAVE_CONFIGFILE -DRARCH_CONSOLE -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER -DHAVE_MULTIMAN -DHAVE_RGUI -DIS_SALAMANDER
|
||||
CFLAGS += -std=gnu99 $(SHARED_FLAGS)
|
||||
CXXFLAGS += $(SHARED_FLAGS)
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -g
|
||||
else
|
||||
CFLAGS += -O3 -g
|
||||
CXXFLAGS += -03 -g
|
||||
endif
|
||||
|
||||
all: create-salamander
|
||||
|
||||
$(ELF_TARGET_NONSTRIPPED): $(OBJ)
|
||||
$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(LIBS)
|
||||
|
||||
$(ELF_TARGET): $(ELF_TARGET_NONSTRIPPED)
|
||||
$(STRIP) $< -o $@
|
||||
$(SPRX) $@
|
||||
|
||||
create-salamander: $(ELF_TARGET)
|
||||
$(SELF_NPDRM) $(ELF_TARGET) $(EBOOT_PATH) $(CONTENTID)
|
||||
|
||||
pkg: create-salamander
|
||||
$(PKG) --contentid $(CONTENTID) pkg/psl1ght/pkg/ $(PACKAGE_BASENAME).pkg
|
||||
# cp $(PACKAGE_BASENAME).pkg $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
# $(PACKAGE_FINALIZE) $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
|
||||
clean:
|
||||
rm -f $(ELF_TARGET)
|
||||
rm -f $(OBJ)
|
||||
|
||||
.PHONY: clean
|
||||
+2
-2
@@ -25,7 +25,7 @@ INCDIR = deps deps/stb deps/7zip deps/pthreads deps/pthreads/platform/psp deps/p
|
||||
CFLAGS = $(OPTIMIZE_LV) -G0 -std=gnu99 -ffast-math -fsingle-precision-constant
|
||||
ASFLAGS = $(CFLAGS)
|
||||
|
||||
RARCH_DEFINES = -DPSP -D_MIPS_ARCH_ALLEGREX -DHAVE_LANGEXTRA -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
RARCH_DEFINES = -DPSP -D_MIPS_ARCH_ALLEGREX -DHAVE_LANGEXTRA -DHAVE_ZLIB -DHAVE_AUDIOMIXER -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
|
||||
LIBDIR =
|
||||
LDFLAGS =
|
||||
@@ -72,4 +72,4 @@ pspsh-run:
|
||||
|
||||
debug: clean all pspsh-debug
|
||||
|
||||
run: clean all pspsh-run
|
||||
run: clean all pspsh-run
|
||||
@@ -49,6 +49,7 @@ OBJS = frontend/frontend_salamander.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/time/rtime.o \
|
||||
file_path_str.o \
|
||||
verbosity.o \
|
||||
bootstrap/psp1/kernel_functions.o
|
||||
|
||||
@@ -13,6 +13,7 @@ ifeq ($(GRIFFIN_BUILD), 1)
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_NEON -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA
|
||||
DEFINES += -DHAVE_RUNAHEAD -DHAVE_DYNAMIC
|
||||
DEFINES += -DHAVE_CONFIGFILE
|
||||
else
|
||||
HAVE_AUDIOMIXER = 1
|
||||
HAVE_CC_RESAMPLER = 1
|
||||
@@ -30,6 +31,7 @@ else
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_DYNAMIC = 1
|
||||
|
||||
|
||||
+11
-4
@@ -1,5 +1,6 @@
|
||||
TARGET := retroarch_vita
|
||||
DEBUG ?= 0
|
||||
HAVE_FILE_LOGGER = 1
|
||||
GRIFFIN_BUILD = 0
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
|
||||
@@ -17,7 +18,7 @@ INCDIRS :=
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1
|
||||
DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB DEFINES -DHAVE_KEYMAPPER
|
||||
DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB DEFINES -DHAVE_KEYMAPPER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
ifeq ($(DEBUG), 1)
|
||||
DEFINES += -DHAVE_NETLOGGER
|
||||
@@ -43,7 +44,8 @@ else
|
||||
HAVE_SOCKET_LEGACY := 1
|
||||
HAVE_MENU := 1
|
||||
HAVE_MENU_COMMON := 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
@@ -58,6 +60,7 @@ else
|
||||
RARCH_CONSOLE := 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_AUDIOMIXER := 1
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
HAVE_NETLOGGER = 1
|
||||
@@ -85,7 +88,7 @@ AR := $(PREFIX)ar
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
STRIP := $(PREFIX)strip
|
||||
NM := $(PREFIX)nm
|
||||
LD := $(CXX)
|
||||
LD := $(CC)
|
||||
|
||||
LIBDIRS := -L.
|
||||
|
||||
@@ -120,7 +123,7 @@ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
|
||||
VITA_LIBS := -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub -lSceAppUtil_stub \
|
||||
-lSceSysmodule_stub -lSceCtrl_stub -lSceHid_stub -lSceTouch_stub -lSceAudio_stub \
|
||||
-lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub -lSceMotion_stub \
|
||||
-lSceFiber_stub -lSceMotion_stub -lSceAppMgr_stub -lpthread -lpng -lz
|
||||
-lSceFiber_stub -lSceMotion_stub -lSceAppMgr_stub -lstdc++ -lpthread -lpng -lz
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_vita $(WHOLE_END) $(VITA_LIBS) -lm -lc
|
||||
|
||||
@@ -179,6 +182,10 @@ vpksend: $(TARGET).vpk
|
||||
send: $(TARGET).self
|
||||
curl -T $< ftp://$(PSVITAIP):1337/ux0:/app/$(VITA_TITLE_ID)/eboot.bin
|
||||
|
||||
launch: $(TARGET).self
|
||||
curl -T $< ftp://$(PSVITAIP):1337/ux0:/app/$(VITA_TITLE_ID)/eboot.bin
|
||||
echo "launch $(VITA_TITLE_ID)" | nc ${PSVITAIP} 1338
|
||||
|
||||
.PHONY: clean all send vpksend
|
||||
.PRECIOUS: %.depend
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ OBJS = frontend/frontend_salamander.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/time/rtime.o \
|
||||
file_path_str.o \
|
||||
verbosity.o
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ OBJ = frontend/frontend_salamander.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/file/config_file.o \
|
||||
libretro-common/time/rtime.o \
|
||||
file_path_str.o \
|
||||
verbosity.o \
|
||||
$(APP_BOOTER_DIR)/app_booter.binobj
|
||||
|
||||
+8
-4
@@ -57,6 +57,7 @@ ifeq ($(SALAMANDER_BUILD),1)
|
||||
OBJ += libretro-common/compat/compat_strcasestr.o
|
||||
OBJ += libretro-common/compat/fopen_utf8.o
|
||||
OBJ += libretro-common/file/file_path.o
|
||||
OBJ += libretro-common/file/file_path_io.o
|
||||
OBJ += libretro-common/string/stdstring.o
|
||||
OBJ += libretro-common/lists/string_list.o
|
||||
OBJ += libretro-common/lists/dir_list.o
|
||||
@@ -66,6 +67,7 @@ ifeq ($(SALAMANDER_BUILD),1)
|
||||
OBJ += libretro-common/streams/file_stream.o
|
||||
OBJ += libretro-common/vfs/vfs_implementation.o
|
||||
OBJ += libretro-common/hash/rhash.o
|
||||
OBJ += libretro-common/time/rtime.o
|
||||
OBJ += file_path_str.o
|
||||
OBJ += verbosity.o
|
||||
|
||||
@@ -96,7 +98,7 @@ endif
|
||||
OBJ += gfx/drivers/gx2_shaders/snowflake.o
|
||||
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
OBJ += griffin/griffin.o griffin/griffin_cpp.o
|
||||
|
||||
INCDIRS += -Ilibretro-common/include/compat/zlib
|
||||
# for stb, libfat, iosuhax
|
||||
@@ -106,7 +108,7 @@ endif
|
||||
INCDIRS += -Ideps/SPIRV-Cross
|
||||
|
||||
DEFINES += -DHAVE_AUDIOMIXER
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_LIBRETRODB
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_LIBRETRODB
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_SPIRV_CROSS -DHAVE_SLANG
|
||||
DEFINES += -DHAVE_STB_FONT -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DHAVE_LIBRETRODB -DHAVE_NETWORKING -DHAVE_NETPLAYDISCOVERY
|
||||
@@ -121,10 +123,12 @@ endif
|
||||
else
|
||||
HAVE_AUDIOMIXER = 1
|
||||
HAVE_MENU_COMMON = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_RTGA = 1
|
||||
HAVE_RPNG = 1
|
||||
HAVE_RJPEG = 1
|
||||
HAVE_RBMP = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_RGUI = 1
|
||||
HAVE_7ZIP = 1
|
||||
@@ -161,7 +165,7 @@ OBJ := $(addprefix $(BUILD_DIR)/,$(OBJ))
|
||||
#-----------------------------
|
||||
# Compile flags
|
||||
|
||||
DEFINES += -DWIIU -DMSB_FIRST -D__WUT__ -DHW_WUP -D__wiiu__
|
||||
DEFINES += -DWIIU -D__WUT__ -DHW_WUP -D__wiiu__
|
||||
DEFINES += -DHAVE_MAIN
|
||||
DEFINES += -DRARCH_CONSOLE
|
||||
|
||||
@@ -182,7 +186,7 @@ CFLAGS := -mcpu=750 -meabi -mhard-float
|
||||
CFLAGS += -ffast-math -Werror=implicit-function-declaration
|
||||
CFLAGS += -ffunction-sections -fdata-sections
|
||||
#CFLAGS += -fomit-frame-pointer -mword-relocations
|
||||
#CFLAGS += -Wall
|
||||
CFLAGS += -Wall
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -g
|
||||
|
||||
@@ -14,6 +14,7 @@ HAVE_STDIN_CMD = 1
|
||||
HAVE_COMMAND = 1
|
||||
HAVE_THREADS = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_RGUI = 1
|
||||
HAVE_MATERIALUI = 1
|
||||
HAVE_7ZIP = 1
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[](https://travis-ci.org/libretro/RetroArch)
|
||||
[](https://scan.coverity.com/projects/retroarch)
|
||||
[](https://crowdin.com/project/retroarch)
|
||||
|
||||
# RetroArch
|
||||
|
||||
@@ -8,15 +9,17 @@ Popular examples of implementations for this API includes video game system emul
|
||||
more generalized 3D programs.
|
||||
These programs are instantiated as dynamic libraries. We refer to these as "libretro cores".
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
## libretro
|
||||
|
||||
[libretro](http://libretro.com) is an API that exposes generic audio/video/input callbacks.
|
||||
[libretro](https://www.libretro.com) is an API that exposes generic audio/video/input callbacks.
|
||||
A frontend for libretro (such as RetroArch) handles video output, audio output, input and application lifecycle.
|
||||
A libretro core written in portable C or C++ can run seamlessly on many platforms with very little to no porting effort.
|
||||
|
||||
@@ -31,12 +34,12 @@ Latest binaries are currently hosted on the [buildbot](http://buildbot.libretro.
|
||||
|
||||
## Support
|
||||
|
||||
To reach developers, either make an issue here on GitHub, make a thread on the [forum](http://www.libretro.com/forums/), chat on [discord](https://discord.gg/C4amCeV), or visit our IRC channel: #retroarch @ irc.freenode.org.
|
||||
To reach developers, either make an issue here on GitHub, make a thread on the [forum](https://www.libretro.com/forums/), chat on [discord](https://discord.gg/C4amCeV), or visit our IRC channel: #retroarch @ irc.freenode.org. You could create a post in [Reddit](https://www.reddit.com/r/RetroArch/) with *Technical Support* flair.
|
||||
|
||||
## Documentation
|
||||
|
||||
See our [Documentation Center](https://docs.libretro.com/). On Unix, man-pages are provided.
|
||||
More developer-centric stuff is found [here](https://github.com/libretro/libretro.github.com/wiki/Documentation-devs).
|
||||
More developer-centric stuff is found [here](https://docs.libretro.com/development/libretro-overview/).
|
||||
|
||||
## Related projects
|
||||
|
||||
@@ -72,6 +75,7 @@ RetroArch has been ported to the following platforms:
|
||||
- Haiku
|
||||
- Solaris
|
||||
- macOS (PPC, x86-32 and x86-64)
|
||||
- PlayStation 2
|
||||
- PlayStation 3
|
||||
- PlayStation Portable
|
||||
- PlayStation Vita
|
||||
@@ -80,7 +84,7 @@ RetroArch has been ported to the following platforms:
|
||||
- Nintendo GameCube
|
||||
- Nintendo Wii
|
||||
- Nintendo Wii U
|
||||
- Nintendo 3DS
|
||||
- Nintendo 3DS/2DS
|
||||
- Nintendo Switch
|
||||
- Nintendo NES/SNES Classic Edition
|
||||
- Raspberry Pi
|
||||
@@ -256,3 +260,23 @@ These modelines are more accurate giving exact hz. However, some games may have
|
||||
Some arcade resolutions can be very different from consumer CRTs. There is resolution detection to ensure MAME games will be displayed in the closest available resolution but drawn at their native resolution within this resolution. Meaning that the MAME game will look just like the original hardware.
|
||||
|
||||
MAME ROMs that run in a vertical aspect like DoDonPachi need to be rotated within MAME before resolution switching and aspect correction will work. Do this before enabling CRT SwitchRes so that RetroArch will run in your desktop resolution. Once you have rotated any games that may need it turn CRT SwitchRes on.
|
||||
|
||||
## Socials
|
||||
|
||||
The links below belong to our official channels. Links other than this may have been created by fans, independent members or followers. We seriously recommend using our original resources.
|
||||
|
||||
- [Website](https://www.retroarch.com/)
|
||||
- [Blog](https://libretro.com/)
|
||||
- [Facebook](https://www.facebook.com/libretro)
|
||||
- [Twitter](https://twitter.com/libretro)
|
||||
- [Reddit](https://www.reddit.com/r/RetroArch/)
|
||||
- [YouTube](https://www.youtube.com/Libretro)
|
||||
- [Google Post](https://posts.google.com/share/55Nhs2jG)
|
||||
- [Steam](https://store.steampowered.com/app/1118310/RetroArch/)
|
||||
- [YouTube Topic](https://www.youtube.com/channel/UC5q007PYyQPgin0HHbzF0zQ)
|
||||
- [Patreon](https://www.patreon.com/libretro)
|
||||
- [BOUNTYSOURCE](https://www.bountysource.com/teams/libretro/issues)
|
||||
- [Discord](https://discord.gg/27Xxm2h)
|
||||
- [Teespring](https://teespring.com/stores/retroarch)
|
||||
- [Documentation](https://docs.libretro.com/)
|
||||
- [Forum](https://forums.libretro.com/)
|
||||
@@ -1,5 +1,6 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2016 - Daniel De Matteis
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
@@ -13,27 +14,20 @@
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __MENU_CONTENT_H__
|
||||
#define __MENU_CONTENT_H__
|
||||
#ifndef __RETROARCH_ACCESSIBILITY_H
|
||||
#define __RETROARCH_ACCESSIBILITY_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <boolean.h>
|
||||
#include <retro_inline.h>
|
||||
#include <retro_common_api.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
typedef struct menu_content_ctx_defer_info
|
||||
{
|
||||
void *data;
|
||||
const char *dir;
|
||||
const char *path;
|
||||
const char *menu_label;
|
||||
char *s;
|
||||
size_t len;
|
||||
} menu_content_ctx_defer_info_t;
|
||||
|
||||
RETRO_END_DECLS
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+29
-50
@@ -53,7 +53,7 @@ typedef struct coreaudio
|
||||
} coreaudio_t;
|
||||
|
||||
#if TARGET_OS_IOS
|
||||
static bool g_interrupted = false;
|
||||
static bool g_interrupted;
|
||||
#endif
|
||||
|
||||
static void coreaudio_free(void *data)
|
||||
@@ -346,61 +346,40 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t size)
|
||||
const uint8_t *buf = (const uint8_t*)buf_;
|
||||
size_t written = 0;
|
||||
|
||||
if (dev->nonblock)
|
||||
{
|
||||
bool cond = size > 0;
|
||||
#if TARGET_OS_IOS
|
||||
cond = cond && !g_interrupted;
|
||||
while (!g_interrupted && size > 0)
|
||||
#else
|
||||
while (size > 0)
|
||||
#endif
|
||||
if (cond)
|
||||
{
|
||||
size_t write_avail;
|
||||
|
||||
slock_lock(dev->lock);
|
||||
|
||||
write_avail = fifo_write_avail(dev->buffer);
|
||||
if (write_avail > size)
|
||||
write_avail = size;
|
||||
|
||||
fifo_write(dev->buffer, buf, write_avail);
|
||||
buf += write_avail;
|
||||
written += write_avail;
|
||||
size -= write_avail;
|
||||
|
||||
slock_unlock(dev->lock);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#if TARGET_OS_IOS
|
||||
while (!g_interrupted && size > 0)
|
||||
#else
|
||||
while (size > 0)
|
||||
#endif
|
||||
size_t write_avail;
|
||||
|
||||
slock_lock(dev->lock);
|
||||
|
||||
write_avail = fifo_write_avail(dev->buffer);
|
||||
if (write_avail > size)
|
||||
write_avail = size;
|
||||
|
||||
fifo_write(dev->buffer, buf, write_avail);
|
||||
buf += write_avail;
|
||||
written += write_avail;
|
||||
size -= write_avail;
|
||||
|
||||
if (dev->nonblock)
|
||||
{
|
||||
size_t write_avail;
|
||||
|
||||
slock_lock(dev->lock);
|
||||
|
||||
write_avail = fifo_write_avail(dev->buffer);
|
||||
if (write_avail > size)
|
||||
write_avail = size;
|
||||
|
||||
fifo_write(dev->buffer, buf, write_avail);
|
||||
buf += write_avail;
|
||||
written += write_avail;
|
||||
size -= write_avail;
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
if (write_avail == 0 && !scond_wait_timeout(
|
||||
dev->cond, dev->lock, 3000000))
|
||||
g_interrupted = true;
|
||||
#else
|
||||
if (write_avail == 0)
|
||||
scond_wait(dev->cond, dev->lock);
|
||||
#endif
|
||||
slock_unlock(dev->lock);
|
||||
break;
|
||||
}
|
||||
|
||||
#if TARGET_OS_IOS
|
||||
if (write_avail == 0 && !scond_wait_timeout(
|
||||
dev->cond, dev->lock, 3000000))
|
||||
g_interrupted = true;
|
||||
#else
|
||||
if (write_avail == 0)
|
||||
scond_wait(dev->cond, dev->lock);
|
||||
#endif
|
||||
slock_unlock(dev->lock);
|
||||
}
|
||||
|
||||
return written;
|
||||
|
||||
+12
-27
@@ -260,37 +260,22 @@ static bool g_interrupted;
|
||||
|
||||
- (ssize_t)writeFloat:(const float *)data samples:(size_t)samples {
|
||||
size_t written = 0;
|
||||
|
||||
if (_nonBlock)
|
||||
while (!g_interrupted && samples > 0)
|
||||
{
|
||||
if (!g_interrupted && samples > 0)
|
||||
{
|
||||
size_t write_avail = rb_avail(&_rb);
|
||||
if (write_avail > samples)
|
||||
write_avail = samples;
|
||||
size_t write_avail = rb_avail(&_rb);
|
||||
if (write_avail > samples)
|
||||
write_avail = samples;
|
||||
|
||||
rb_write_data(&_rb, data, write_avail);
|
||||
data += write_avail;
|
||||
written += write_avail;
|
||||
samples -= write_avail;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (!g_interrupted && samples > 0)
|
||||
{
|
||||
size_t write_avail = rb_avail(&_rb);
|
||||
if (write_avail > samples)
|
||||
write_avail = samples;
|
||||
rb_write_data(&_rb, data, write_avail);
|
||||
data += write_avail;
|
||||
written += write_avail;
|
||||
samples -= write_avail;
|
||||
|
||||
rb_write_data(&_rb, data, write_avail);
|
||||
data += write_avail;
|
||||
written += write_avail;
|
||||
samples -= write_avail;
|
||||
if (_nonBlock)
|
||||
break;
|
||||
|
||||
if (write_avail == 0)
|
||||
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);
|
||||
}
|
||||
if (write_avail == 0)
|
||||
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);
|
||||
}
|
||||
|
||||
return written;
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
#include <boolean.h>
|
||||
#include <rthreads/rthreads.h>
|
||||
|
||||
#include "../../retroarch.h"
|
||||
#include "../../configuration.h"
|
||||
#include "../../retroarch.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
#define FRAMES(x) (x / (sizeof(float) * 2))
|
||||
@@ -146,7 +146,8 @@ static size_t find_buffersize(jack_t *jd, int latency, unsigned out_rate)
|
||||
return buffer_frames * sizeof(jack_default_audio_sample_t);
|
||||
}
|
||||
|
||||
static void *ja_init(const char *device, unsigned rate, unsigned latency,
|
||||
static void *ja_init(const char *device,
|
||||
unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
{
|
||||
|
||||
+26
-56
@@ -238,75 +238,45 @@ static ssize_t sl_write(void *data, const void *buf_, size_t size)
|
||||
size_t written = 0;
|
||||
const uint8_t *buf = (const uint8_t*)buf_;
|
||||
|
||||
if (sl->nonblock)
|
||||
while (size)
|
||||
{
|
||||
while (size)
|
||||
{
|
||||
size_t avail_write;
|
||||
size_t avail_write;
|
||||
|
||||
if (sl->nonblock)
|
||||
{
|
||||
if (sl->buffered_blocks == sl->buf_count)
|
||||
break;
|
||||
|
||||
avail_write = MIN(sl->buf_size - sl->buffer_ptr, size);
|
||||
|
||||
if (avail_write)
|
||||
{
|
||||
memcpy(sl->buffer[sl->buffer_index] + sl->buffer_ptr, buf, avail_write);
|
||||
sl->buffer_ptr += avail_write;
|
||||
buf += avail_write;
|
||||
size -= avail_write;
|
||||
written += avail_write;
|
||||
}
|
||||
|
||||
if (sl->buffer_ptr >= sl->buf_size)
|
||||
{
|
||||
SLresult res = (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[sl->buffer_index], sl->buf_size);
|
||||
sl->buffer_index = (sl->buffer_index + 1) % sl->buf_count;
|
||||
__sync_fetch_and_add(&sl->buffered_blocks, 1);
|
||||
sl->buffer_ptr = 0;
|
||||
|
||||
if (res != SL_RESULT_SUCCESS)
|
||||
{
|
||||
RARCH_ERR("[OpenSL]: Failed to write! (Error: 0x%x)\n", (unsigned)res);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (size)
|
||||
else
|
||||
{
|
||||
size_t avail_write;
|
||||
|
||||
slock_lock(sl->lock);
|
||||
while (sl->buffered_blocks == sl->buf_count)
|
||||
scond_wait(sl->cond, sl->lock);
|
||||
slock_unlock(sl->lock);
|
||||
}
|
||||
|
||||
avail_write = MIN(sl->buf_size - sl->buffer_ptr, size);
|
||||
avail_write = MIN(sl->buf_size - sl->buffer_ptr, size);
|
||||
|
||||
if (avail_write)
|
||||
if (avail_write)
|
||||
{
|
||||
memcpy(sl->buffer[sl->buffer_index] + sl->buffer_ptr, buf, avail_write);
|
||||
sl->buffer_ptr += avail_write;
|
||||
buf += avail_write;
|
||||
size -= avail_write;
|
||||
written += avail_write;
|
||||
}
|
||||
|
||||
if (sl->buffer_ptr >= sl->buf_size)
|
||||
{
|
||||
SLresult res = (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[sl->buffer_index], sl->buf_size);
|
||||
sl->buffer_index = (sl->buffer_index + 1) % sl->buf_count;
|
||||
__sync_fetch_and_add(&sl->buffered_blocks, 1);
|
||||
sl->buffer_ptr = 0;
|
||||
|
||||
if (res != SL_RESULT_SUCCESS)
|
||||
{
|
||||
memcpy(sl->buffer[sl->buffer_index] + sl->buffer_ptr, buf, avail_write);
|
||||
sl->buffer_ptr += avail_write;
|
||||
buf += avail_write;
|
||||
size -= avail_write;
|
||||
written += avail_write;
|
||||
}
|
||||
|
||||
if (sl->buffer_ptr >= sl->buf_size)
|
||||
{
|
||||
SLresult res = (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[sl->buffer_index], sl->buf_size);
|
||||
sl->buffer_index = (sl->buffer_index + 1) % sl->buf_count;
|
||||
__sync_fetch_and_add(&sl->buffered_blocks, 1);
|
||||
sl->buffer_ptr = 0;
|
||||
|
||||
if (res != SL_RESULT_SUCCESS)
|
||||
{
|
||||
RARCH_ERR("[OpenSL]: Failed to write! (Error: 0x%x)\n", (unsigned)res);
|
||||
return -1;
|
||||
}
|
||||
RARCH_ERR("[OpenSL]: Failed to write! (Error: 0x%x)\n", (unsigned)res);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ static void *ra_init(const char *device, unsigned rate, unsigned latency,
|
||||
|
||||
(void)latency;
|
||||
|
||||
if ((vss = roar_vs_new_simple(device, "RetroArch", rate, 2, ROAR_CODEC_PCM_S, 16, ROAR_DIR_PLAY, &err)) == NULL)
|
||||
if (!(vss = roar_vs_new_simple(device, "RetroArch", rate, 2, ROAR_CODEC_PCM_S, 16, ROAR_DIR_PLAY, &err)))
|
||||
{
|
||||
RARCH_ERR("RoarAudio: \"%s\"\n", roar_vs_strerr(err));
|
||||
free(roar);
|
||||
@@ -105,8 +105,11 @@ static bool ra_alive(void *data)
|
||||
static void ra_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
roar_t *roar = (roar_t*)data;
|
||||
|
||||
if (roar_vs_blocking(roar->vss, (state) ? ROAR_VS_FALSE : ROAR_VS_TRUE, NULL) < 0)
|
||||
fprintf(stderr, "RetroArch [ERROR]: Can't set nonblocking. Will not be able to fast-forward.\n");
|
||||
{
|
||||
RARCH_ERR("Can't set nonblocking. Will not be able to fast-forward.\n");
|
||||
}
|
||||
roar->nonblocking = state;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,9 @@
|
||||
static const int sample_rate = 48000;
|
||||
static const int max_num_samples = sample_rate;
|
||||
static const int num_channels = 2;
|
||||
#ifndef HAVE_LIBNX
|
||||
static const size_t sample_buffer_size = ((max_num_samples * num_channels * sizeof(uint16_t)) + 0xfff) & ~0xfff;
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -98,11 +100,13 @@ static ssize_t switch_audio_write(void *data, const void *buf, size_t size)
|
||||
|
||||
while (!swa->current_buffer)
|
||||
{
|
||||
#ifndef HAVE_LIBNX
|
||||
uint32_t handle_idx = 0;
|
||||
#endif
|
||||
num = 0;
|
||||
|
||||
#ifdef HAVE_LIBNX
|
||||
if (audoutWaitPlayFinish(&swa->current_buffer, &num, U64_MAX) != 0) { }
|
||||
if (audoutWaitPlayFinish(&swa->current_buffer, &num, UINT64_MAX) != 0) { }
|
||||
#else
|
||||
svcWaitSynchronization(&handle_idx, &swa->event, 1, 33333333);
|
||||
svcResetSignal(swa->event);
|
||||
@@ -236,7 +240,9 @@ static void *switch_audio_init(const char *device,
|
||||
{
|
||||
unsigned i;
|
||||
char names[8][0x20];
|
||||
#ifndef HAVE_LIBNX
|
||||
uint32_t num_names = 0;
|
||||
#endif
|
||||
switch_audio_t *swa = (switch_audio_t*) calloc(1, sizeof(*swa));
|
||||
|
||||
if (!swa)
|
||||
@@ -333,8 +339,9 @@ fail_audio_output:
|
||||
/* TODO/FIXME - fix libnx codepath */
|
||||
#ifndef HAVE_LIBNX
|
||||
audio_ipc_output_close(&swa->output);
|
||||
#endif
|
||||
fail_audio_ipc:
|
||||
#endif
|
||||
|
||||
/* TODO/FIXME - fix libnx codepath */
|
||||
#ifndef HAVE_LIBNX
|
||||
audio_ipc_finalize();
|
||||
|
||||
@@ -17,7 +17,7 @@ typedef Thread compat_thread;
|
||||
typedef CondVar compat_condvar;
|
||||
|
||||
#define compat_thread_create(thread, func, data, stack_size, prio, cpu) \
|
||||
threadCreate(thread, func, data, stack_size, prio, cpu)
|
||||
threadCreate(thread, func, data, NULL, stack_size, prio, cpu)
|
||||
#define compat_thread_start(thread) \
|
||||
threadStart(thread)
|
||||
#define compat_thread_join(thread) \
|
||||
@@ -46,6 +46,10 @@ typedef AudioOutBuffer compat_audio_out_buffer;
|
||||
#define switch_audio_ipc_output_stop(a) audoutStopAudioOut()
|
||||
#define switch_audio_ipc_output_start(a) audoutStartAudioOut()
|
||||
|
||||
#ifndef UINT64_MAX
|
||||
#define UINT64_MAX U64_MAX
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
/* libtransistor definitions */
|
||||
|
||||
@@ -232,7 +232,7 @@ static void *libnx_audren_thread_audio_init(const char *device, unsigned rate, u
|
||||
|
||||
svcGetThreadPriority(&thread_priority, CUR_THREAD_HANDLE);
|
||||
rc = threadCreate(&aud->thread, &thread_job,
|
||||
(void*)aud, thread_stack_size,
|
||||
(void*)aud, NULL, thread_stack_size,
|
||||
thread_priority - 1, thread_preferred_cpu);
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
|
||||
@@ -39,7 +39,6 @@ static const size_t thread_stack_size = 1024 * 8;
|
||||
static const int thread_preferred_cpu = 2;
|
||||
static const int channel_count = 2;
|
||||
static const size_t sample_size = sizeof(uint16_t);
|
||||
static const size_t frame_size = channel_count * sample_size;
|
||||
|
||||
#define AUDIO_BUFFER_COUNT 2
|
||||
|
||||
@@ -87,7 +86,7 @@ static void mainLoop(void* data)
|
||||
if (!released_out_buffer)
|
||||
{
|
||||
#ifdef HAVE_LIBNX
|
||||
rc = audoutWaitPlayFinish(&released_out_buffer, &released_out_count, U64_MAX);
|
||||
rc = audoutWaitPlayFinish(&released_out_buffer, &released_out_count, UINT64_MAX);
|
||||
#else
|
||||
uint32_t handle_idx = 0;
|
||||
svcWaitSynchronization(&handle_idx, &swa->event, 1, 33333333);
|
||||
@@ -144,8 +143,10 @@ static void *switch_thread_audio_init(const char *device, unsigned rate, unsigne
|
||||
Result rc;
|
||||
unsigned i;
|
||||
uint32_t prio;
|
||||
#ifndef HAVE_LIBNX
|
||||
char names[8][0x20];
|
||||
uint32_t num_names = 0;
|
||||
#endif
|
||||
switch_thread_audio_t *swa = (switch_thread_audio_t *)calloc(1, sizeof(*swa));
|
||||
|
||||
if (!swa)
|
||||
|
||||
@@ -1525,7 +1525,7 @@ static struct pcm_params *pcm_params_get(unsigned int card, unsigned int device,
|
||||
fd = open(fn, O_RDWR|O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
{
|
||||
fprintf(stderr, "cannot open device '%s'\n", fn);
|
||||
RARCH_ERR("[TINYALSA] Cannot open device '%s'\n", fn);
|
||||
goto err_open;
|
||||
}
|
||||
|
||||
@@ -1538,7 +1538,7 @@ static struct pcm_params *pcm_params_get(unsigned int card, unsigned int device,
|
||||
param_init(params);
|
||||
if (ioctl(fd, SNDRV_PCM_IOCTL_HW_REFINE, params))
|
||||
{
|
||||
fprintf(stderr, "SNDRV_PCM_IOCTL_HW_REFINE error (%d)\n", errno);
|
||||
RARCH_ERR("[TINYALSA] SNDRV_PCM_IOCTL_HW_REFINE error (%d)\n", errno);
|
||||
goto err_hw_refine;
|
||||
}
|
||||
|
||||
@@ -2019,7 +2019,7 @@ static int pcm_mmap_transfer(struct pcm *pcm, const void *buffer, unsigned int b
|
||||
avail = pcm_avail_update(pcm);
|
||||
if (avail < 0)
|
||||
{
|
||||
fprintf(stderr, "cannot determine available mmap frames");
|
||||
RARCH_ERR("[TINYALSA] Cannot determine available mmap frames");
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2029,7 +2029,7 @@ static int pcm_mmap_transfer(struct pcm *pcm, const void *buffer, unsigned int b
|
||||
{
|
||||
if (pcm_start(pcm) < 0)
|
||||
{
|
||||
fprintf(stderr, "start error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
RARCH_ERR("[TINYALSA] Start error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
(unsigned int)pcm->mmap_status->hw_ptr,
|
||||
(unsigned int)pcm->mmap_control->appl_ptr,
|
||||
avail);
|
||||
@@ -2052,7 +2052,7 @@ static int pcm_mmap_transfer(struct pcm *pcm, const void *buffer, unsigned int b
|
||||
{
|
||||
pcm->prepared = 0;
|
||||
pcm->running = 0;
|
||||
fprintf(stderr, "wait error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
RARCH_ERR("[TINYALSA] Wait error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
(unsigned int)pcm->mmap_status->hw_ptr,
|
||||
(unsigned int)pcm->mmap_control->appl_ptr,
|
||||
avail);
|
||||
@@ -2073,7 +2073,7 @@ static int pcm_mmap_transfer(struct pcm *pcm, const void *buffer, unsigned int b
|
||||
frames = pcm_mmap_transfer_areas(pcm, (void *)buffer, offset, frames);
|
||||
if (frames < 0)
|
||||
{
|
||||
fprintf(stderr, "write error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
RARCH_ERR("[TINYALSA] Write error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
(unsigned int)pcm->mmap_status->hw_ptr,
|
||||
(unsigned int)pcm->mmap_control->appl_ptr,
|
||||
avail);
|
||||
|
||||
@@ -491,13 +491,14 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
|
||||
BYTE *dest = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
bool float_format = settings->bools.audio_wasapi_float_format;
|
||||
bool exclusive_mode = settings->bools.audio_wasapi_exclusive_mode;
|
||||
int sh_buffer_length = settings->ints.audio_wasapi_sh_buffer_length;
|
||||
wasapi_t *w = (wasapi_t*)calloc(1, sizeof(wasapi_t));
|
||||
|
||||
if (!w)
|
||||
return NULL;
|
||||
|
||||
w->exclusive = settings->bools.audio_wasapi_exclusive_mode;
|
||||
w->exclusive = exclusive_mode;
|
||||
w->device = wasapi_init_device(dev_id);
|
||||
if (!w->device && dev_id)
|
||||
w->device = wasapi_init_device(NULL);
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
+7
-7
@@ -234,7 +234,7 @@ static int rsnd_connect_server( rsound_t *rd )
|
||||
if (!isdigit(rd->host[0]))
|
||||
{
|
||||
struct hostent *host = gethostbyname(rd->host);
|
||||
if (host == NULL)
|
||||
if (!host)
|
||||
return -1;
|
||||
|
||||
addr.sin_addr.s_addr = inet_addr(host->h_addr_list[0]);
|
||||
@@ -295,7 +295,7 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
/* Defines the size of a wave header */
|
||||
#define HEADER_SIZE 44
|
||||
char *header = calloc(1, HEADER_SIZE);
|
||||
if (header == NULL)
|
||||
if (!header)
|
||||
{
|
||||
RSD_ERR("[RSound] Could not allocate memory.");
|
||||
return -1;
|
||||
@@ -472,7 +472,7 @@ static int rsnd_get_backend_info ( rsound_t *rd )
|
||||
if ( rd->fifo_buffer != NULL )
|
||||
fifo_free(rd->fifo_buffer);
|
||||
rd->fifo_buffer = fifo_new (rd->buffer_size);
|
||||
if ( rd->fifo_buffer == NULL )
|
||||
if (!rd->fifo_buffer)
|
||||
{
|
||||
RSD_ERR("[RSound] Failed to create FIFO buffer.\n");
|
||||
return -1;
|
||||
@@ -963,7 +963,7 @@ static int rsnd_close_ctl(rsound_t *rd)
|
||||
return -1;
|
||||
|
||||
subchar = strrchr(buf, 'R');
|
||||
if ( subchar == NULL )
|
||||
if (!subchar)
|
||||
index = 0;
|
||||
else
|
||||
{
|
||||
@@ -1023,7 +1023,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
|
||||
temp[RSD_PROTO_CHUNKSIZE] = '\0';
|
||||
|
||||
if ( (substr = strstr(temp, "RSD")) == NULL )
|
||||
if (!(substr = strstr(temp, "RSD")))
|
||||
return -1;
|
||||
|
||||
// Jump over "RSD" in header
|
||||
@@ -1038,7 +1038,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
|
||||
// We only bother if this is an INFO message.
|
||||
substr = strstr(temp, "INFO");
|
||||
if ( substr == NULL )
|
||||
if (!substr)
|
||||
continue;
|
||||
|
||||
// Jump over "INFO" in header
|
||||
@@ -1548,7 +1548,7 @@ int rsd_pause(rsound_t* rsound, int enable)
|
||||
int rsd_init(rsound_t** rsound)
|
||||
{
|
||||
*rsound = calloc(1, sizeof(rsound_t));
|
||||
if ( *rsound == NULL )
|
||||
if (*rsound == NULL)
|
||||
return -1;
|
||||
|
||||
retro_assert(rsound != NULL);
|
||||
|
||||
@@ -57,7 +57,7 @@ static void *android_camera_init(const char *device, uint64_t caps,
|
||||
goto dealloc;
|
||||
|
||||
GET_OBJECT_CLASS(env, class, android_app->activity->clazz);
|
||||
if (class == NULL)
|
||||
if (!class)
|
||||
goto dealloc;
|
||||
|
||||
GET_METHOD_ID(env, androidcamera->onCameraInit, class,
|
||||
|
||||
@@ -402,7 +402,7 @@ static bool v4l_poll(void *data,
|
||||
|
||||
if (preprocess_image(data))
|
||||
{
|
||||
if (frame_raw_cb != NULL)
|
||||
if (frame_raw_cb)
|
||||
frame_raw_cb(v4l->buffer_output, v4l->width,
|
||||
v4l->height, v4l->width * 4);
|
||||
return true;
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2015-2016 - Andre Leiradella
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <file/file_path.h>
|
||||
#include <string/stdstring.h>
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
#include "../menu/menu_driver.h"
|
||||
#endif
|
||||
|
||||
#include "../file_path_special.h"
|
||||
#include "../configuration.h"
|
||||
#include "../verbosity.h"
|
||||
#include "../network/net_http_special.h"
|
||||
|
||||
#include "badges.h"
|
||||
|
||||
badges_ctx_t badges_ctx;
|
||||
|
||||
bool badge_exists(const char* filepath)
|
||||
{
|
||||
return path_is_valid(filepath);
|
||||
}
|
||||
|
||||
void set_badge_menu_texture(badges_ctx_t * badges, int i)
|
||||
{
|
||||
char badge_file[16];
|
||||
char fullpath[PATH_MAX_LENGTH];
|
||||
|
||||
snprintf(badge_file, sizeof(badge_file), "%s%s", badges->badge_id_list[i],
|
||||
badges->badge_locked[i] ? "_lock.png" : ".png");
|
||||
|
||||
fill_pathname_application_special(fullpath,
|
||||
PATH_MAX_LENGTH * sizeof(char),
|
||||
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
menu_display_reset_textures_list(badge_file, fullpath,
|
||||
&badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_badge_info (badges_ctx_t *badge_struct, int id,
|
||||
const char *badge_id, bool active)
|
||||
{
|
||||
if (!badge_struct)
|
||||
return;
|
||||
|
||||
badge_struct->badge_id_list[id] = badge_id;
|
||||
badge_struct->badge_locked[id] = active;
|
||||
set_badge_menu_texture(badge_struct, id);
|
||||
}
|
||||
|
||||
menu_texture_item get_badge_texture(int id)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
if (!settings || !settings->bools.cheevos_badges_enable)
|
||||
return (menu_texture_item)NULL;
|
||||
|
||||
return badges_ctx.menu_texture_list[id];
|
||||
}
|
||||
@@ -1,288 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2015-2018 - Andre Leiradella
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "fixup.h"
|
||||
#include "cheevos.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "../retroarch.h"
|
||||
#include "../core.h"
|
||||
|
||||
#include "../deps/rcheevos/include/rcheevos.h"
|
||||
|
||||
static int rcheevos_cmpaddr(const void* e1, const void* e2)
|
||||
{
|
||||
const rcheevos_fixup_t* f1 = (const rcheevos_fixup_t*)e1;
|
||||
const rcheevos_fixup_t* f2 = (const rcheevos_fixup_t*)e2;
|
||||
|
||||
if (f1->address < f2->address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (f1->address > f2->address)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static size_t rcheevos_var_reduce(size_t addr, size_t mask)
|
||||
{
|
||||
while (mask)
|
||||
{
|
||||
size_t tmp = (mask - 1) & ~mask;
|
||||
addr = (addr & tmp) | ((addr >> 1) & ~tmp);
|
||||
mask = (mask & (mask - 1)) >> 1;
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
static size_t rcheevos_var_highest_bit(size_t n)
|
||||
{
|
||||
n |= n >> 1;
|
||||
n |= n >> 2;
|
||||
n |= n >> 4;
|
||||
n |= n >> 8;
|
||||
n |= n >> 16;
|
||||
|
||||
return n ^ (n >> 1);
|
||||
}
|
||||
|
||||
void rcheevos_fixup_init(rcheevos_fixups_t* fixups)
|
||||
{
|
||||
fixups->elements = NULL;
|
||||
fixups->capacity = fixups->count = 0;
|
||||
fixups->dirty = false;
|
||||
}
|
||||
|
||||
void rcheevos_fixup_destroy(rcheevos_fixups_t* fixups)
|
||||
{
|
||||
CHEEVOS_FREE(fixups->elements);
|
||||
rcheevos_fixup_init(fixups);
|
||||
}
|
||||
|
||||
const uint8_t* rcheevos_fixup_find(rcheevos_fixups_t* fixups, unsigned address, int console)
|
||||
{
|
||||
rcheevos_fixup_t key;
|
||||
rcheevos_fixup_t* found;
|
||||
const uint8_t* location;
|
||||
|
||||
if (fixups->dirty)
|
||||
{
|
||||
qsort(fixups->elements, fixups->count, sizeof(rcheevos_fixup_t), rcheevos_cmpaddr);
|
||||
fixups->dirty = false;
|
||||
}
|
||||
|
||||
key.address = address;
|
||||
found = (rcheevos_fixup_t*)bsearch(&key, fixups->elements, fixups->count, sizeof(rcheevos_fixup_t), rcheevos_cmpaddr);
|
||||
|
||||
if (found != NULL)
|
||||
{
|
||||
return found->location;
|
||||
}
|
||||
|
||||
if (fixups->count == fixups->capacity)
|
||||
{
|
||||
unsigned new_capacity = fixups->capacity == 0 ? 16 : fixups->capacity * 2;
|
||||
rcheevos_fixup_t* new_elements = (rcheevos_fixup_t*)
|
||||
realloc(fixups->elements, new_capacity * sizeof(rcheevos_fixup_t));
|
||||
|
||||
if (new_elements == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fixups->elements = new_elements;
|
||||
fixups->capacity = new_capacity;
|
||||
}
|
||||
|
||||
fixups->elements[fixups->count].address = address;
|
||||
fixups->elements[fixups->count++].location = location =
|
||||
rcheevos_patch_address(address, console);
|
||||
fixups->dirty = true;
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
{
|
||||
rarch_system_info_t* system = runloop_get_system_info();
|
||||
const void* pointer = NULL;
|
||||
|
||||
if (console == RC_CONSOLE_NINTENDO)
|
||||
{
|
||||
if (address >= 0x0800 && address < 0x2000)
|
||||
{
|
||||
/* Address in the mirrorred RAM, adjust to real RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "NES memory address in mirrorred RAM %X, adjusted to %X\n", address, address & 0x07ff);
|
||||
address &= 0x07ff;
|
||||
}
|
||||
}
|
||||
else if (console == RC_CONSOLE_GAMEBOY_COLOR)
|
||||
{
|
||||
if (address >= 0xe000 && address <= 0xfdff)
|
||||
{
|
||||
/* Address in the echo RAM, adjust to real RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "GBC memory address in echo RAM %X, adjusted to %X\n", address, address - 0x2000);
|
||||
address -= 0x2000;
|
||||
}
|
||||
}
|
||||
|
||||
if (system->mmaps.num_descriptors != 0)
|
||||
{
|
||||
/* We have memory descriptors, use it. */
|
||||
const rarch_memory_descriptor_t* desc = NULL;
|
||||
const rarch_memory_descriptor_t* end = NULL;
|
||||
|
||||
/* Patch the address to correctly map it to the mmaps. */
|
||||
if (console == RC_CONSOLE_GAMEBOY_ADVANCE)
|
||||
{
|
||||
if (address < 0x8000)
|
||||
{
|
||||
/* Internal RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "GBA memory address %X adjusted to %X\n", address, address + 0x3000000);
|
||||
address += 0x3000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Work RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "GBA memory address %X adjusted to %X\n", address, address + 0x2000000 - 0x8000);
|
||||
address += 0x2000000 - 0x8000;
|
||||
}
|
||||
}
|
||||
else if (console == RC_CONSOLE_PC_ENGINE)
|
||||
{
|
||||
if (address < 0x002000)
|
||||
{
|
||||
/* RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1f0000);
|
||||
address += 0x1f0000;
|
||||
}
|
||||
else if (address < 0x012000)
|
||||
{
|
||||
/* CD-ROM RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x100000 - 0x002000);
|
||||
address += 0x100000 - 0x002000;
|
||||
}
|
||||
else if (address < 0x042000)
|
||||
{
|
||||
/* Super System Card RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x0d0000 - 0x012000);
|
||||
address += 0x0d0000 - 0x012000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CD-ROM battery backed RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1ee000 - 0x042000);
|
||||
address += 0x1ee000 - 0x042000;
|
||||
}
|
||||
}
|
||||
else if (console == RC_CONSOLE_SUPER_NINTENDO)
|
||||
{
|
||||
if (address < 0x020000)
|
||||
{
|
||||
/* Work RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "SNES memory address %X adjusted to %X\n", address, address + 0x7e0000);
|
||||
address += 0x7e0000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Save RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "SNES memory address %X adjusted to %X\n", address, address + 0x006000 - 0x020000);
|
||||
address += 0x006000 - 0x020000;
|
||||
}
|
||||
}
|
||||
|
||||
desc = system->mmaps.descriptors;
|
||||
end = desc + system->mmaps.num_descriptors;
|
||||
|
||||
for (; desc < end; desc++)
|
||||
{
|
||||
if (((desc->core.start ^ address) & desc->core.select) == 0)
|
||||
{
|
||||
unsigned addr = address;
|
||||
pointer = desc->core.ptr;
|
||||
|
||||
address = (unsigned)rcheevos_var_reduce(
|
||||
(addr - desc->core.start) & desc->disconnect_mask,
|
||||
desc->core.disconnect);
|
||||
|
||||
if (address >= desc->core.len)
|
||||
address -= rcheevos_var_highest_bit(address);
|
||||
|
||||
address += desc->core.offset;
|
||||
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X set to descriptor %d at offset %X\n", addr, (int)((desc - system->mmaps.descriptors) + 1), address);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned i;
|
||||
unsigned addr = address;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
retro_ctx_memory_info_t meminfo;
|
||||
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
meminfo.id = RETRO_MEMORY_SYSTEM_RAM;
|
||||
break;
|
||||
case 1:
|
||||
meminfo.id = RETRO_MEMORY_SAVE_RAM;
|
||||
break;
|
||||
case 2:
|
||||
meminfo.id = RETRO_MEMORY_VIDEO_RAM;
|
||||
break;
|
||||
case 3:
|
||||
meminfo.id = RETRO_MEMORY_RTC;
|
||||
break;
|
||||
}
|
||||
|
||||
core_get_memory(&meminfo);
|
||||
|
||||
if (addr < meminfo.size)
|
||||
{
|
||||
pointer = meminfo.data;
|
||||
address = addr;
|
||||
break;
|
||||
}
|
||||
|
||||
/**
|
||||
* HACK Subtract the correct amount of bytes to reach the save RAM as
|
||||
* it's size is not always set correctly in the core.
|
||||
*/
|
||||
if (i == 0 && console == RC_CONSOLE_NINTENDO)
|
||||
addr -= 0x6000;
|
||||
else
|
||||
addr -= meminfo.size;
|
||||
}
|
||||
}
|
||||
|
||||
if (pointer == NULL)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X not supported\n", address);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (const uint8_t*)pointer + address;
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2015-2016 - Andre Leiradella
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <file/file_path.h>
|
||||
|
||||
#include "../file_path_special.h"
|
||||
#include "../configuration.h"
|
||||
#include "../gfx/gfx_display.h"
|
||||
|
||||
#include "badges.h"
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
|
||||
#define CHEEVOS_MENU_BADGE_LIMIT 256
|
||||
/* TODO/FIXME - public global variables */
|
||||
static uintptr_t cheevos_badge_menu_texture_list[CHEEVOS_MENU_BADGE_LIMIT] = { 0 };
|
||||
|
||||
void cheevos_reset_menu_badges(void)
|
||||
{
|
||||
int index;
|
||||
for (index = 0; index < CHEEVOS_MENU_BADGE_LIMIT; ++index)
|
||||
{
|
||||
if (cheevos_badge_menu_texture_list[index])
|
||||
video_driver_texture_unload(&cheevos_badge_menu_texture_list[index]);
|
||||
}
|
||||
|
||||
memset(&cheevos_badge_menu_texture_list, 0, sizeof(cheevos_badge_menu_texture_list));
|
||||
}
|
||||
|
||||
void cheevos_set_menu_badge(int index, const char *badge, bool locked)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
if (index >= CHEEVOS_MENU_BADGE_LIMIT)
|
||||
return;
|
||||
|
||||
if (!settings || !settings->bools.cheevos_badges_enable)
|
||||
cheevos_badge_menu_texture_list[index] = 0;
|
||||
else
|
||||
cheevos_badge_menu_texture_list[index] = cheevos_get_badge_texture(badge, locked);
|
||||
}
|
||||
|
||||
uintptr_t cheevos_get_menu_badge_texture(int index)
|
||||
{
|
||||
if (index < CHEEVOS_MENU_BADGE_LIMIT)
|
||||
return cheevos_badge_menu_texture_list[index];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
uintptr_t cheevos_get_badge_texture(const char *badge, bool locked)
|
||||
{
|
||||
char badge_file[24];
|
||||
char fullpath[PATH_MAX_LENGTH];
|
||||
uintptr_t tex = 0;
|
||||
|
||||
if (!badge)
|
||||
return 0;
|
||||
|
||||
strlcpy(badge_file, badge, sizeof(badge_file));
|
||||
if (locked)
|
||||
strlcat(badge_file, "_lock", sizeof(badge_file));
|
||||
strlcat(badge_file, ".png", sizeof(badge_file));
|
||||
|
||||
fill_pathname_application_special(fullpath,
|
||||
PATH_MAX_LENGTH * sizeof(char),
|
||||
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
|
||||
|
||||
if (!gfx_display_reset_textures_list(badge_file, fullpath,
|
||||
&tex, TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))
|
||||
tex = 0;
|
||||
|
||||
return tex;
|
||||
}
|
||||
@@ -16,28 +16,19 @@
|
||||
#ifndef __RARCH_CHEEVOS_BADGE_H
|
||||
#define __RARCH_CHEEVOS_BADGE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include "../menu/menu_driver.h"
|
||||
#include <boolean.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
#define CHEEVOS_BADGE_LIMIT 256
|
||||
#ifdef HAVE_MENU
|
||||
void cheevos_reset_menu_badges(void);
|
||||
void cheevos_set_menu_badge(int index, const char *badge, bool locked);
|
||||
uintptr_t cheevos_get_menu_badge_texture(int index);
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool badge_locked[CHEEVOS_BADGE_LIMIT];
|
||||
const char * badge_id_list[CHEEVOS_BADGE_LIMIT];
|
||||
menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT];
|
||||
} badges_ctx_t;
|
||||
|
||||
bool badge_exists(const char* filepath);
|
||||
void set_badge_menu_texture(badges_ctx_t * badges, int i);
|
||||
extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active);
|
||||
extern menu_texture_item get_badge_texture(int id);
|
||||
|
||||
extern badges_ctx_t badges_ctx;
|
||||
static badges_ctx_t new_badges_ctx;
|
||||
uintptr_t cheevos_get_badge_texture(const char* badge, bool locked);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -45,10 +45,11 @@ bool rcheevos_load(const void *data);
|
||||
void rcheevos_reset_game(void);
|
||||
|
||||
void rcheevos_populate_menu(void *data);
|
||||
void rcheevos_get_achievement_state(unsigned index, char* buffer, size_t buffer_size);
|
||||
|
||||
bool rcheevos_get_description(rcheevos_ctx_desc_t *desc);
|
||||
|
||||
bool rcheevos_apply_cheats(bool *data_bool);
|
||||
void rcheevos_pause_hardcore();
|
||||
|
||||
bool rcheevos_unload(void);
|
||||
|
||||
@@ -56,20 +57,20 @@ bool rcheevos_toggle_hardcore_mode(void);
|
||||
|
||||
void rcheevos_test(void);
|
||||
|
||||
bool rcheevos_set_cheats(void);
|
||||
|
||||
void rcheevos_set_support_cheevos(bool state);
|
||||
|
||||
bool rcheevos_get_support_cheevos(void);
|
||||
|
||||
int rcheevos_get_console(void);
|
||||
|
||||
const char* rcheevos_get_hash(void);
|
||||
|
||||
const char *rcheevos_get_richpresence(void);
|
||||
|
||||
extern bool rcheevos_loaded;
|
||||
extern bool rcheevos_hardcore_active;
|
||||
extern bool rcheevos_hardcore_paused;
|
||||
extern bool rcheevos_state_loaded_flag;
|
||||
extern int rcheevos_cheats_are_enabled;
|
||||
extern int rcheevos_cheats_were_enabled;
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
File renamed without changes.
+314
@@ -0,0 +1,314 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2015-2018 - Andre Leiradella
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "fixup.h"
|
||||
#include "cheevos.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "../retroarch.h"
|
||||
#include "../core.h"
|
||||
|
||||
#include "../deps/rcheevos/include/rcheevos.h"
|
||||
#include "../deps/rcheevos/include/rconsoles.h"
|
||||
|
||||
static int rcheevos_cmpaddr(const void* e1, const void* e2)
|
||||
{
|
||||
const rcheevos_fixup_t* f1 = (const rcheevos_fixup_t*)e1;
|
||||
const rcheevos_fixup_t* f2 = (const rcheevos_fixup_t*)e2;
|
||||
|
||||
if (f1->address < f2->address)
|
||||
return -1;
|
||||
else if (f1->address > f2->address)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t rcheevos_var_reduce(size_t addr, size_t mask)
|
||||
{
|
||||
while (mask)
|
||||
{
|
||||
size_t tmp = (mask - 1) & ~mask;
|
||||
addr = (addr & tmp) | ((addr >> 1) & ~tmp);
|
||||
mask = (mask & (mask - 1)) >> 1;
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
static size_t rcheevos_var_highest_bit(size_t n)
|
||||
{
|
||||
n |= n >> 1;
|
||||
n |= n >> 2;
|
||||
n |= n >> 4;
|
||||
n |= n >> 8;
|
||||
n |= n >> 16;
|
||||
|
||||
return n ^ (n >> 1);
|
||||
}
|
||||
|
||||
void rcheevos_fixup_init(rcheevos_fixups_t* fixups)
|
||||
{
|
||||
fixups->elements = NULL;
|
||||
fixups->capacity = fixups->count = 0;
|
||||
fixups->dirty = false;
|
||||
}
|
||||
|
||||
void rcheevos_fixup_destroy(rcheevos_fixups_t* fixups)
|
||||
{
|
||||
CHEEVOS_FREE(fixups->elements);
|
||||
rcheevos_fixup_init(fixups);
|
||||
}
|
||||
|
||||
const uint8_t* rcheevos_fixup_find(
|
||||
rcheevos_fixups_t* fixups, unsigned address, int console)
|
||||
{
|
||||
rcheevos_fixup_t key;
|
||||
rcheevos_fixup_t* found;
|
||||
const uint8_t* location;
|
||||
|
||||
if (fixups->dirty)
|
||||
{
|
||||
qsort(fixups->elements, fixups->count,
|
||||
sizeof(rcheevos_fixup_t), rcheevos_cmpaddr);
|
||||
fixups->dirty = false;
|
||||
}
|
||||
|
||||
key.address = address;
|
||||
found = (rcheevos_fixup_t*)bsearch(&key,
|
||||
fixups->elements, fixups->count,
|
||||
sizeof(rcheevos_fixup_t), rcheevos_cmpaddr);
|
||||
|
||||
if (found)
|
||||
return found->location;
|
||||
|
||||
if (fixups->count == fixups->capacity)
|
||||
{
|
||||
unsigned new_capacity = fixups->capacity == 0 ? 16 : fixups->capacity * 2;
|
||||
rcheevos_fixup_t* new_elements = (rcheevos_fixup_t*)
|
||||
realloc(fixups->elements, new_capacity * sizeof(rcheevos_fixup_t));
|
||||
|
||||
if (!new_elements)
|
||||
return NULL;
|
||||
|
||||
fixups->elements = new_elements;
|
||||
fixups->capacity = new_capacity;
|
||||
}
|
||||
|
||||
fixups->elements[fixups->count].address = address;
|
||||
fixups->elements[fixups->count++].location = location =
|
||||
rcheevos_patch_address(address, console);
|
||||
fixups->dirty = true;
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
{
|
||||
rarch_system_info_t* system = runloop_get_system_info();
|
||||
const void* pointer = NULL;
|
||||
unsigned original_address = address;
|
||||
|
||||
switch (console)
|
||||
{
|
||||
case RC_CONSOLE_NINTENDO:
|
||||
if (address >= 0x0800 && address < 0x2000)
|
||||
{
|
||||
/* Address in the mirrorred RAM,
|
||||
* adjust to real RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "NES memory address in mirrorred RAM %X, adjusted to %X\n", address, address & 0x07ff);
|
||||
address &= 0x07ff;
|
||||
}
|
||||
break;
|
||||
case RC_CONSOLE_GAMEBOY_COLOR:
|
||||
if (address >= 0xe000 && address <= 0xfdff)
|
||||
{
|
||||
/* Address in the echo RAM, adjust to real RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "GBC memory address in echo RAM %X, adjusted to %X\n", address, address - 0x2000);
|
||||
address -= 0x2000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (system->mmaps.num_descriptors != 0)
|
||||
{
|
||||
/* We have memory descriptors, use it. */
|
||||
const rarch_memory_descriptor_t* desc = NULL;
|
||||
const rarch_memory_descriptor_t* end = NULL;
|
||||
|
||||
/* Patch the address to correctly map it to the mmaps. */
|
||||
switch (console)
|
||||
{
|
||||
case RC_CONSOLE_GAMEBOY_ADVANCE:
|
||||
if (address < 0x8000)
|
||||
{
|
||||
/* Internal RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "GBA memory address %X adjusted to %X\n", address, address + 0x3000000);
|
||||
address += 0x3000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Work RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "GBA memory address %X adjusted to %X\n", address, address + 0x2000000 - 0x8000);
|
||||
address += 0x2000000 - 0x8000;
|
||||
}
|
||||
break;
|
||||
case RC_CONSOLE_PC_ENGINE:
|
||||
if (address < 0x002000)
|
||||
{
|
||||
/* RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1f0000);
|
||||
address += 0x1f0000;
|
||||
}
|
||||
else if (address < 0x012000)
|
||||
{
|
||||
/* CD-ROM RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x100000 - 0x002000);
|
||||
address += 0x100000 - 0x002000;
|
||||
}
|
||||
else if (address < 0x042000)
|
||||
{
|
||||
/* Super System Card RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x0d0000 - 0x012000);
|
||||
address += 0x0d0000 - 0x012000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CD-ROM battery backed RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1ee000 - 0x042000);
|
||||
address += 0x1ee000 - 0x042000;
|
||||
}
|
||||
break;
|
||||
case RC_CONSOLE_SUPER_NINTENDO:
|
||||
if (address < 0x020000)
|
||||
{
|
||||
/* Work RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "SNES memory address %X adjusted to %X\n", address, address + 0x7e0000);
|
||||
address += 0x7e0000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Save RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "SNES memory address %X adjusted to %X\n", address, address + 0x006000 - 0x020000);
|
||||
address += 0x006000 - 0x020000;
|
||||
}
|
||||
break;
|
||||
case RC_CONSOLE_SEGA_CD:
|
||||
if (address < 0x010000)
|
||||
{
|
||||
/* Work RAM. */
|
||||
address += 0xFF0000;
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Sega CD memory address %X adjusted to %X\n", original_address, address);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CD-ROM peripheral RAM - exposed at virtual address to avoid banking */
|
||||
address += 0x80020000 - 0x010000;
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Sega CD memory address %X adjusted to %X\n", original_address, address);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
desc = system->mmaps.descriptors;
|
||||
end = desc + system->mmaps.num_descriptors;
|
||||
|
||||
for (; desc < end; desc++)
|
||||
{
|
||||
if (((desc->core.start ^ address) & desc->core.select) == 0)
|
||||
{
|
||||
pointer = desc->core.ptr;
|
||||
address -= desc->core.start;
|
||||
|
||||
if (desc->disconnect_mask)
|
||||
address = (unsigned)rcheevos_var_reduce(
|
||||
address & desc->disconnect_mask, desc->core.disconnect);
|
||||
|
||||
if (address >= desc->core.len)
|
||||
address -= rcheevos_var_highest_bit(address);
|
||||
|
||||
address += desc->core.offset;
|
||||
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X set to descriptor %d at offset %X\n", original_address,
|
||||
(int)((desc - system->mmaps.descriptors) + 1), address);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (console == RC_CONSOLE_GAMEBOY_ADVANCE)
|
||||
{
|
||||
/* The RetroAchievements implementation of memory access
|
||||
* for GBA puts the save RAM first,
|
||||
* so the default looping behavior below is backwards.
|
||||
*
|
||||
* If the core doesn't expose a
|
||||
* memory map, say it isn't supported.
|
||||
*/
|
||||
pointer = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
retro_ctx_memory_info_t meminfo;
|
||||
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
meminfo.id = RETRO_MEMORY_SYSTEM_RAM;
|
||||
break;
|
||||
case 1:
|
||||
meminfo.id = RETRO_MEMORY_SAVE_RAM;
|
||||
break;
|
||||
case 2:
|
||||
meminfo.id = RETRO_MEMORY_VIDEO_RAM;
|
||||
break;
|
||||
case 3:
|
||||
meminfo.id = RETRO_MEMORY_RTC;
|
||||
break;
|
||||
}
|
||||
|
||||
core_get_memory(&meminfo);
|
||||
|
||||
if (address < meminfo.size)
|
||||
{
|
||||
pointer = meminfo.data;
|
||||
break;
|
||||
}
|
||||
|
||||
/**
|
||||
* HACK Subtract the correct amount of bytes to
|
||||
* reach the save RAM as its size is not always
|
||||
* set correctly in the core.
|
||||
*/
|
||||
if (i == 0 && console == RC_CONSOLE_NINTENDO)
|
||||
address -= 0x6000;
|
||||
else
|
||||
address -= meminfo.size;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pointer)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X not supported\n", original_address);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (const uint8_t*)pointer + address;
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -3,6 +3,7 @@
|
||||
#include "hash.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <encodings/utf.h>
|
||||
#include <formats/jsonsax.h>
|
||||
#include <string/stdstring.h>
|
||||
#include <compat/strl.h>
|
||||
@@ -23,6 +24,7 @@
|
||||
#define CHEEVOS_JSON_KEY_TOKEN 0x0e2dbd26U
|
||||
#define CHEEVOS_JSON_KEY_FLAGS 0x0d2e96b2U
|
||||
#define CHEEVOS_JSON_KEY_LEADERBOARDS 0xf1247d2dU
|
||||
#define CHEEVOS_JSON_KEY_RICHPRESENCE 0xf18dd230U
|
||||
#define CHEEVOS_JSON_KEY_MEM 0x0b8807e4U
|
||||
#define CHEEVOS_JSON_KEY_FORMAT 0xb341208eU
|
||||
#define CHEEVOS_JSON_KEY_SUCCESS 0x110461deU
|
||||
@@ -139,7 +141,7 @@ static int rcheevos_get_value(const char* json, unsigned key_hash,
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Returns the token of the error message
|
||||
Returns the token or the error message
|
||||
*****************************************************************************/
|
||||
|
||||
int rcheevos_get_token(const char* json, char* token, size_t length)
|
||||
@@ -152,6 +154,11 @@ int rcheevos_get_token(const char* json, char* token, size_t length)
|
||||
return rcheevos_get_value(json, CHEEVOS_JSON_KEY_TOKEN, token, length);
|
||||
}
|
||||
|
||||
int rcheevos_get_json_error(const char* json, char* token, size_t length)
|
||||
{
|
||||
return rcheevos_get_value(json, CHEEVOS_JSON_KEY_ERROR, token, length);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Count number of achievements in a JSON file
|
||||
*****************************************************************************/
|
||||
@@ -160,6 +167,7 @@ typedef struct
|
||||
{
|
||||
int in_cheevos;
|
||||
int in_lboards;
|
||||
int has_error;
|
||||
uint32_t field_hash;
|
||||
unsigned core_count;
|
||||
unsigned unofficial_count;
|
||||
@@ -183,9 +191,11 @@ static int rcheevos_count_key(void* userdata,
|
||||
ud->field_hash = rcheevos_djb2(name, length);
|
||||
|
||||
if (ud->field_hash == CHEEVOS_JSON_KEY_ACHIEVEMENTS)
|
||||
ud->in_cheevos = 1;
|
||||
ud->in_cheevos = 1;
|
||||
else if (ud->field_hash == CHEEVOS_JSON_KEY_LEADERBOARDS)
|
||||
ud->in_lboards = 1;
|
||||
ud->in_lboards = 1;
|
||||
else if (ud->field_hash == CHEEVOS_JSON_KEY_ERROR)
|
||||
ud->has_error = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -212,7 +222,7 @@ static int rcheevos_count_number(void* userdata,
|
||||
|
||||
static int rcheevos_count_cheevos(const char* json,
|
||||
unsigned* core_count, unsigned* unofficial_count,
|
||||
unsigned* lboard_count)
|
||||
unsigned* lboard_count, int* has_error)
|
||||
{
|
||||
static const jsonsax_handlers_t handlers =
|
||||
{
|
||||
@@ -234,6 +244,7 @@ static int rcheevos_count_cheevos(const char* json,
|
||||
rcheevos_countud_t ud;
|
||||
ud.in_cheevos = 0;
|
||||
ud.in_lboards = 0;
|
||||
ud.has_error = 0;
|
||||
ud.core_count = 0;
|
||||
ud.unofficial_count = 0;
|
||||
ud.lboard_count = 0;
|
||||
@@ -243,6 +254,7 @@ static int rcheevos_count_cheevos(const char* json,
|
||||
*core_count = ud.core_count;
|
||||
*unofficial_count = ud.unofficial_count;
|
||||
*lboard_count = ud.lboard_count;
|
||||
*has_error = ud.has_error;
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -261,7 +273,10 @@ typedef struct
|
||||
{
|
||||
int in_cheevos;
|
||||
int in_lboards;
|
||||
int is_game_id;
|
||||
int is_title;
|
||||
int is_console_id;
|
||||
int is_richpresence;
|
||||
unsigned core_count;
|
||||
unsigned unofficial_count;
|
||||
unsigned lboard_count;
|
||||
@@ -273,16 +288,75 @@ typedef struct
|
||||
rcheevos_rapatchdata_t* patchdata;
|
||||
} rcheevos_readud_t;
|
||||
|
||||
static const char* rcheevos_dupstr(const rcheevos_field_t* field)
|
||||
static char* rcheevos_unescape_string(const char* string, size_t length)
|
||||
{
|
||||
char* string = (char*)malloc(field->length + 1);
|
||||
const char* end = string + length;
|
||||
char* buffer = (char*)malloc(length + 1);
|
||||
char* buffer_it = buffer;
|
||||
|
||||
if (!string)
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
|
||||
memcpy((void*)string, (void*)field->string, field->length);
|
||||
string[field->length] = 0;
|
||||
return string;
|
||||
while (string < end)
|
||||
{
|
||||
if (*string == '\\')
|
||||
{
|
||||
char escaped_char = string[1];
|
||||
switch (escaped_char)
|
||||
{
|
||||
case 'r': /* Ignore carriage return */
|
||||
string += 2;
|
||||
break;
|
||||
|
||||
case 'n': /* Accept newlines */
|
||||
*buffer_it++ = '\n';
|
||||
string += 2;
|
||||
break;
|
||||
|
||||
case 'u': /* Accept UTF-16 unicode characters */
|
||||
{
|
||||
#define MAX_SEQUENCES 16
|
||||
uint16_t utf16[MAX_SEQUENCES];
|
||||
char utf8[MAX_SEQUENCES * 4];
|
||||
uint8_t i, j;
|
||||
|
||||
for (i = 1; i < MAX_SEQUENCES - 1; i++)
|
||||
if (strncmp((string + 6 * i), "\\u", 2))
|
||||
break;
|
||||
|
||||
/* Get escaped hex values and add them to the string */
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
char temp[5];
|
||||
|
||||
string += 2;
|
||||
memcpy(temp, string, 4);
|
||||
temp[4] = '\0';
|
||||
utf16[j] = string_hex_to_unsigned(temp);
|
||||
string += 4;
|
||||
}
|
||||
utf16[j] = 0;
|
||||
|
||||
if (utf16_to_char_string(utf16, utf8, sizeof(utf8)))
|
||||
{
|
||||
memcpy(buffer_it, utf8, strlen(utf8));
|
||||
buffer_it += strlen(utf8);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
*buffer_it++ = escaped_char;
|
||||
string += 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
*buffer_it++ = *string++;
|
||||
}
|
||||
*buffer_it = '\0';
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static int rcheevos_new_cheevo(rcheevos_readud_t* ud)
|
||||
@@ -297,10 +371,10 @@ static int rcheevos_new_cheevo(rcheevos_readud_t* ud)
|
||||
else
|
||||
return 0;
|
||||
|
||||
cheevo->title = rcheevos_dupstr(&ud->title);
|
||||
cheevo->description = rcheevos_dupstr(&ud->desc);
|
||||
cheevo->badge = rcheevos_dupstr(&ud->badge);
|
||||
cheevo->memaddr = rcheevos_dupstr(&ud->memaddr);
|
||||
cheevo->title = rcheevos_unescape_string(ud->title.string, ud->title.length);
|
||||
cheevo->description = rcheevos_unescape_string(ud->desc.string, ud->desc.length);
|
||||
cheevo->badge = rcheevos_unescape_string(ud->badge.string, ud->badge.length);
|
||||
cheevo->memaddr = rcheevos_unescape_string(ud->memaddr.string, ud->memaddr.length);
|
||||
cheevo->points = (unsigned)strtol(ud->points.string, NULL, 10);
|
||||
cheevo->id = (unsigned)strtol(ud->id.string, NULL, 10);
|
||||
|
||||
@@ -323,11 +397,11 @@ static int rcheevos_new_lboard(rcheevos_readud_t* ud)
|
||||
{
|
||||
rcheevos_ralboard_t* lboard = ud->patchdata->lboards + ud->lboard_count++;
|
||||
|
||||
lboard->title = rcheevos_dupstr(&ud->title);
|
||||
lboard->description = rcheevos_dupstr(&ud->desc);
|
||||
lboard->format = rcheevos_dupstr(&ud->format);
|
||||
lboard->mem = rcheevos_dupstr(&ud->memaddr);
|
||||
lboard->id = (unsigned)strtol(ud->id.string, NULL, 10);
|
||||
lboard->title = rcheevos_unescape_string(ud->title.string, ud->title.length);
|
||||
lboard->description = rcheevos_unescape_string(ud->desc.string, ud->desc.length);
|
||||
lboard->format = rcheevos_unescape_string(ud->format.string, ud->format.length);
|
||||
lboard->mem = rcheevos_unescape_string(ud->memaddr.string, ud->memaddr.length);
|
||||
lboard->id = (unsigned)strtol(ud->id.string, NULL, 10);
|
||||
|
||||
if ( !lboard->title
|
||||
|| !lboard->description
|
||||
@@ -386,9 +460,14 @@ static int rcheevos_read_key(void* userdata,
|
||||
case CHEEVOS_JSON_KEY_CONSOLE_ID:
|
||||
ud->is_console_id = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_RICHPRESENCE:
|
||||
ud->is_richpresence = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_ID:
|
||||
if (common)
|
||||
ud->field = &ud->id;
|
||||
else
|
||||
ud->is_game_id = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_MEMADDR:
|
||||
if (ud->in_cheevos)
|
||||
@@ -401,6 +480,8 @@ static int rcheevos_read_key(void* userdata,
|
||||
case CHEEVOS_JSON_KEY_TITLE:
|
||||
if (common)
|
||||
ud->field = &ud->title;
|
||||
else
|
||||
ud->is_title = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_DESCRIPTION:
|
||||
if (common)
|
||||
@@ -451,6 +532,16 @@ static int rcheevos_read_string(void* userdata,
|
||||
ud->field->string = string;
|
||||
ud->field->length = length;
|
||||
}
|
||||
else if (ud->is_title)
|
||||
{
|
||||
ud->patchdata->title = rcheevos_unescape_string(string, length);
|
||||
ud->is_title = 0;
|
||||
}
|
||||
else if (ud->is_richpresence)
|
||||
{
|
||||
ud->patchdata->richpresence_script = rcheevos_unescape_string(string, length);
|
||||
ud->is_richpresence = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -465,6 +556,11 @@ static int rcheevos_read_number(void* userdata,
|
||||
ud->field->string = number;
|
||||
ud->field->length = length;
|
||||
}
|
||||
else if (ud->is_game_id)
|
||||
{
|
||||
ud->patchdata->game_id = (unsigned)strtol(number, NULL, 10);
|
||||
ud->is_game_id = 0;
|
||||
}
|
||||
else if (ud->is_console_id)
|
||||
{
|
||||
ud->patchdata->console_id = (unsigned)strtol(number, NULL, 10);
|
||||
@@ -494,12 +590,13 @@ int rcheevos_get_patchdata(const char* json, rcheevos_rapatchdata_t* patchdata)
|
||||
|
||||
rcheevos_readud_t ud;
|
||||
int res;
|
||||
int has_error;
|
||||
|
||||
/* Count the number of achievements in the JSON file. */
|
||||
res = rcheevos_count_cheevos(json, &patchdata->core_count,
|
||||
&patchdata->unofficial_count, &patchdata->lboard_count);
|
||||
&patchdata->unofficial_count, &patchdata->lboard_count, &has_error);
|
||||
|
||||
if (res != JSONSAX_OK)
|
||||
if (res != JSONSAX_OK || has_error)
|
||||
return -1;
|
||||
|
||||
/* Allocate the achievements. */
|
||||
@@ -524,10 +621,16 @@ int rcheevos_get_patchdata(const char* json, rcheevos_rapatchdata_t* patchdata)
|
||||
return -1;
|
||||
}
|
||||
|
||||
patchdata->richpresence_script = NULL;
|
||||
patchdata->title = NULL;
|
||||
|
||||
/* Load the achievements. */
|
||||
ud.in_cheevos = 0;
|
||||
ud.in_lboards = 0;
|
||||
ud.is_game_id = 0;
|
||||
ud.is_title = 0;
|
||||
ud.is_console_id = 0;
|
||||
ud.is_richpresence = 0;
|
||||
ud.field = NULL;
|
||||
ud.core_count = 0;
|
||||
ud.unofficial_count = 0;
|
||||
@@ -586,7 +689,10 @@ void rcheevos_free_patchdata(rcheevos_rapatchdata_t* patchdata)
|
||||
CHEEVOS_FREE(patchdata->core);
|
||||
CHEEVOS_FREE(patchdata->unofficial);
|
||||
CHEEVOS_FREE(patchdata->lboards);
|
||||
CHEEVOS_FREE(patchdata->richpresence_script);
|
||||
CHEEVOS_FREE(patchdata->title);
|
||||
|
||||
patchdata->game_id = 0;
|
||||
patchdata->console_id = 0;
|
||||
patchdata->core = NULL;
|
||||
patchdata->unofficial = NULL;
|
||||
@@ -42,11 +42,14 @@ typedef struct {
|
||||
} rcheevos_ralboard_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned game_id;
|
||||
unsigned console_id;
|
||||
char* title;
|
||||
|
||||
rcheevos_racheevo_t* core;
|
||||
rcheevos_racheevo_t* unofficial;
|
||||
rcheevos_ralboard_t* lboards;
|
||||
char* richpresence_script;
|
||||
|
||||
unsigned core_count;
|
||||
unsigned unofficial_count;
|
||||
@@ -55,6 +58,7 @@ typedef struct {
|
||||
|
||||
typedef void (*rcheevos_unlock_cb_t)(unsigned id, void* userdata);
|
||||
|
||||
int rcheevos_get_json_error(const char* json, char* token, size_t length);
|
||||
int rcheevos_get_token(const char* json, char* token, size_t length);
|
||||
|
||||
int rcheevos_get_patchdata(const char* json, rcheevos_rapatchdata_t* patchdata);
|
||||
@@ -32,7 +32,7 @@ End of setup
|
||||
*****************************************************************************/
|
||||
|
||||
#define RCHEEVOS_TAG "[RCHEEVOS]: "
|
||||
#define CHEEVOS_FREE(p) do { void* q = (void*)p; if (q != NULL) free(q); } while (0)
|
||||
#define CHEEVOS_FREE(p) do { void* q = (void*)p; if (q) free(q); } while (0)
|
||||
|
||||
#ifdef CHEEVOS_VERBOSE
|
||||
|
||||
@@ -180,6 +180,8 @@ enum event_command
|
||||
CMD_EVENT_DISK_NEXT,
|
||||
/* Cycle to previous disk. */
|
||||
CMD_EVENT_DISK_PREV,
|
||||
/* Switch to specified disk index */
|
||||
CMD_EVENT_DISK_INDEX,
|
||||
/* Appends disk image to disk image list. */
|
||||
CMD_EVENT_DISK_APPEND_IMAGE,
|
||||
/* Stops rumbling. */
|
||||
@@ -208,11 +210,10 @@ enum event_command
|
||||
CMD_EVENT_CHEAT_INDEX_PLUS,
|
||||
CMD_EVENT_CHEAT_INDEX_MINUS,
|
||||
CMD_EVENT_CHEAT_TOGGLE,
|
||||
CMD_EVENT_AI_SERVICE_CALL
|
||||
CMD_EVENT_AI_SERVICE_CALL,
|
||||
CMD_EVENT_SAVE_FILES
|
||||
};
|
||||
|
||||
bool command_set_shader(const char *arg);
|
||||
|
||||
/**
|
||||
* command_event:
|
||||
* @cmd : Command index.
|
||||
|
||||
+257
-164
@@ -139,6 +139,11 @@
|
||||
#define DEFAULT_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_ALWAYS
|
||||
#endif
|
||||
|
||||
/* Show/hide navigation bar
|
||||
* > When hidden, MaterialUI menu navigation
|
||||
* behaves like RGUI */
|
||||
#define DEFAULT_MATERIALUI_SHOW_NAV_BAR true
|
||||
|
||||
/* Reposition navigation bar to make better use
|
||||
* of screen space when using landscape layouts */
|
||||
#define DEFAULT_MATERIALUI_AUTO_ROTATE_NAV_BAR true
|
||||
@@ -329,7 +334,14 @@
|
||||
#endif
|
||||
|
||||
/* Smooths picture. */
|
||||
#if defined(_3DS) || defined(GEKKO) || defined(HW_RVL) || defined(PSP) || defined(VITA) || defined(SN_TARGET_PSP2) || defined(PS2) || defined(_XBOX)
|
||||
#define DEFAULT_VIDEO_SMOOTH true
|
||||
#else
|
||||
#define DEFAULT_VIDEO_SMOOTH false
|
||||
#endif
|
||||
|
||||
/* Graphics context specific scaling */
|
||||
#define DEFAULT_VIDEO_CTX_SCALING false
|
||||
|
||||
/* On resize and fullscreen, rendering area will stay 4:3 */
|
||||
#define DEFAULT_FORCE_ASPECT true
|
||||
@@ -386,9 +398,9 @@
|
||||
#define DEFAULT_OVERLAY_AUTO_ROTATE false
|
||||
#endif
|
||||
|
||||
#include "runtime_file.h"
|
||||
#ifdef HAVE_MENU
|
||||
#include "menu/menu_driver.h"
|
||||
#include "menu/menu_animation.h"
|
||||
|
||||
#ifdef HAVE_LIBNX
|
||||
#define DEFAULT_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME true
|
||||
@@ -397,8 +409,11 @@
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OZONE
|
||||
/* Ozone colour theme: 1 == Basic Black */
|
||||
#define DEFAULT_OZONE_COLOR_THEME 1
|
||||
#define DEFAULT_OZONE_COLLAPSE_SIDEBAR false
|
||||
#define DEFAULT_OZONE_TRUNCATE_PLAYLIST_NAME true
|
||||
#define DEFAULT_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME true
|
||||
#define DEFAULT_OZONE_SCROLL_CONTENT_METADATA false
|
||||
#endif
|
||||
|
||||
@@ -448,89 +463,106 @@
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_CLOSE_CONTENT true
|
||||
|
||||
static bool quick_menu_show_take_screenshot = true;
|
||||
static bool quick_menu_show_save_load_state = true;
|
||||
static bool quick_menu_show_undo_save_load_state = true;
|
||||
static bool quick_menu_show_add_to_favorites = true;
|
||||
static bool quick_menu_show_start_recording = true;
|
||||
static bool quick_menu_show_start_streaming = true;
|
||||
static bool quick_menu_show_set_core_association = true;
|
||||
static bool quick_menu_show_reset_core_association = true;
|
||||
static bool quick_menu_show_options = true;
|
||||
static bool quick_menu_show_controls = true;
|
||||
static bool quick_menu_show_cheats = true;
|
||||
static bool quick_menu_show_shaders = true;
|
||||
static bool quick_menu_show_information = true;
|
||||
static bool quick_menu_show_recording = true;
|
||||
static bool quick_menu_show_streaming = true;
|
||||
#define DEFAULT_QUICK_MENU_SHOW_TAKE_SCREENSHOT true
|
||||
|
||||
static bool quick_menu_show_save_core_overrides = true;
|
||||
static bool quick_menu_show_save_game_overrides = true;
|
||||
static bool quick_menu_show_save_content_dir_overrides = true;
|
||||
#define DEFAULT_QUICK_MENU_SHOW_SAVE_LOAD_STATE true
|
||||
|
||||
static bool quick_menu_show_download_thumbnails = true;
|
||||
#define DEFAULT_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE true
|
||||
|
||||
static bool kiosk_mode_enable = false;
|
||||
static const bool quick_menu_show_add_to_favorites = true;
|
||||
static const bool quick_menu_show_start_recording = true;
|
||||
static const bool quick_menu_show_start_streaming = true;
|
||||
static const bool quick_menu_show_set_core_association = true;
|
||||
static const bool quick_menu_show_reset_core_association = true;
|
||||
static const bool quick_menu_show_options = true;
|
||||
static const bool quick_menu_show_controls = true;
|
||||
static const bool quick_menu_show_cheats = true;
|
||||
static const bool quick_menu_show_shaders = true;
|
||||
static const bool quick_menu_show_information = true;
|
||||
static const bool quick_menu_show_recording = true;
|
||||
static const bool quick_menu_show_streaming = true;
|
||||
|
||||
static const bool quick_menu_show_save_core_overrides = true;
|
||||
static const bool quick_menu_show_save_game_overrides = true;
|
||||
static const bool quick_menu_show_save_content_dir_overrides = true;
|
||||
|
||||
#ifdef HAVE_NETWORKING
|
||||
static const bool quick_menu_show_download_thumbnails = true;
|
||||
#endif
|
||||
|
||||
#define DEFAULT_KIOSK_MODE_ENABLE false
|
||||
|
||||
#define DEFAULT_MENU_HORIZONTAL_ANIMATION true
|
||||
|
||||
static bool menu_show_online_updater = true;
|
||||
static bool menu_show_load_core = true;
|
||||
static bool menu_show_load_content = true;
|
||||
static const bool menu_show_online_updater = true;
|
||||
static const bool menu_show_load_core = true;
|
||||
static const bool menu_show_load_content = true;
|
||||
#ifdef HAVE_CDROM
|
||||
static bool menu_show_load_disc = true;
|
||||
static bool menu_show_dump_disc = true;
|
||||
static const bool menu_show_load_disc = true;
|
||||
static const bool menu_show_dump_disc = true;
|
||||
#endif
|
||||
static bool menu_show_information = true;
|
||||
static bool menu_show_configurations = true;
|
||||
static bool menu_show_help = true;
|
||||
static bool menu_show_quit_retroarch = true;
|
||||
static bool menu_show_restart_retroarch = true;
|
||||
static bool menu_show_reboot = true;
|
||||
static bool menu_show_shutdown = true;
|
||||
static const bool menu_show_information = true;
|
||||
static const bool menu_show_configurations = true;
|
||||
static const bool menu_show_help = true;
|
||||
static const bool menu_show_quit_retroarch = true;
|
||||
static const bool menu_show_restart_retroarch = true;
|
||||
static const bool menu_show_reboot = true;
|
||||
static const bool menu_show_shutdown = true;
|
||||
#if defined(HAVE_LAKKA) || defined(VITA) || defined(_3DS)
|
||||
static bool menu_show_core_updater = false;
|
||||
static const bool menu_show_core_updater = false;
|
||||
#else
|
||||
static bool menu_show_core_updater = true;
|
||||
static const bool menu_show_core_updater = true;
|
||||
#endif
|
||||
static bool menu_show_legacy_thumbnail_updater = false;
|
||||
static bool menu_show_sublabels = true;
|
||||
static const bool menu_show_legacy_thumbnail_updater = false;
|
||||
static const bool menu_show_sublabels = true;
|
||||
|
||||
static unsigned menu_ticker_type = TICKER_TYPE_BOUNCE;
|
||||
static float menu_ticker_speed = 1.0f;
|
||||
static const bool menu_scroll_fast = false;
|
||||
|
||||
#define DEFAULT_MENU_TICKER_TYPE (TICKER_TYPE_LOOP)
|
||||
static const float menu_ticker_speed = 2.0f;
|
||||
|
||||
#define DEFAULT_MENU_TICKER_SMOOTH true
|
||||
|
||||
#if defined(HAVE_THREADS)
|
||||
static bool menu_savestate_resume = true;
|
||||
static const bool menu_savestate_resume = true;
|
||||
#else
|
||||
static bool menu_savestate_resume = false;
|
||||
static const bool menu_savestate_resume = false;
|
||||
#endif
|
||||
|
||||
static bool content_show_settings = true;
|
||||
static bool content_show_favorites = true;
|
||||
#define DEFAULT_MENU_INSERT_DISK_RESUME true
|
||||
|
||||
static const bool content_show_settings = true;
|
||||
static const bool content_show_favorites = true;
|
||||
#ifdef HAVE_IMAGEVIEWER
|
||||
static bool content_show_images = true;
|
||||
static const bool content_show_images = true;
|
||||
#endif
|
||||
static bool content_show_music = true;
|
||||
static const bool content_show_music = true;
|
||||
#if defined(HAVE_FFMPEG) || defined(HAVE_MPV)
|
||||
static bool content_show_video = true;
|
||||
static const bool content_show_video = true;
|
||||
#endif
|
||||
#ifdef HAVE_NETWORKING
|
||||
static bool content_show_netplay = true;
|
||||
#if defined(HAVE_NETWORKING)
|
||||
#if defined(_3DS)
|
||||
static const bool content_show_netplay = false;
|
||||
#else
|
||||
static const bool content_show_netplay = true;
|
||||
#endif
|
||||
static bool content_show_history = true;
|
||||
static bool content_show_add = true;
|
||||
static bool content_show_playlists = true;
|
||||
#endif
|
||||
static const bool content_show_history = true;
|
||||
static const bool content_show_add = true;
|
||||
static const bool content_show_playlists = true;
|
||||
|
||||
#ifdef HAVE_XMB
|
||||
static unsigned xmb_alpha_factor = 75;
|
||||
static unsigned menu_font_color_red = 255;
|
||||
static unsigned menu_font_color_green = 255;
|
||||
static unsigned menu_font_color_blue = 255;
|
||||
static unsigned xmb_menu_layout = 0;
|
||||
static unsigned xmb_icon_theme = XMB_ICON_THEME_MONOCHROME;
|
||||
static unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
|
||||
static const unsigned xmb_alpha_factor = 75;
|
||||
static const unsigned menu_font_color_red = 255;
|
||||
static const unsigned menu_font_color_green = 255;
|
||||
static const unsigned menu_font_color_blue = 255;
|
||||
#ifdef HAVE_ODROIDGO2
|
||||
static const unsigned xmb_menu_layout = 2;
|
||||
#else
|
||||
static const unsigned xmb_menu_layout = 0;
|
||||
#endif
|
||||
static const unsigned xmb_icon_theme = XMB_ICON_THEME_MONOCHROME;
|
||||
static const unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
|
||||
|
||||
#if defined(HAVE_LAKKA) || defined(__arm__) || defined(__PPC64__) || defined(__ppc64__) || defined(__powerpc64__) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__)
|
||||
#define DEFAULT_XMB_SHADOWS_ENABLE false
|
||||
@@ -539,13 +571,13 @@ static unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static float menu_framebuffer_opacity = 0.900;
|
||||
static const float menu_framebuffer_opacity = 0.900;
|
||||
|
||||
static float menu_wallpaper_opacity = 0.300;
|
||||
static const float menu_wallpaper_opacity = 0.300;
|
||||
|
||||
static float menu_footer_opacity = 1.000;
|
||||
static const float menu_footer_opacity = 1.000;
|
||||
|
||||
static float menu_header_opacity = 1.000;
|
||||
static const float menu_header_opacity = 1.000;
|
||||
|
||||
#if defined(HAVE_OPENGLES2) || (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
|
||||
#define DEFAULT_MENU_SHADER_PIPELINE 1
|
||||
@@ -557,18 +589,18 @@ static float menu_header_opacity = 1.000;
|
||||
|
||||
#define DEFAULT_RGUI_COLOR_THEME RGUI_THEME_CLASSIC_GREEN
|
||||
|
||||
static bool rgui_inline_thumbnails = false;
|
||||
static bool rgui_swap_thumbnails = false;
|
||||
static unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT;
|
||||
static unsigned rgui_thumbnail_delay = 0;
|
||||
static unsigned rgui_internal_upscale_level = RGUI_UPSCALE_NONE;
|
||||
static bool rgui_full_width_layout = true;
|
||||
static unsigned rgui_aspect = RGUI_ASPECT_RATIO_4_3;
|
||||
static unsigned rgui_aspect_lock = RGUI_ASPECT_RATIO_LOCK_NONE;
|
||||
static bool rgui_shadows = false;
|
||||
static unsigned rgui_particle_effect = RGUI_PARTICLE_EFFECT_NONE;
|
||||
static const bool rgui_inline_thumbnails = false;
|
||||
static const bool rgui_swap_thumbnails = false;
|
||||
static const unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT;
|
||||
static const unsigned rgui_thumbnail_delay = 0;
|
||||
static const unsigned rgui_internal_upscale_level = RGUI_UPSCALE_NONE;
|
||||
static const bool rgui_full_width_layout = true;
|
||||
static const unsigned rgui_aspect = RGUI_ASPECT_RATIO_4_3;
|
||||
static const unsigned rgui_aspect_lock = RGUI_ASPECT_RATIO_LOCK_NONE;
|
||||
static const bool rgui_shadows = false;
|
||||
static const unsigned rgui_particle_effect = RGUI_PARTICLE_EFFECT_NONE;
|
||||
#define DEFAULT_RGUI_PARTICLE_EFFECT_SPEED 1.0f
|
||||
static bool rgui_extended_ascii = false;
|
||||
static const bool rgui_extended_ascii = false;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
@@ -580,37 +612,37 @@ static bool rgui_extended_ascii = false;
|
||||
/* TODO/FIXME - this setting is thread-unsafe right now and can corrupt the stack - default to off */
|
||||
#define DEFAULT_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST false
|
||||
|
||||
static bool default_game_specific_options = true;
|
||||
static bool default_auto_overrides_enable = true;
|
||||
static bool default_auto_remaps_enable = true;
|
||||
static bool default_global_core_options = true;
|
||||
static bool default_auto_shaders_enable = true;
|
||||
static const bool default_game_specific_options = true;
|
||||
static const bool default_auto_overrides_enable = true;
|
||||
static const bool default_auto_remaps_enable = true;
|
||||
static const bool default_global_core_options = false;
|
||||
static const bool default_auto_shaders_enable = true;
|
||||
|
||||
static bool default_sort_savefiles_enable = false;
|
||||
static bool default_sort_savestates_enable = false;
|
||||
static const bool default_sort_savefiles_enable = false;
|
||||
static const bool default_sort_savestates_enable = false;
|
||||
|
||||
static bool default_savestates_in_content_dir = false;
|
||||
static bool default_savefiles_in_content_dir = false;
|
||||
static bool default_systemfiles_in_content_dir = false;
|
||||
static bool default_screenshots_in_content_dir = false;
|
||||
static const bool default_savestates_in_content_dir = false;
|
||||
static const bool default_savefiles_in_content_dir = false;
|
||||
static const bool default_systemfiles_in_content_dir = false;
|
||||
static const bool default_screenshots_in_content_dir = false;
|
||||
|
||||
#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360) || defined(DINGUX)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
|
||||
#elif defined(PS2) || defined(PSP)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
|
||||
#elif defined(VITA)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L1_R1_START_SELECT;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L1_R1_START_SELECT;
|
||||
#elif defined(SWITCH) || defined(ORBIS)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_START_SELECT;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_START_SELECT;
|
||||
#elif TARGET_OS_TV
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_DOWN_Y_L_R;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_DOWN_Y_L_R;
|
||||
#else
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_NONE;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_NONE;
|
||||
#endif
|
||||
|
||||
#if defined(VITA)
|
||||
static unsigned input_backtouch_enable = false;
|
||||
static unsigned input_backtouch_toggle = false;
|
||||
static const unsigned input_backtouch_enable = false;
|
||||
static const unsigned input_backtouch_toggle = false;
|
||||
#endif
|
||||
|
||||
#define DEFAULT_SHOW_PHYSICAL_INPUTS true
|
||||
@@ -717,7 +749,7 @@ static const bool audio_enable_menu_cancel = false;
|
||||
static const bool audio_enable_menu_notice = false;
|
||||
static const bool audio_enable_menu_bgm = false;
|
||||
|
||||
#ifdef HAVE_MENU_WIDGETS
|
||||
#ifdef HAVE_GFX_WIDGETS
|
||||
#define DEFAULT_MENU_ENABLE_WIDGETS true
|
||||
#else
|
||||
#define DEFAULT_MENU_ENABLE_WIDGETS false
|
||||
@@ -770,11 +802,16 @@ static const bool audio_enable_menu_bgm = false;
|
||||
|
||||
#ifdef HAVE_WASAPI
|
||||
/* WASAPI defaults */
|
||||
static const bool wasapi_exclusive_mode = true;
|
||||
static const bool wasapi_float_format = false;
|
||||
static const int wasapi_sh_buffer_length = -16; /* auto */
|
||||
#define DEFAULT_WASAPI_EXCLUSIVE_MODE true
|
||||
#define DEFAULT_WASAPI_FLOAT_FORMAT false
|
||||
/* auto */
|
||||
#define DEFAULT_WASAPI_SH_BUFFER_LENGTH -16
|
||||
#endif
|
||||
|
||||
/* Automatically mute audio when fast forward
|
||||
* is enabled */
|
||||
#define DEFAULT_AUDIO_FASTFORWARD_MUTE false
|
||||
|
||||
/* MISC */
|
||||
|
||||
/* Enables displaying the current frames per second. */
|
||||
@@ -856,7 +893,7 @@ static const int netplay_check_frames = 600;
|
||||
|
||||
static const bool netplay_use_mitm_server = false;
|
||||
|
||||
static const char *netplay_mitm_server = "nyc";
|
||||
#define DEFAULT_NETPLAY_MITM_SERVER "nyc"
|
||||
|
||||
#ifdef HAVE_NETWORKING
|
||||
static const unsigned netplay_share_digital = RARCH_NETPLAY_SHARE_DIGITAL_NO_PREFERENCE;
|
||||
@@ -883,6 +920,23 @@ static const bool savestate_auto_load = false;
|
||||
|
||||
static const bool savestate_thumbnail_enable = false;
|
||||
|
||||
/* When creating save (srm) files, compress
|
||||
* written data */
|
||||
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
#define DEFAULT_SAVE_FILE_COMPRESSION true
|
||||
#else
|
||||
#define DEFAULT_SAVE_FILE_COMPRESSION false
|
||||
#endif
|
||||
|
||||
/* When creating save state files, compress
|
||||
* written data */
|
||||
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
/* TODO/FIXME Apparently this is an issue on UWP for now, so disable it for now */
|
||||
#define DEFAULT_SAVESTATE_FILE_COMPRESSION false
|
||||
#else
|
||||
#define DEFAULT_SAVESTATE_FILE_COMPRESSION true
|
||||
#endif
|
||||
|
||||
/* Slowmotion ratio. */
|
||||
#define DEFAULT_SLOWMOTION_RATIO 3.0
|
||||
|
||||
@@ -896,10 +950,10 @@ static const bool savestate_thumbnail_enable = false;
|
||||
#define DEFAULT_RUN_AHEAD_FRAMES 1
|
||||
|
||||
/* When using the Run Ahead feature, use a secondary instance of the core. */
|
||||
static const bool run_ahead_secondary_instance = true;
|
||||
#define DEFAULT_RUN_AHEAD_SECONDARY_INSTANCE true
|
||||
|
||||
/* Hide warning messages when using the Run Ahead feature. */
|
||||
static const bool run_ahead_hide_warnings = false;
|
||||
#define DEFAULT_RUN_AHEAD_HIDE_WARNINGS false
|
||||
|
||||
/* Enable stdin/network command interface. */
|
||||
static const bool network_cmd_enable = false;
|
||||
@@ -908,10 +962,27 @@ static const bool stdin_cmd_enable = false;
|
||||
|
||||
static const uint16_t network_remote_base_port = 55400;
|
||||
|
||||
#if defined(ANDROID) || defined(IOS)
|
||||
static const bool network_on_demand_thumbnails = true;
|
||||
#define DEFAULT_NETWORK_BUILDBOT_AUTO_EXTRACT_ARCHIVE true
|
||||
#define DEFAULT_NETWORK_BUILDBOT_SHOW_EXPERIMENTAL_CORES false
|
||||
|
||||
/* Automatically create a backup whenever a core is
|
||||
* updated via the online updater
|
||||
* > Enable by default on all modern platforms with
|
||||
* online updater support */
|
||||
#if defined(HAVE_ONLINE_UPDATER) && (defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN32) || defined(OSX) || defined(ANDROID) || defined(IOS))
|
||||
#define DEFAULT_CORE_UPDATER_AUTO_BACKUP true
|
||||
#else
|
||||
static const bool network_on_demand_thumbnails = false;
|
||||
#define DEFAULT_CORE_UPDATER_AUTO_BACKUP false
|
||||
#endif
|
||||
/* Number of automatic core backups to retain
|
||||
* (oldest backup will be deleted when creating
|
||||
* a new one) */
|
||||
#define DEFAULT_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE 1
|
||||
|
||||
#if defined(ANDROID) || defined(IOS)
|
||||
#define DEFAULT_NETWORK_ON_DEMAND_THUMBNAILS true
|
||||
#else
|
||||
#define DEFAULT_NETWORK_ON_DEMAND_THUMBNAILS false
|
||||
#endif
|
||||
|
||||
/* Number of entries that will be kept in content history playlist file. */
|
||||
@@ -922,25 +993,32 @@ static const unsigned default_content_history_size = 200;
|
||||
static const int default_content_favorites_size = 200;
|
||||
|
||||
/* Sort all playlists (apart from histories) alphabetically */
|
||||
static const bool playlist_sort_alphabetical = true;
|
||||
#define DEFAULT_PLAYLIST_SORT_ALPHABETICAL true
|
||||
|
||||
/* File format to use when writing playlists to disk */
|
||||
static const bool playlist_use_old_format = false;
|
||||
#define DEFAULT_PLAYLIST_USE_OLD_FORMAT false
|
||||
|
||||
/* When creating/updating playlists, compress written data */
|
||||
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
#define DEFAULT_PLAYLIST_COMPRESSION true
|
||||
#else
|
||||
#define DEFAULT_PLAYLIST_COMPRESSION false
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
/* Specify when to display 'core name' inline on playlist entries */
|
||||
static const unsigned playlist_show_inline_core_name = PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV;
|
||||
#define DEFAULT_PLAYLIST_SHOW_INLINE_CORE_NAME PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV
|
||||
|
||||
/* Specifies which runtime record to use on playlist sublabels */
|
||||
static const unsigned playlist_sublabel_runtime_type = PLAYLIST_RUNTIME_PER_CORE;
|
||||
#define DEFAULT_PLAYLIST_SUBLABEL_RUNTIME_TYPE PLAYLIST_RUNTIME_PER_CORE
|
||||
|
||||
/* Specifies time/date display format for runtime 'last played' data */
|
||||
#define DEFAULT_PLAYLIST_SUBLABEL_LAST_PLAYED_STYLE PLAYLIST_LAST_PLAYED_STYLE_YMD_HMS
|
||||
|
||||
static const unsigned playlist_entry_remove_enable = PLAYLIST_ENTRY_REMOVE_ENABLE_ALL;
|
||||
#define DEFAULT_PLAYLIST_ENTRY_REMOVE_ENABLE PLAYLIST_ENTRY_REMOVE_ENABLE_ALL
|
||||
#endif
|
||||
|
||||
static const bool scan_without_core_match = false;
|
||||
#define DEFAULT_SCAN_WITHOUT_CORE_MATCH false
|
||||
|
||||
#ifdef __WINRT__
|
||||
/* Be paranoid about WinRT file I/O performance, and leave this disabled by
|
||||
@@ -950,14 +1028,23 @@ static const bool scan_without_core_match = false;
|
||||
#define DEFAULT_PLAYLIST_SHOW_SUBLABELS true
|
||||
#endif
|
||||
|
||||
static const bool playlist_fuzzy_archive_match = false;
|
||||
#define DEFAULT_PLAYLIST_FUZZY_ARCHIVE_MATCH false
|
||||
|
||||
/* Show Menu start-up screen on boot. */
|
||||
static const bool default_menu_show_start_screen = true;
|
||||
#define DEFAULT_MENU_SHOW_START_SCREEN true
|
||||
|
||||
/* Default scale factor for non-frambuffer-based menu
|
||||
* drivers and menu widgets */
|
||||
/* Default scale factor for non-frambuffer-based display
|
||||
* drivers and display widgets */
|
||||
#define DEFAULT_MENU_SCALE_FACTOR 1.0f
|
||||
/* Specifies whether display widgets should be scaled
|
||||
* automatically using the default menu scale factor */
|
||||
#define DEFAULT_MENU_WIDGET_SCALE_AUTO true
|
||||
/* Default scale factor for display widgets when widget
|
||||
* auto scaling is disabled (fullscreen mode) */
|
||||
#define DEFAULT_MENU_WIDGET_SCALE_FACTOR 1.0f
|
||||
/* Default scale factor for display widgets when widget
|
||||
* auto scaling is disabled (windowed mode) */
|
||||
#define DEFAULT_MENU_WIDGET_SCALE_FACTOR_WINDOWED 1.0f
|
||||
|
||||
/* Log level for the frontend */
|
||||
#define DEFAULT_FRONTEND_LOG_LEVEL 1
|
||||
@@ -977,11 +1064,11 @@ static const bool default_menu_show_start_screen = true;
|
||||
|
||||
/* Axis threshold (between 0.0 and 1.0)
|
||||
* How far an axis must be tilted to result in a button press. */
|
||||
static const float axis_threshold = 0.5f;
|
||||
#define DEFAULT_AXIS_THRESHOLD 0.5f
|
||||
|
||||
static const float analog_deadzone = 0.0f;
|
||||
#define DEFAULT_ANALOG_DEADZONE 0.0f
|
||||
|
||||
static const float analog_sensitivity = 1.0f;
|
||||
#define DEFAULT_ANALOG_SENSITIVITY 1.0f
|
||||
|
||||
/* Describes speed of which turbo-enabled buttons toggle. */
|
||||
static const unsigned turbo_period = 6;
|
||||
@@ -1007,14 +1094,17 @@ static const unsigned input_bind_timeout = 5;
|
||||
|
||||
static const unsigned input_bind_hold = 2;
|
||||
|
||||
static const unsigned menu_thumbnails_default = 3;
|
||||
#define DEFAULT_INPUT_HOTKEY_BLOCK_DELAY 5
|
||||
|
||||
static const unsigned gfx_thumbnails_default = 3;
|
||||
|
||||
static const unsigned menu_left_thumbnails_default = 0;
|
||||
|
||||
static const unsigned menu_thumbnail_upscale_threshold = 0;
|
||||
static const unsigned gfx_thumbnail_upscale_threshold = 0;
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
static const unsigned menu_timedate_style = MENU_TIMEDATE_STYLE_DM_HM;
|
||||
#define DEFAULT_MENU_TIMEDATE_STYLE MENU_TIMEDATE_STYLE_DDMM_HM
|
||||
#define DEFAULT_MENU_TIMEDATE_DATE_SEPARATOR MENU_TIMEDATE_DATE_SEPARATOR_HYPHEN
|
||||
#endif
|
||||
|
||||
static const bool xmb_vertical_thumbnails = false;
|
||||
@@ -1033,7 +1123,7 @@ static const bool ui_companion_enable = false;
|
||||
static const bool ui_companion_toggle = false;
|
||||
|
||||
/* Only init the WIMP UI for this session if this is enabled */
|
||||
static const bool desktop_menu_enable = true;
|
||||
#define DEFAULT_DESKTOP_MENU_ENABLE true
|
||||
|
||||
/* Keep track of how long each core+content has been running for over time */
|
||||
|
||||
@@ -1045,22 +1135,25 @@ static const bool desktop_menu_enable = true;
|
||||
#define DEFAULT_CONTENT_RUNTIME_LOG true
|
||||
#endif
|
||||
|
||||
/* Keep track of how long each content has been running for over time (ignores core) */
|
||||
static const bool content_runtime_log_aggregate = false;
|
||||
/* Keep track of how long each content has been running
|
||||
* for over time (ignores core) */
|
||||
#define DEFAULT_CONTENT_RUNTIME_LOG_AGGREGATE false
|
||||
|
||||
#define DEFAULT_UI_MENUBAR_ENABLE true
|
||||
|
||||
#if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__)
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
|
||||
static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
|
||||
#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2) || defined(DINGUX)
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
|
||||
static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
|
||||
#else
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
|
||||
static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
|
||||
#endif
|
||||
|
||||
/* MIDI */
|
||||
static const char *midi_input = "Off";
|
||||
static const char *midi_output = "Off";
|
||||
#define DEFAULT_MIDI_INPUT "Off"
|
||||
|
||||
#define DEFAULT_MIDI_OUTPUT "Off"
|
||||
|
||||
static const unsigned midi_volume = 100;
|
||||
|
||||
/* Only applies to Android 7.0 (API 24) and up */
|
||||
@@ -1086,100 +1179,100 @@ static const bool enable_device_vibration = false;
|
||||
#endif
|
||||
|
||||
#if defined(HAKCHI)
|
||||
static char buildbot_server_url[] = "http://hakchicloud.com/Libretro_Cores/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://hakchicloud.com/Libretro_Cores/"
|
||||
#elif defined(ANDROID)
|
||||
#if defined(ANDROID_ARM_V7)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/armeabi-v7a/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/armeabi-v7a/"
|
||||
#elif defined(ANDROID_ARM)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/armeabi/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/armeabi/"
|
||||
#elif defined(ANDROID_AARCH64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/arm64-v8a/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/arm64-v8a/"
|
||||
#elif defined(ANDROID_X86)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/x86/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/x86/"
|
||||
#elif defined(ANDROID_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/x86_64/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/x86_64/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL ""
|
||||
#endif
|
||||
#elif defined(__QNX__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/blackberry/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/blackberry/latest/"
|
||||
#elif defined(IOS)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/ios/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/apple/ios/latest/"
|
||||
#elif defined(OSX)
|
||||
#if defined(__x86_64__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/apple/osx/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__)
|
||||
static char buildbot_server_url[] = "http://bot.libretro.com/nightly/apple/osx/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://bot.libretro.com/nightly/apple/osx/x86/latest/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/"
|
||||
#endif
|
||||
#elif defined(_WIN32) && !defined(_XBOX)
|
||||
#if _MSC_VER >= 1910
|
||||
#ifndef __WINRT__
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86/latest/"
|
||||
#elif defined(__arm__) || defined(_M_ARM)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm/latest/"
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm64/latest/"
|
||||
#endif
|
||||
#else
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/"
|
||||
#elif defined(__arm__) || defined(_M_ARM)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/"
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm64/latest/"
|
||||
#endif
|
||||
#endif
|
||||
#elif _MSC_VER == 1600
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2010/x86/latest/"
|
||||
#endif
|
||||
#elif _MSC_VER == 1400
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2005/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2005/x86/latest/"
|
||||
#elif _MSC_VER == 1310
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2003/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2003/x86/latest/"
|
||||
#else
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows/x86/latest/"
|
||||
#endif
|
||||
#endif
|
||||
#elif defined(__linux__)
|
||||
#if defined(__x86_64__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/linux/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/linux/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/linux/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/linux/x86/latest/"
|
||||
#elif defined(__arm__) && __ARM_ARCH == 7 && defined(__ARM_PCS_VFP)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/linux/armhf/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/linux/armhf/latest/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL ""
|
||||
#endif
|
||||
#elif defined(WIIU)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/wiiu/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/nintendo/wiiu/latest/"
|
||||
#elif defined(HAVE_LIBNX)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/switch/libnx/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/nintendo/switch/libnx/latest/"
|
||||
#elif defined(__CELLOS_LV2__) && defined(DEX_BUILD)
|
||||
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/dex-ps3/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/dex-ps3/"
|
||||
#elif defined(__CELLOS_LV2__) && defined(CEX_BUILD)
|
||||
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/cex-ps3/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/cex-ps3/"
|
||||
#elif defined(__CELLOS_LV2__) && defined(ODE_BUILD)
|
||||
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/ode-ps3/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/ode-ps3/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL ""
|
||||
#endif
|
||||
|
||||
static char buildbot_assets_server_url[] = "http://buildbot.libretro.com/assets/";
|
||||
#define DEFAULT_BUILDBOT_ASSETS_SERVER_URL "http://buildbot.libretro.com/assets/"
|
||||
|
||||
static char default_discord_app_id[] = "475456035851599874";
|
||||
#define DEFAULT_DISCORD_APP_ID "475456035851599874"
|
||||
|
||||
#define DEFAULT_AI_SERVICE_SOURCE_LANG 0
|
||||
|
||||
|
||||
@@ -71,7 +71,11 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
{ true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#ifdef HAVE_LAKKA
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#else
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#endif
|
||||
{ true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
@@ -235,7 +239,11 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
{ true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#ifdef HAVE_LAKKA
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#else
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#endif
|
||||
{ true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
+466
-390
File diff suppressed because it is too large.
Load diff
+47
-23
@@ -53,6 +53,12 @@
|
||||
var = newvar; \
|
||||
}
|
||||
|
||||
#define configuration_set_string(settings, var, newvar) \
|
||||
{ \
|
||||
settings->modified = true; \
|
||||
strlcpy(var, newvar, sizeof(var)); \
|
||||
}
|
||||
|
||||
enum crt_switch_type
|
||||
{
|
||||
CRT_SWITCH_NONE = 0,
|
||||
@@ -85,6 +91,7 @@ typedef struct settings
|
||||
bool video_black_frame_insertion;
|
||||
bool video_vfilter;
|
||||
bool video_smooth;
|
||||
bool video_ctx_scaling;
|
||||
bool video_force_aspect;
|
||||
bool video_crop_overscan;
|
||||
bool video_aspect_ratio_auto;
|
||||
@@ -124,6 +131,7 @@ typedef struct settings
|
||||
bool audio_rate_control;
|
||||
bool audio_wasapi_exclusive_mode;
|
||||
bool audio_wasapi_float_format;
|
||||
bool audio_fastforward_mute;
|
||||
|
||||
/* Input */
|
||||
bool input_remap_binds_enable;
|
||||
@@ -136,7 +144,6 @@ typedef struct settings
|
||||
bool input_overlay_auto_rotate;
|
||||
bool input_descriptor_label_show;
|
||||
bool input_descriptor_hide_unbound;
|
||||
bool input_all_users_control_menu;
|
||||
bool input_menu_swap_ok_cancel_buttons;
|
||||
bool input_backtouch_enable;
|
||||
bool input_backtouch_toggle;
|
||||
@@ -151,9 +158,11 @@ typedef struct settings
|
||||
/* Menu */
|
||||
bool filter_by_current_core;
|
||||
bool menu_enable_widgets;
|
||||
bool menu_widget_scale_auto;
|
||||
bool menu_show_start_screen;
|
||||
bool menu_pause_libretro;
|
||||
bool menu_savestate_resume;
|
||||
bool menu_insert_disk_resume;
|
||||
bool menu_timedate_enable;
|
||||
bool menu_battery_level_enable;
|
||||
bool menu_core_enable;
|
||||
@@ -168,6 +177,7 @@ typedef struct settings
|
||||
bool menu_throttle_framerate;
|
||||
bool menu_linear_filter;
|
||||
bool menu_horizontal_animation;
|
||||
bool menu_scroll_fast;
|
||||
bool menu_show_online_updater;
|
||||
bool menu_show_core_updater;
|
||||
bool menu_show_load_core;
|
||||
@@ -189,6 +199,7 @@ typedef struct settings
|
||||
bool menu_show_video_layout;
|
||||
#endif
|
||||
bool menu_materialui_icons_enable;
|
||||
bool menu_materialui_show_nav_bar;
|
||||
bool menu_materialui_auto_rotate_nav_bar;
|
||||
bool menu_materialui_dual_thumbnail_list_view_enable;
|
||||
bool menu_materialui_thumbnail_background_enable;
|
||||
@@ -273,7 +284,9 @@ typedef struct settings
|
||||
|
||||
/* Network */
|
||||
bool network_buildbot_auto_extract_archive;
|
||||
bool network_buildbot_show_experimental_cores;
|
||||
bool network_on_demand_thumbnails;
|
||||
bool core_updater_auto_backup;
|
||||
|
||||
/* UI */
|
||||
bool ui_menubar_enable;
|
||||
@@ -288,9 +301,11 @@ typedef struct settings
|
||||
bool cheevos_test_unofficial;
|
||||
bool cheevos_hardcore_mode_enable;
|
||||
bool cheevos_leaderboards_enable;
|
||||
bool cheevos_richpresence_enable;
|
||||
bool cheevos_badges_enable;
|
||||
bool cheevos_verbose_enable;
|
||||
bool cheevos_auto_screenshot;
|
||||
bool cheevos_start_active;
|
||||
|
||||
/* Camera */
|
||||
bool camera_allow;
|
||||
@@ -332,6 +347,8 @@ typedef struct settings
|
||||
bool savestate_auto_save;
|
||||
bool savestate_auto_load;
|
||||
bool savestate_thumbnail_enable;
|
||||
bool save_file_compression;
|
||||
bool savestate_file_compression;
|
||||
bool network_cmd_enable;
|
||||
bool stdin_cmd_enable;
|
||||
bool keymapper_enable;
|
||||
@@ -360,12 +377,12 @@ typedef struct settings
|
||||
bool bluetooth_enable;
|
||||
bool localap_enable;
|
||||
|
||||
bool automatically_add_content_to_playlist;
|
||||
bool video_window_show_decorations;
|
||||
bool video_window_save_positions;
|
||||
|
||||
bool sustained_performance_mode;
|
||||
bool playlist_use_old_format;
|
||||
bool playlist_compression;
|
||||
bool content_runtime_log;
|
||||
bool content_runtime_log_aggregate;
|
||||
|
||||
@@ -378,6 +395,7 @@ typedef struct settings
|
||||
bool enable_device_vibration;
|
||||
bool ozone_collapse_sidebar;
|
||||
bool ozone_truncate_playlist_name;
|
||||
bool ozone_sort_after_truncate_playlist_name;
|
||||
bool ozone_scroll_content_metadata;
|
||||
|
||||
bool log_to_file;
|
||||
@@ -405,6 +423,8 @@ typedef struct settings
|
||||
float video_msg_bgcolor_opacity;
|
||||
|
||||
float menu_scale_factor;
|
||||
float menu_widget_scale_factor;
|
||||
float menu_widget_scale_factor_windowed;
|
||||
float menu_wallpaper_opacity;
|
||||
float menu_framebuffer_opacity;
|
||||
float menu_footer_opacity;
|
||||
@@ -418,6 +438,8 @@ typedef struct settings
|
||||
|
||||
float input_overlay_opacity;
|
||||
float input_overlay_scale;
|
||||
float input_overlay_center_x;
|
||||
float input_overlay_center_y;
|
||||
|
||||
float slowmotion_ratio;
|
||||
float fastforward_ratio;
|
||||
@@ -472,6 +494,7 @@ typedef struct settings
|
||||
#ifdef GEKKO
|
||||
unsigned input_mouse_scale;
|
||||
#endif
|
||||
unsigned input_hotkey_block_delay;
|
||||
unsigned input_menu_toggle_gamepad_combo;
|
||||
unsigned input_keyboard_gamepad_mapping_type;
|
||||
unsigned input_poll_type_behavior;
|
||||
@@ -527,9 +550,10 @@ typedef struct settings
|
||||
unsigned accessibility_narrator_speech_speed;
|
||||
|
||||
unsigned menu_timedate_style;
|
||||
unsigned menu_thumbnails;
|
||||
unsigned menu_timedate_date_separator;
|
||||
unsigned gfx_thumbnails;
|
||||
unsigned menu_left_thumbnails;
|
||||
unsigned menu_thumbnail_upscale_threshold;
|
||||
unsigned gfx_thumbnail_upscale_threshold;
|
||||
unsigned menu_rgui_thumbnail_downscaler;
|
||||
unsigned menu_rgui_thumbnail_delay;
|
||||
unsigned menu_rgui_color_theme;
|
||||
@@ -598,6 +622,8 @@ typedef struct settings
|
||||
unsigned ai_service_mode;
|
||||
unsigned ai_service_target_lang;
|
||||
unsigned ai_service_source_lang;
|
||||
|
||||
unsigned core_updater_auto_backup_history_size;
|
||||
} uints;
|
||||
|
||||
struct
|
||||
@@ -626,26 +652,23 @@ typedef struct settings
|
||||
char input_driver[32];
|
||||
char input_joypad_driver[32];
|
||||
char midi_driver[32];
|
||||
char midi_input[32];
|
||||
char midi_output[32];
|
||||
|
||||
char input_keyboard_layout[64];
|
||||
|
||||
char audio_device[255];
|
||||
char camera_device[255];
|
||||
char netplay_mitm_server[255];
|
||||
|
||||
char translation_service_url[2048];
|
||||
|
||||
char bundle_assets_src[PATH_MAX_LENGTH];
|
||||
char bundle_assets_dst[PATH_MAX_LENGTH];
|
||||
char bundle_assets_dst_subdir[PATH_MAX_LENGTH];
|
||||
|
||||
char netplay_mitm_server[255];
|
||||
|
||||
char midi_input[32];
|
||||
char midi_output[32];
|
||||
|
||||
char youtube_stream_key[PATH_MAX_LENGTH];
|
||||
char twitch_stream_key[PATH_MAX_LENGTH];
|
||||
|
||||
char discord_app_id[PATH_MAX_LENGTH];
|
||||
char translation_service_url[2048];
|
||||
char ai_service_url[PATH_MAX_LENGTH];
|
||||
} arrays;
|
||||
|
||||
@@ -654,12 +677,16 @@ typedef struct settings
|
||||
char placeholder;
|
||||
|
||||
char username[32];
|
||||
|
||||
char netplay_password[128];
|
||||
char netplay_spectate_password[128];
|
||||
|
||||
char netplay_server[255];
|
||||
char network_buildbot_url[255];
|
||||
char network_buildbot_assets_url[255];
|
||||
|
||||
char browse_url[4096];
|
||||
|
||||
char path_stream_url[8192];
|
||||
|
||||
char path_menu_xmb_font[PATH_MAX_LENGTH];
|
||||
@@ -809,14 +836,7 @@ const char *config_get_midi_driver_options(void);
|
||||
|
||||
const char *config_get_default_record(void);
|
||||
|
||||
/**
|
||||
* config_parse_file:
|
||||
*
|
||||
* Loads a config file and reads all the values into memory.
|
||||
*
|
||||
*/
|
||||
void config_parse_file(void *data);
|
||||
|
||||
#ifdef HAVE_CONFIGFILE
|
||||
/**
|
||||
* config_load_override:
|
||||
*
|
||||
@@ -827,7 +847,7 @@ void config_parse_file(void *data);
|
||||
* Returns: false if there was an error or no action was performed.
|
||||
*
|
||||
*/
|
||||
bool config_load_override(void);
|
||||
bool config_load_override(void *data);
|
||||
|
||||
/**
|
||||
* config_unload_override:
|
||||
@@ -847,7 +867,8 @@ bool config_unload_override(void);
|
||||
* Returns: false if there was an error or no action was performed.
|
||||
*
|
||||
*/
|
||||
bool config_load_remap(const char *directory_input_remapping);
|
||||
bool config_load_remap(const char *directory_input_remapping,
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* config_save_autoconf_profile:
|
||||
@@ -875,17 +896,20 @@ bool config_save_file(const char *path);
|
||||
*
|
||||
* Returns: true (1) on success, otherwise returns false (0).
|
||||
**/
|
||||
bool config_save_overrides(int override_type);
|
||||
bool config_save_overrides(enum override_type type, void *data);
|
||||
|
||||
/* Replaces currently loaded configuration file with
|
||||
* another one. Will load a dummy core to flush state
|
||||
* properly. */
|
||||
bool config_replace(bool config_save_on_exit, char *path);
|
||||
#endif
|
||||
|
||||
bool config_overlay_enable_default(void);
|
||||
|
||||
void config_set_defaults(void *data);
|
||||
|
||||
void config_load(void *data);
|
||||
|
||||
settings_t *config_get_ptr(void);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
@@ -43,7 +43,7 @@ typedef struct content_ctx_info
|
||||
bool content_load_ram_file(unsigned slot);
|
||||
|
||||
/* Save a RAM state from memory to disk. */
|
||||
bool content_save_ram_file(unsigned slot);
|
||||
bool content_save_ram_file(unsigned slot, bool compress);
|
||||
|
||||
/* Load a state from disk to memory. */
|
||||
bool content_load_state(const char* path, bool load_to_backup_buffer, bool autoload);
|
||||
@@ -51,6 +51,9 @@ bool content_load_state(const char* path, bool load_to_backup_buffer, bool autol
|
||||
/* Save a state from memory to disk. */
|
||||
bool content_save_state(const char *path, bool save_to_disk, bool autosave);
|
||||
|
||||
/* Returns true if a save state task is in progress */
|
||||
bool content_save_state_in_progress(void);
|
||||
|
||||
/* Copy a save state. */
|
||||
bool content_rename_state(const char *origin, const char *dest);
|
||||
|
||||
@@ -82,9 +85,6 @@ bool content_reset_savestate_backups(void);
|
||||
bool content_undo_load_buf_is_empty(void);
|
||||
bool content_undo_save_buf_is_empty(void);
|
||||
|
||||
/* Checks if launched from the commandline */
|
||||
bool content_launched_from_cli(void);
|
||||
|
||||
/* Clears the pending subsystem rom buffer */
|
||||
bool content_is_subsystem_pending_load(void);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "core_type.h"
|
||||
#include "input/input_defines.h"
|
||||
#include "disk_control_interface.h"
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
@@ -67,8 +68,8 @@ typedef struct rarch_system_info
|
||||
|
||||
bool supports_vfs;
|
||||
|
||||
struct retro_disk_control_callback disk_control_cb;
|
||||
struct retro_location_callback location_cb;
|
||||
disk_control_interface_t disk_control;
|
||||
struct retro_location_callback location_cb;
|
||||
|
||||
struct
|
||||
{
|
||||
|
||||
+764
@@ -0,0 +1,764 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2014-2017 - Jean-André Santoni
|
||||
* Copyright (C) 2016-2019 - Brad Parker
|
||||
* Copyright (C) 2019-2020 - James Leaver
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <string/stdstring.h>
|
||||
#include <lists/string_list.h>
|
||||
#include <file/file_path.h>
|
||||
#include <streams/interface_stream.h>
|
||||
#include <streams/file_stream.h>
|
||||
#include <lists/dir_list.h>
|
||||
#include <time/rtime.h>
|
||||
#include <retro_miscellaneous.h>
|
||||
|
||||
#include "frontend/frontend_driver.h"
|
||||
#include "file_path_special.h"
|
||||
#include "verbosity.h"
|
||||
|
||||
#include "core_backup.h"
|
||||
|
||||
/* Holds all entries in a core backup list */
|
||||
struct core_backup_list
|
||||
{
|
||||
size_t size;
|
||||
size_t capacity;
|
||||
core_backup_list_entry_t *entries;
|
||||
};
|
||||
|
||||
/*********************/
|
||||
/* Utility Functions */
|
||||
/*********************/
|
||||
|
||||
/* Generates backup directory path for specified core.
|
||||
* Returns false if 'core_path' and/or 'dir_core_assets'
|
||||
* are invalid, or a filesystem error occurs */
|
||||
static bool core_backup_get_backup_dir(
|
||||
const char *dir_libretro, const char *dir_core_assets,
|
||||
const char *core_filename,
|
||||
char *backup_dir, size_t len)
|
||||
{
|
||||
char *last_underscore = NULL;
|
||||
char core_file_id[PATH_MAX_LENGTH];
|
||||
char tmp[PATH_MAX_LENGTH];
|
||||
|
||||
core_file_id[0] = '\0';
|
||||
tmp[0] = '\0';
|
||||
|
||||
/* Extract core file 'ID' (name without extension + suffix)
|
||||
* from core path */
|
||||
if (string_is_empty(dir_libretro) ||
|
||||
string_is_empty(core_filename) ||
|
||||
(len < 1))
|
||||
return false;
|
||||
|
||||
strlcpy(core_file_id, core_filename, sizeof(core_file_id));
|
||||
|
||||
/* > Remove file extension */
|
||||
path_remove_extension(core_file_id);
|
||||
|
||||
if (string_is_empty(core_file_id))
|
||||
return false;
|
||||
|
||||
/* > Remove platform-specific file name suffix,
|
||||
* if required */
|
||||
last_underscore = strrchr(core_file_id, '_');
|
||||
|
||||
if (!string_is_empty(last_underscore))
|
||||
if (!string_is_equal(last_underscore, "_libretro"))
|
||||
*last_underscore = '\0';
|
||||
|
||||
if (string_is_empty(core_file_id))
|
||||
return false;
|
||||
|
||||
/* Get core backup directory
|
||||
* > If no assets directory is defined, use
|
||||
* core directory as a base */
|
||||
fill_pathname_join(tmp, string_is_empty(dir_core_assets) ?
|
||||
dir_libretro : dir_core_assets,
|
||||
"core_backups", sizeof(tmp));
|
||||
|
||||
fill_pathname_join(backup_dir, tmp,
|
||||
core_file_id, len);
|
||||
|
||||
if (string_is_empty(backup_dir))
|
||||
return false;
|
||||
|
||||
/* > Create directory, if required */
|
||||
if (!path_is_directory(backup_dir))
|
||||
{
|
||||
if (!path_mkdir(backup_dir))
|
||||
{
|
||||
RARCH_ERR("[core backup] Failed to create backup directory: %s.\n", backup_dir);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Generates a timestamped core backup file path from
|
||||
* the specified core path. Returns true if successful */
|
||||
bool core_backup_get_backup_path(
|
||||
const char *core_path, uint32_t crc, enum core_backup_mode backup_mode,
|
||||
const char *dir_core_assets, char *backup_path, size_t len)
|
||||
{
|
||||
int n;
|
||||
time_t current_time;
|
||||
struct tm time_info;
|
||||
const char *core_filename = NULL;
|
||||
char core_dir[PATH_MAX_LENGTH];
|
||||
char backup_dir[PATH_MAX_LENGTH];
|
||||
char backup_filename[PATH_MAX_LENGTH];
|
||||
|
||||
core_dir[0] = '\0';
|
||||
backup_dir[0] = '\0';
|
||||
backup_filename[0] = '\0';
|
||||
|
||||
/* Get core filename and parent directory */
|
||||
if (string_is_empty(core_path))
|
||||
return false;
|
||||
|
||||
core_filename = path_basename(core_path);
|
||||
|
||||
if (string_is_empty(core_filename))
|
||||
return false;
|
||||
|
||||
fill_pathname_parent_dir(core_dir, core_path, sizeof(core_dir));
|
||||
|
||||
if (string_is_empty(core_dir))
|
||||
return false;
|
||||
|
||||
/* Get backup directory */
|
||||
if (!core_backup_get_backup_dir(core_dir, dir_core_assets, core_filename,
|
||||
backup_dir, sizeof(backup_dir)))
|
||||
return false;
|
||||
|
||||
/* Get current time */
|
||||
time(¤t_time);
|
||||
rtime_localtime(¤t_time, &time_info);
|
||||
|
||||
/* Generate backup filename */
|
||||
n = snprintf(backup_filename, sizeof(backup_filename),
|
||||
"%s.%04u%02u%02uT%02u%02u%02u.%08x.%u%s",
|
||||
core_filename,
|
||||
(unsigned)time_info.tm_year + 1900,
|
||||
(unsigned)time_info.tm_mon + 1,
|
||||
(unsigned)time_info.tm_mday,
|
||||
(unsigned)time_info.tm_hour,
|
||||
(unsigned)time_info.tm_min,
|
||||
(unsigned)time_info.tm_sec,
|
||||
crc,
|
||||
(unsigned)backup_mode,
|
||||
file_path_str(FILE_PATH_CORE_BACKUP_EXTENSION));
|
||||
|
||||
if ((n < 0) || (n >= 128))
|
||||
n = 0; /* Silence GCC warnings... */
|
||||
|
||||
/* Build final path */
|
||||
fill_pathname_join(backup_path, backup_dir,
|
||||
backup_filename, len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns detected type of specified core backup file */
|
||||
enum core_backup_type core_backup_get_backup_type(const char *backup_path)
|
||||
{
|
||||
const char *backup_ext = NULL;
|
||||
struct string_list *metadata_list = NULL;
|
||||
char core_ext[255];
|
||||
|
||||
core_ext[0] = '\0';
|
||||
|
||||
if (string_is_empty(backup_path) || !path_is_valid(backup_path))
|
||||
goto error;
|
||||
|
||||
/* Get backup file extension */
|
||||
backup_ext = path_get_extension(backup_path);
|
||||
|
||||
if (string_is_empty(backup_ext))
|
||||
goto error;
|
||||
|
||||
/* Get platform-specific dynamic library extension */
|
||||
if (!frontend_driver_get_core_extension(core_ext, sizeof(core_ext)))
|
||||
goto error;
|
||||
|
||||
/* Check if this is an archived backup */
|
||||
if (string_is_equal_noncase(backup_ext,
|
||||
file_path_str(FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT)))
|
||||
{
|
||||
const char *backup_filename = NULL;
|
||||
const char *src_ext = NULL;
|
||||
|
||||
/* Split the backup filename into its various
|
||||
* metadata components */
|
||||
backup_filename = path_basename(backup_path);
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
goto error;
|
||||
|
||||
metadata_list = string_split(backup_filename, ".");
|
||||
|
||||
if (!metadata_list || (metadata_list->size != 6))
|
||||
goto error;
|
||||
|
||||
/* Get extension of source core file */
|
||||
src_ext = metadata_list->elems[1].data;
|
||||
|
||||
if (string_is_empty(src_ext))
|
||||
goto error;
|
||||
|
||||
/* Check whether extension is valid */
|
||||
if (!string_is_equal_noncase(src_ext, core_ext))
|
||||
goto error;
|
||||
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
|
||||
return CORE_BACKUP_TYPE_ARCHIVE;
|
||||
}
|
||||
|
||||
/* Check if this is a plain dynamic library file */
|
||||
if (string_is_equal_noncase(backup_ext, core_ext))
|
||||
return CORE_BACKUP_TYPE_LIB;
|
||||
|
||||
error:
|
||||
if (metadata_list)
|
||||
{
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
}
|
||||
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
}
|
||||
|
||||
/* Fetches crc value of specified core backup file.
|
||||
* Returns true if successful */
|
||||
bool core_backup_get_backup_crc(char *backup_path, uint32_t *crc)
|
||||
{
|
||||
struct string_list *metadata_list = NULL;
|
||||
enum core_backup_type backup_type;
|
||||
|
||||
if (string_is_empty(backup_path) || !crc)
|
||||
goto error;
|
||||
|
||||
/* Get backup type */
|
||||
backup_type = core_backup_get_backup_type(backup_path);
|
||||
|
||||
switch (backup_type)
|
||||
{
|
||||
case CORE_BACKUP_TYPE_ARCHIVE:
|
||||
{
|
||||
const char *backup_filename = NULL;
|
||||
const char *crc_str = NULL;
|
||||
|
||||
/* Split the backup filename into its various
|
||||
* metadata components */
|
||||
backup_filename = path_basename(backup_path);
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
goto error;
|
||||
|
||||
metadata_list = string_split(backup_filename, ".");
|
||||
|
||||
if (!metadata_list || (metadata_list->size != 6))
|
||||
goto error;
|
||||
|
||||
/* Get crc string */
|
||||
crc_str = metadata_list->elems[3].data;
|
||||
|
||||
if (string_is_empty(crc_str))
|
||||
goto error;
|
||||
|
||||
/* Convert to an integer */
|
||||
*crc = (uint32_t)string_hex_to_unsigned(crc_str);
|
||||
|
||||
if (*crc == 0)
|
||||
goto error;
|
||||
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case CORE_BACKUP_TYPE_LIB:
|
||||
{
|
||||
intfstream_t *backup_file = NULL;
|
||||
|
||||
/* This is a plain dynamic library file,
|
||||
* have to read file data to determine crc */
|
||||
|
||||
/* Open backup file */
|
||||
backup_file = intfstream_open_file(
|
||||
backup_path, RETRO_VFS_FILE_ACCESS_READ,
|
||||
RETRO_VFS_FILE_ACCESS_HINT_NONE);
|
||||
|
||||
if (backup_file)
|
||||
{
|
||||
bool success;
|
||||
|
||||
/* Get crc value */
|
||||
success = intfstream_get_crc(backup_file, crc);
|
||||
|
||||
/* Close backup file */
|
||||
intfstream_close(backup_file);
|
||||
free(backup_file);
|
||||
backup_file = NULL;
|
||||
|
||||
return success;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* Backup is invalid */
|
||||
break;
|
||||
}
|
||||
|
||||
error:
|
||||
if (metadata_list)
|
||||
{
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Fetches core path associated with specified core
|
||||
* backup file. Returns detected type of backup
|
||||
* file - CORE_BACKUP_TYPE_INVALID indicates that
|
||||
* backup file cannot be restored/installed, or
|
||||
* arguments are otherwise invalid */
|
||||
enum core_backup_type core_backup_get_core_path(
|
||||
const char *backup_path, const char *dir_libretro,
|
||||
char *core_path, size_t len)
|
||||
{
|
||||
const char *backup_filename = NULL;
|
||||
char *core_filename = NULL;
|
||||
enum core_backup_type backup_type = CORE_BACKUP_TYPE_INVALID;
|
||||
|
||||
if (string_is_empty(backup_path) || string_is_empty(dir_libretro))
|
||||
return backup_type;
|
||||
|
||||
backup_filename = path_basename(backup_path);
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
return backup_type;
|
||||
|
||||
/* Check backup type */
|
||||
switch (core_backup_get_backup_type(backup_path))
|
||||
{
|
||||
case CORE_BACKUP_TYPE_ARCHIVE:
|
||||
{
|
||||
char *period = NULL;
|
||||
|
||||
/* This is an archived backup with timestamp/crc
|
||||
* metadata in the filename */
|
||||
core_filename = strdup(backup_filename);
|
||||
|
||||
/* Find the location of the second period */
|
||||
period = strchr(core_filename, '.');
|
||||
if (!period || (*(++period) == '\0'))
|
||||
break;
|
||||
|
||||
period = strchr(period, '.');
|
||||
if (!period)
|
||||
break;
|
||||
|
||||
/* Trim everything after (and including) the
|
||||
* second period */
|
||||
*period = '\0';
|
||||
|
||||
if (string_is_empty(core_filename))
|
||||
break;
|
||||
|
||||
/* All good - build core path */
|
||||
fill_pathname_join(core_path, dir_libretro,
|
||||
core_filename, len);
|
||||
|
||||
backup_type = CORE_BACKUP_TYPE_ARCHIVE;
|
||||
}
|
||||
break;
|
||||
case CORE_BACKUP_TYPE_LIB:
|
||||
/* This is a plain dynamic library file */
|
||||
fill_pathname_join(core_path, dir_libretro,
|
||||
backup_filename, len);
|
||||
backup_type = CORE_BACKUP_TYPE_LIB;
|
||||
break;
|
||||
default:
|
||||
/* Backup is invalid */
|
||||
break;
|
||||
}
|
||||
|
||||
if (core_filename)
|
||||
{
|
||||
free(core_filename);
|
||||
core_filename = NULL;
|
||||
}
|
||||
|
||||
return backup_type;
|
||||
}
|
||||
|
||||
/*************************/
|
||||
/* Backup List Functions */
|
||||
/*************************/
|
||||
|
||||
/**************************************/
|
||||
/* Initialisation / De-Initialisation */
|
||||
/**************************************/
|
||||
|
||||
/* Parses backup file name and adds to backup list, if valid */
|
||||
static bool core_backup_add_entry(core_backup_list_t *backup_list,
|
||||
const char *core_filename, const char *backup_path)
|
||||
{
|
||||
char *backup_filename = NULL;
|
||||
core_backup_list_entry_t *entry = NULL;
|
||||
unsigned backup_mode = 0;
|
||||
|
||||
if (!backup_list ||
|
||||
string_is_empty(core_filename) ||
|
||||
string_is_empty(backup_path) ||
|
||||
(backup_list->size >= backup_list->capacity))
|
||||
goto error;
|
||||
|
||||
backup_filename = strdup(path_basename(backup_path));
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
goto error;
|
||||
|
||||
/* Ensure base backup filename matches core */
|
||||
if (!string_starts_with(backup_filename, core_filename))
|
||||
goto error;
|
||||
|
||||
/* Remove backup file extension */
|
||||
path_remove_extension(backup_filename);
|
||||
|
||||
/* Parse backup filename metadata
|
||||
* - <core_filename>.<timestamp>.<crc>.<backup_mode>
|
||||
* - timestamp: YYYYMMDDTHHMMSS */
|
||||
entry = &backup_list->entries[backup_list->size];
|
||||
|
||||
if (sscanf(backup_filename + strlen(core_filename),
|
||||
".%04u%02u%02uT%02u%02u%02u.%08x.%u",
|
||||
&entry->date.year, &entry->date.month, &entry->date.day,
|
||||
&entry->date.hour, &entry->date.minute, &entry->date.second,
|
||||
&entry->crc, &backup_mode) != 8)
|
||||
goto error;
|
||||
|
||||
entry->backup_mode = (enum core_backup_mode)backup_mode;
|
||||
|
||||
/* Cache backup path */
|
||||
entry->backup_path = strdup(backup_path);
|
||||
backup_list->size++;
|
||||
|
||||
free(backup_filename);
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
if (backup_filename)
|
||||
free(backup_filename);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Creates a new core backup list containing entries
|
||||
* for all existing backup files.
|
||||
* Returns a handle to a new core_backup_list_t object
|
||||
* on success, otherwise returns NULL. */
|
||||
core_backup_list_t *core_backup_list_init(
|
||||
const char *core_path, const char *dir_core_assets)
|
||||
{
|
||||
size_t i;
|
||||
const char *core_filename = NULL;
|
||||
struct string_list *dir_list = NULL;
|
||||
core_backup_list_t *backup_list = NULL;
|
||||
core_backup_list_entry_t *entries = NULL;
|
||||
char core_dir[PATH_MAX_LENGTH];
|
||||
char backup_dir[PATH_MAX_LENGTH];
|
||||
|
||||
core_dir[0] = '\0';
|
||||
backup_dir[0] = '\0';
|
||||
|
||||
/* Get core filename and parent directory */
|
||||
if (string_is_empty(core_path))
|
||||
goto error;
|
||||
|
||||
core_filename = path_basename(core_path);
|
||||
|
||||
if (string_is_empty(core_filename))
|
||||
goto error;
|
||||
|
||||
fill_pathname_parent_dir(core_dir, core_path, sizeof(core_dir));
|
||||
|
||||
if (string_is_empty(core_dir))
|
||||
goto error;
|
||||
|
||||
/* Get backup directory */
|
||||
if (!core_backup_get_backup_dir(core_dir, dir_core_assets, core_filename,
|
||||
backup_dir, sizeof(backup_dir)))
|
||||
goto error;
|
||||
|
||||
/* Get backup file list */
|
||||
dir_list = dir_list_new(
|
||||
backup_dir,
|
||||
file_path_str(FILE_PATH_CORE_BACKUP_EXTENSION),
|
||||
false, /* include_dirs */
|
||||
false, /* include_hidden */
|
||||
false, /* include_compressed */
|
||||
false /* recursive */
|
||||
);
|
||||
|
||||
/* Sanity check */
|
||||
if (!dir_list)
|
||||
goto error;
|
||||
|
||||
if (dir_list->size < 1)
|
||||
goto error;
|
||||
|
||||
/* Ensure list is sorted in alphabetical order
|
||||
* > This corresponds to 'timestamp' order */
|
||||
dir_list_sort(dir_list, true);
|
||||
|
||||
/* Create core backup list */
|
||||
backup_list = (core_backup_list_t*)calloc(1, sizeof(*backup_list));
|
||||
|
||||
if (!backup_list)
|
||||
goto error;
|
||||
|
||||
/* Create entries array
|
||||
* (Note: Set this to the full size of the directory
|
||||
* list - this may be larger than we need, but saves
|
||||
* many inefficiencies later) */
|
||||
entries = (core_backup_list_entry_t*)calloc(dir_list->size, sizeof(*entries));
|
||||
|
||||
if (!entries)
|
||||
goto error;
|
||||
|
||||
backup_list->entries = entries;
|
||||
backup_list->capacity = dir_list->size;
|
||||
backup_list->size = 0;
|
||||
|
||||
/* Loop over backup files and parse file names */
|
||||
for (i = 0; i < dir_list->size; i++)
|
||||
{
|
||||
const char *backup_path = dir_list->elems[i].data;
|
||||
core_backup_add_entry(backup_list, core_filename, backup_path);
|
||||
}
|
||||
|
||||
if (backup_list->size == 0)
|
||||
goto error;
|
||||
|
||||
string_list_free(dir_list);
|
||||
|
||||
return backup_list;
|
||||
|
||||
error:
|
||||
if (dir_list)
|
||||
string_list_free(dir_list);
|
||||
|
||||
if (backup_list)
|
||||
core_backup_list_free(backup_list);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Frees specified core backup list */
|
||||
void core_backup_list_free(core_backup_list_t *backup_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!backup_list)
|
||||
return;
|
||||
|
||||
if (backup_list->entries)
|
||||
{
|
||||
for (i = 0; i < backup_list->size; i++)
|
||||
{
|
||||
core_backup_list_entry_t *entry = &backup_list->entries[i];
|
||||
|
||||
if (!entry)
|
||||
continue;
|
||||
|
||||
if (entry->backup_path)
|
||||
{
|
||||
free(entry->backup_path);
|
||||
entry->backup_path = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(backup_list->entries);
|
||||
backup_list->entries = NULL;
|
||||
}
|
||||
|
||||
free(backup_list);
|
||||
}
|
||||
|
||||
/***********/
|
||||
/* Getters */
|
||||
/***********/
|
||||
|
||||
/* Returns number of entries in core backup list */
|
||||
size_t core_backup_list_size(core_backup_list_t *backup_list)
|
||||
{
|
||||
if (!backup_list)
|
||||
return 0;
|
||||
|
||||
return backup_list->size;
|
||||
}
|
||||
|
||||
/* Returns number of entries of specified 'backup mode'
|
||||
* (manual or automatic) in core backup list */
|
||||
size_t core_backup_list_get_num_backups(
|
||||
core_backup_list_t *backup_list,
|
||||
enum core_backup_mode backup_mode)
|
||||
{
|
||||
size_t i;
|
||||
size_t num_backups = 0;
|
||||
|
||||
if (!backup_list || !backup_list->entries)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < backup_list->size; i++)
|
||||
{
|
||||
core_backup_list_entry_t *current_entry = &backup_list->entries[i];
|
||||
|
||||
if (current_entry &&
|
||||
(current_entry->backup_mode == backup_mode))
|
||||
num_backups++;
|
||||
}
|
||||
|
||||
return num_backups;
|
||||
}
|
||||
|
||||
/* Fetches core backup list entry corresponding
|
||||
* to the specified entry index.
|
||||
* Returns false if index is invalid. */
|
||||
bool core_backup_list_get_index(
|
||||
core_backup_list_t *backup_list,
|
||||
size_t idx,
|
||||
const core_backup_list_entry_t **entry)
|
||||
{
|
||||
if (!backup_list || !backup_list->entries || !entry)
|
||||
return false;
|
||||
|
||||
if (idx >= backup_list->size)
|
||||
return false;
|
||||
|
||||
*entry = &backup_list->entries[idx];
|
||||
|
||||
if (*entry)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Fetches core backup list entry corresponding
|
||||
* to the specified core crc checksum value.
|
||||
* Note that 'manual' and 'auto' backups are
|
||||
* considered independent - we only compare
|
||||
* crc values for the specified backup_mode.
|
||||
* Returns false if entry is not found. */
|
||||
bool core_backup_list_get_crc(
|
||||
core_backup_list_t *backup_list,
|
||||
uint32_t crc, enum core_backup_mode backup_mode,
|
||||
const core_backup_list_entry_t **entry)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!backup_list || !backup_list->entries || !entry)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < backup_list->size; i++)
|
||||
{
|
||||
core_backup_list_entry_t *current_entry = &backup_list->entries[i];
|
||||
|
||||
if (current_entry &&
|
||||
(current_entry->crc == crc) &&
|
||||
(current_entry->backup_mode == backup_mode))
|
||||
{
|
||||
*entry = current_entry;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Fetches a string representation of a backup
|
||||
* list entry timestamp.
|
||||
* Returns false in the event of an error */
|
||||
bool core_backup_list_get_entry_timestamp_str(
|
||||
const core_backup_list_entry_t *entry,
|
||||
enum core_backup_date_separator_type date_separator,
|
||||
char *timestamp, size_t len)
|
||||
{
|
||||
int n;
|
||||
const char *format_str = "";
|
||||
|
||||
if (!entry || (len < 20))
|
||||
return false;
|
||||
|
||||
/* Get time format string */
|
||||
switch (date_separator)
|
||||
{
|
||||
case CORE_BACKUP_DATE_SEPARATOR_SLASH:
|
||||
format_str = "%04u/%02u/%02u %02u:%02u:%02u";
|
||||
break;
|
||||
case CORE_BACKUP_DATE_SEPARATOR_PERIOD:
|
||||
format_str = "%04u.%02u.%02u %02u:%02u:%02u";
|
||||
break;
|
||||
default:
|
||||
format_str = "%04u-%02u-%02u %02u:%02u:%02u";
|
||||
break;
|
||||
}
|
||||
|
||||
n = snprintf(timestamp, len,
|
||||
format_str,
|
||||
entry->date.year,
|
||||
entry->date.month,
|
||||
entry->date.day,
|
||||
entry->date.hour,
|
||||
entry->date.minute,
|
||||
entry->date.second);
|
||||
|
||||
if ((n < 0) || (n >= 32))
|
||||
n = 0; /* Silence GCC warnings... */
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Fetches a string representation of a backup
|
||||
* list entry crc value.
|
||||
* Returns false in the event of an error */
|
||||
bool core_backup_list_get_entry_crc_str(
|
||||
const core_backup_list_entry_t *entry,
|
||||
char *crc, size_t len)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (!entry || (len < 9))
|
||||
return false;
|
||||
|
||||
n = snprintf(crc, len, "%08x", entry->crc);
|
||||
|
||||
if ((n < 0) || (n >= 32))
|
||||
n = 0; /* Silence GCC warnings... */
|
||||
|
||||
return true;
|
||||
}
|
||||
+177
@@ -0,0 +1,177 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2014-2017 - Jean-André Santoni
|
||||
* Copyright (C) 2016-2019 - Brad Parker
|
||||
* Copyright (C) 2019-2020 - James Leaver
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __CORE_BACKUP_H
|
||||
#define __CORE_BACKUP_H
|
||||
|
||||
#include <retro_common_api.h>
|
||||
#include <libretro.h>
|
||||
|
||||
#include <boolean.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
/* Defines the various types of supported core backup
|
||||
* file. Allows us to handle manual core installs
|
||||
* (via downloaded/compiled dynamic libraries dropped
|
||||
* in the 'downloads' folder) using the same task
|
||||
* interface as 'managed'/archived backups */
|
||||
enum core_backup_type
|
||||
{
|
||||
CORE_BACKUP_TYPE_INVALID = 0,
|
||||
CORE_BACKUP_TYPE_ARCHIVE,
|
||||
CORE_BACKUP_TYPE_LIB
|
||||
};
|
||||
|
||||
/* Used to distinguish manual and automatic
|
||||
* core backups */
|
||||
enum core_backup_mode
|
||||
{
|
||||
CORE_BACKUP_MODE_MANUAL = 0,
|
||||
CORE_BACKUP_MODE_AUTO
|
||||
};
|
||||
|
||||
/* Note: These must be kept synchronised with
|
||||
* 'enum menu_timedate_date_separator_type' in
|
||||
* 'menu_defines.h' */
|
||||
enum core_backup_date_separator_type
|
||||
{
|
||||
CORE_BACKUP_DATE_SEPARATOR_HYPHEN = 0,
|
||||
CORE_BACKUP_DATE_SEPARATOR_SLASH,
|
||||
CORE_BACKUP_DATE_SEPARATOR_PERIOD,
|
||||
CORE_BACKUP_DATE_SEPARATOR_LAST
|
||||
};
|
||||
|
||||
/* Holds all timestamp info for a core backup file */
|
||||
typedef struct
|
||||
{
|
||||
unsigned year;
|
||||
unsigned month;
|
||||
unsigned day;
|
||||
unsigned hour;
|
||||
unsigned minute;
|
||||
unsigned second;
|
||||
} core_backup_list_date_t;
|
||||
|
||||
/* Holds all info related to a core backup file */
|
||||
typedef struct
|
||||
{
|
||||
char *backup_path;
|
||||
core_backup_list_date_t date;
|
||||
uint32_t crc;
|
||||
enum core_backup_mode backup_mode;
|
||||
} core_backup_list_entry_t;
|
||||
|
||||
/* Prevent direct access to core_backup_list_t
|
||||
* members */
|
||||
typedef struct core_backup_list core_backup_list_t;
|
||||
|
||||
/*********************/
|
||||
/* Utility Functions */
|
||||
/*********************/
|
||||
|
||||
/* Generates a timestamped core backup file path from
|
||||
* the specified core path. Returns true if successful */
|
||||
bool core_backup_get_backup_path(
|
||||
const char *core_path, uint32_t crc, enum core_backup_mode backup_mode,
|
||||
const char *dir_core_assets, char *backup_path, size_t len);
|
||||
|
||||
/* Returns detected type of specified core backup file */
|
||||
enum core_backup_type core_backup_get_backup_type(const char *backup_path);
|
||||
|
||||
/* Fetches crc value of specified core backup file.
|
||||
* Returns true if successful */
|
||||
bool core_backup_get_backup_crc(char *backup_path, uint32_t *crc);
|
||||
|
||||
/* Fetches core path associated with specified core
|
||||
* backup file. Returns detected type of backup
|
||||
* file - CORE_BACKUP_TYPE_INVALID indicates that
|
||||
* backup file cannot be restored/installed, or
|
||||
* arguments are otherwise invalid */
|
||||
enum core_backup_type core_backup_get_core_path(
|
||||
const char *backup_path, const char *dir_libretro,
|
||||
char *core_path, size_t len);
|
||||
|
||||
/*************************/
|
||||
/* Backup List Functions */
|
||||
/*************************/
|
||||
|
||||
/**************************************/
|
||||
/* Initialisation / De-Initialisation */
|
||||
/**************************************/
|
||||
|
||||
/* Creates a new core backup list containing entries
|
||||
* for all existing backup files.
|
||||
* Returns a handle to a new core_backup_list_t object
|
||||
* on success, otherwise returns NULL. */
|
||||
core_backup_list_t *core_backup_list_init(
|
||||
const char *core_path, const char *dir_core_assets);
|
||||
|
||||
/* Frees specified core backup list */
|
||||
void core_backup_list_free(core_backup_list_t *backup_list);
|
||||
|
||||
/***********/
|
||||
/* Getters */
|
||||
/***********/
|
||||
|
||||
/* Returns number of entries in core backup list */
|
||||
size_t core_backup_list_size(core_backup_list_t *backup_list);
|
||||
|
||||
/* Returns number of entries of specified 'backup mode'
|
||||
* (manual or automatic) in core backup list */
|
||||
size_t core_backup_list_get_num_backups(
|
||||
core_backup_list_t *backup_list,
|
||||
enum core_backup_mode backup_mode);
|
||||
|
||||
/* Fetches core backup list entry corresponding
|
||||
* to the specified entry index.
|
||||
* Returns false if index is invalid. */
|
||||
bool core_backup_list_get_index(
|
||||
core_backup_list_t *backup_list,
|
||||
size_t idx,
|
||||
const core_backup_list_entry_t **entry);
|
||||
|
||||
/* Fetches core backup list entry corresponding
|
||||
* to the specified core crc checksum value.
|
||||
* Note that 'manual' and 'auto' backups are
|
||||
* considered independent - we only compare
|
||||
* crc values for the specified backup_mode.
|
||||
* Returns false if entry is not found. */
|
||||
bool core_backup_list_get_crc(
|
||||
core_backup_list_t *backup_list,
|
||||
uint32_t crc, enum core_backup_mode backup_mode,
|
||||
const core_backup_list_entry_t **entry);
|
||||
|
||||
/* Fetches a string representation of a backup
|
||||
* list entry timestamp.
|
||||
* Returns false in the event of an error */
|
||||
bool core_backup_list_get_entry_timestamp_str(
|
||||
const core_backup_list_entry_t *entry,
|
||||
enum core_backup_date_separator_type date_separator,
|
||||
char *timestamp, size_t len);
|
||||
|
||||
/* Fetches a string representation of a backup
|
||||
* list entry crc value.
|
||||
* Returns false in the event of an error */
|
||||
bool core_backup_list_get_entry_crc_str(
|
||||
const core_backup_list_entry_t *entry,
|
||||
char *crc, size_t len);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
+496
-130
@@ -19,16 +19,15 @@
|
||||
#include <string/stdstring.h>
|
||||
#include <file/config_file.h>
|
||||
#include <file/file_path.h>
|
||||
#include <streams/file_stream.h>
|
||||
#include <lists/dir_list.h>
|
||||
#include <file/archive_file.h>
|
||||
#include <streams/file_stream.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "retroarch.h"
|
||||
#include "verbosity.h"
|
||||
|
||||
#include "core_info.h"
|
||||
#include "file_path_special.h"
|
||||
@@ -37,16 +36,9 @@
|
||||
#include "uwp/uwp_func.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_COMPRESSION
|
||||
static const struct string_list *core_info_tmp_list = NULL;
|
||||
#endif
|
||||
static const char *core_info_tmp_path = NULL;
|
||||
static core_info_t *core_info_current = NULL;
|
||||
static core_info_list_t *core_info_curr_list = NULL;
|
||||
|
||||
enum compare_op
|
||||
{
|
||||
COMPARE_OP_EQUAL,
|
||||
COMPARE_OP_EQUAL = 0,
|
||||
COMPARE_OP_NOT_EQUAL,
|
||||
COMPARE_OP_LESS,
|
||||
COMPARE_OP_LESS_EQUAL,
|
||||
@@ -130,15 +122,17 @@ static void core_info_list_resolve_all_firmware(
|
||||
snprintf(desc_key, sizeof(desc_key), "firmware%u_desc", c);
|
||||
snprintf(opt_key, sizeof(opt_key), "firmware%u_opt", c);
|
||||
|
||||
if (config_get_string(config, path_key, &tmp) && !string_is_empty(tmp))
|
||||
if (config_get_string(config, path_key, &tmp))
|
||||
{
|
||||
info->firmware[c].path = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
info->firmware[c].path = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
if (config_get_string(config, desc_key, &tmp) && !string_is_empty(tmp))
|
||||
if (config_get_string(config, desc_key, &tmp))
|
||||
{
|
||||
info->firmware[c].desc = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
info->firmware[c].desc = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
@@ -177,6 +171,7 @@ static void core_info_list_free(core_info_list_t *core_info_list)
|
||||
free(info->databases);
|
||||
free(info->notes);
|
||||
free(info->required_hw_api);
|
||||
free(info->description);
|
||||
string_list_free(info->supported_extensions_list);
|
||||
string_list_free(info->authors_list);
|
||||
string_list_free(info->note_list);
|
||||
@@ -193,6 +188,8 @@ static void core_info_list_free(core_info_list_t *core_info_list)
|
||||
free(info->firmware[j].desc);
|
||||
}
|
||||
free(info->firmware);
|
||||
|
||||
free(info->core_file_id.str);
|
||||
}
|
||||
|
||||
free(core_info_list->all_ext);
|
||||
@@ -220,7 +217,7 @@ static config_file_t *core_info_list_iterate(
|
||||
current_path,
|
||||
info_path_base_size);
|
||||
|
||||
#if defined(RARCH_MOBILE) || (defined(RARCH_CONSOLE) && !defined(PSP) && !defined(_3DS) && !defined(VITA) && !defined(PS2) && !defined(HW_WUP))
|
||||
#if defined(RARCH_MOBILE) || (defined(RARCH_CONSOLE) && !defined(PSP) && !defined(_3DS) && !defined(VITA) && !defined(HW_WUP))
|
||||
{
|
||||
char *substr = strrchr(info_path_base, '_');
|
||||
if (substr)
|
||||
@@ -244,6 +241,36 @@ static config_file_t *core_info_list_iterate(
|
||||
return conf;
|
||||
}
|
||||
|
||||
/* Returned path must be free()'d */
|
||||
static char *core_info_get_core_lock_file_path(const char *core_path)
|
||||
{
|
||||
char *lock_file_path = NULL;
|
||||
const char *lock_file_ext = file_path_str(FILE_PATH_LOCK_EXTENSION);
|
||||
size_t len;
|
||||
|
||||
if (string_is_empty(core_path))
|
||||
return NULL;
|
||||
|
||||
/* Note: We follow the common 'core_info' trend of
|
||||
* allocating all strings dynamically... */
|
||||
|
||||
/* Get path length */
|
||||
len = (strlen(core_path) + strlen(lock_file_ext) + 1) * sizeof(char);
|
||||
|
||||
/* Allocate string */
|
||||
lock_file_path = (char*)malloc(len);
|
||||
if (!lock_file_path)
|
||||
return NULL;
|
||||
|
||||
lock_file_path[0] = '\0';
|
||||
|
||||
/* Lock file is just core path + 'lock' extension */
|
||||
strlcpy(lock_file_path, core_path, len);
|
||||
strlcat(lock_file_path, lock_file_ext, len);
|
||||
|
||||
return lock_file_path;
|
||||
}
|
||||
|
||||
static core_info_list_t *core_info_list_new(const char *path,
|
||||
const char *libretro_info_dir,
|
||||
const char *exts,
|
||||
@@ -305,48 +332,48 @@ static core_info_list_t *core_info_list_new(const char *path,
|
||||
{
|
||||
char *tmp = NULL;
|
||||
|
||||
if (config_get_string(conf, "display_name", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "display_name", &tmp))
|
||||
{
|
||||
core_info[i].display_name = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].display_name = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
if (config_get_string(conf, "display_version", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "display_version", &tmp))
|
||||
{
|
||||
core_info[i].display_version = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].display_version = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
if (config_get_string(conf, "corename", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "corename", &tmp))
|
||||
{
|
||||
core_info[i].core_name = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].core_name = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "systemname", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "systemname", &tmp))
|
||||
{
|
||||
core_info[i].systemname = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].systemname = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "systemid", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "systemid", &tmp))
|
||||
{
|
||||
core_info[i].system_id = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].system_id = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "manufacturer", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "manufacturer", &tmp))
|
||||
{
|
||||
core_info[i].system_manufacturer = strdup(tmp);
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].system_manufacturer = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
@@ -357,92 +384,116 @@ static core_info_list_t *core_info_list_new(const char *path,
|
||||
core_info[i].firmware_count = count;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "supported_extensions", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "supported_extensions", &tmp))
|
||||
{
|
||||
core_info[i].supported_extensions = strdup(tmp);
|
||||
core_info[i].supported_extensions_list =
|
||||
string_split(core_info[i].supported_extensions, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].supported_extensions = strdup(tmp);
|
||||
core_info[i].supported_extensions_list =
|
||||
string_split(core_info[i].supported_extensions, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "authors", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "authors", &tmp))
|
||||
{
|
||||
core_info[i].authors = strdup(tmp);
|
||||
core_info[i].authors_list =
|
||||
string_split(core_info[i].authors, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].authors = strdup(tmp);
|
||||
core_info[i].authors_list =
|
||||
string_split(core_info[i].authors, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "permissions", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "permissions", &tmp))
|
||||
{
|
||||
core_info[i].permissions = strdup(tmp);
|
||||
core_info[i].permissions_list =
|
||||
string_split(core_info[i].permissions, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].permissions = strdup(tmp);
|
||||
core_info[i].permissions_list =
|
||||
string_split(core_info[i].permissions, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "license", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "license", &tmp))
|
||||
{
|
||||
core_info[i].licenses = strdup(tmp);
|
||||
core_info[i].licenses_list =
|
||||
string_split(core_info[i].licenses, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].licenses = strdup(tmp);
|
||||
core_info[i].licenses_list =
|
||||
string_split(core_info[i].licenses, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "categories", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "categories", &tmp))
|
||||
{
|
||||
core_info[i].categories = strdup(tmp);
|
||||
core_info[i].categories_list =
|
||||
string_split(core_info[i].categories, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].categories = strdup(tmp);
|
||||
core_info[i].categories_list =
|
||||
string_split(core_info[i].categories, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "database", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "database", &tmp))
|
||||
{
|
||||
core_info[i].databases = strdup(tmp);
|
||||
core_info[i].databases_list =
|
||||
string_split(core_info[i].databases, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].databases = strdup(tmp);
|
||||
core_info[i].databases_list =
|
||||
string_split(core_info[i].databases, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "notes", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "notes", &tmp))
|
||||
{
|
||||
core_info[i].notes = strdup(tmp);
|
||||
core_info[i].note_list = string_split(core_info[i].notes, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].notes = strdup(tmp);
|
||||
core_info[i].note_list = string_split(core_info[i].notes, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "required_hw_api", &tmp)
|
||||
&& !string_is_empty(tmp))
|
||||
if (config_get_string(conf, "required_hw_api", &tmp))
|
||||
{
|
||||
core_info[i].required_hw_api = strdup(tmp);
|
||||
core_info[i].required_hw_api_list = string_split(core_info[i].required_hw_api, "|");
|
||||
if (!string_is_empty(tmp))
|
||||
{
|
||||
core_info[i].required_hw_api = strdup(tmp);
|
||||
core_info[i].required_hw_api_list = string_split(core_info[i].required_hw_api, "|");
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (config_get_string(conf, "description", &tmp))
|
||||
{
|
||||
if (!string_is_empty(tmp))
|
||||
core_info[i].description = strdup(tmp);
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
if (tmp)
|
||||
free(tmp);
|
||||
tmp = NULL;
|
||||
@@ -456,17 +507,56 @@ static core_info_list_t *core_info_list_new(const char *path,
|
||||
if (config_get_bool(conf, "database_match_archive_member",
|
||||
&tmp_bool))
|
||||
core_info[i].database_match_archive_member = tmp_bool;
|
||||
|
||||
if (config_get_bool(conf, "is_experimental",
|
||||
&tmp_bool))
|
||||
core_info[i].is_experimental = tmp_bool;
|
||||
}
|
||||
|
||||
core_info[i].config_data = conf;
|
||||
}
|
||||
|
||||
if (!string_is_empty(base_path))
|
||||
{
|
||||
const char *core_filename = path_basename(base_path);
|
||||
|
||||
/* Cache core path */
|
||||
core_info[i].path = strdup(base_path);
|
||||
|
||||
if (!core_info[i].display_name)
|
||||
core_info[i].display_name =
|
||||
strdup(path_basename(core_info[i].path));
|
||||
/* Cache core file 'id'
|
||||
* > Filename without extension or platform-specific suffix */
|
||||
if (!string_is_empty(core_filename))
|
||||
{
|
||||
char *core_file_id = strdup(core_filename);
|
||||
path_remove_extension(core_file_id);
|
||||
|
||||
if (!string_is_empty(core_file_id))
|
||||
{
|
||||
#if defined(RARCH_MOBILE) || (defined(RARCH_CONSOLE) && !defined(PSP) && !defined(_3DS) && !defined(VITA) && !defined(HW_WUP))
|
||||
char *last_underscore = strrchr(core_file_id, '_');
|
||||
if (last_underscore)
|
||||
*last_underscore = '\0';
|
||||
#endif
|
||||
core_info[i].core_file_id.str = core_file_id;
|
||||
core_info[i].core_file_id.len = strlen(core_file_id);
|
||||
|
||||
core_file_id = NULL;
|
||||
}
|
||||
|
||||
if (core_file_id)
|
||||
{
|
||||
free(core_file_id);
|
||||
core_file_id = NULL;
|
||||
}
|
||||
|
||||
/* Get fallback display name, if required */
|
||||
if (!core_info[i].display_name)
|
||||
core_info[i].display_name = strdup(core_filename);
|
||||
}
|
||||
}
|
||||
|
||||
/* Get core lock status */
|
||||
core_info[i].is_locked = core_info_get_core_lock(core_info[i].path, false);
|
||||
}
|
||||
|
||||
if (core_info_list)
|
||||
@@ -487,7 +577,13 @@ bool core_info_list_get_info(core_info_list_t *core_info_list,
|
||||
core_info_t *out_info, const char *path)
|
||||
{
|
||||
size_t i;
|
||||
if (!core_info_list || !out_info)
|
||||
const char *core_filename = NULL;
|
||||
|
||||
if (!core_info_list || !out_info || string_is_empty(path))
|
||||
return false;
|
||||
|
||||
core_filename = path_basename(path);
|
||||
if (string_is_empty(core_filename))
|
||||
return false;
|
||||
|
||||
memset(out_info, 0, sizeof(*out_info));
|
||||
@@ -496,8 +592,10 @@ bool core_info_list_get_info(core_info_list_t *core_info_list,
|
||||
{
|
||||
const core_info_t *info = &core_info_list->list[i];
|
||||
|
||||
if (string_is_equal(path_basename(info->path),
|
||||
path_basename(path)))
|
||||
if (!info || (info->core_file_id.len == 0))
|
||||
continue;
|
||||
|
||||
if (!strncmp(info->core_file_id.str, core_filename, info->core_file_id.len))
|
||||
{
|
||||
*out_info = *info;
|
||||
return true;
|
||||
@@ -539,15 +637,18 @@ static bool core_info_does_support_file(
|
||||
|
||||
static int core_info_qsort_cmp(const void *a_, const void *b_)
|
||||
{
|
||||
const core_info_t *a = (const core_info_t*)a_;
|
||||
const core_info_t *b = (const core_info_t*)b_;
|
||||
int support_a = core_info_does_support_file(a, core_info_tmp_path);
|
||||
int support_b = core_info_does_support_file(b, core_info_tmp_path);
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
const core_info_t *a = (const core_info_t*)a_;
|
||||
const core_info_t *b = (const core_info_t*)b_;
|
||||
int support_a = core_info_does_support_file(a,
|
||||
p_coreinfo->tmp_path);
|
||||
int support_b = core_info_does_support_file(b,
|
||||
p_coreinfo->tmp_path);
|
||||
#ifdef HAVE_COMPRESSION
|
||||
support_a = support_a ||
|
||||
core_info_does_support_any_file(a, core_info_tmp_list);
|
||||
core_info_does_support_any_file(a, p_coreinfo->tmp_list);
|
||||
support_b = support_b ||
|
||||
core_info_does_support_any_file(b, core_info_tmp_list);
|
||||
core_info_does_support_any_file(b, p_coreinfo->tmp_list);
|
||||
#endif
|
||||
|
||||
if (support_a != support_b)
|
||||
@@ -560,15 +661,23 @@ static core_info_t *core_info_find_internal(
|
||||
const char *core)
|
||||
{
|
||||
size_t i;
|
||||
const char *core_path_basename = path_basename(core);
|
||||
const char *core_filename = NULL;
|
||||
|
||||
if (!list || string_is_empty(core))
|
||||
return NULL;
|
||||
|
||||
core_filename = path_basename(core);
|
||||
if (string_is_empty(core_filename))
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < list->count; i++)
|
||||
{
|
||||
core_info_t *info = core_info_get(list, i);
|
||||
|
||||
if (!info || !info->path)
|
||||
if (!info || (info->core_file_id.len == 0))
|
||||
continue;
|
||||
if (string_is_equal(path_basename(info->path), core_path_basename))
|
||||
|
||||
if (!strncmp(info->core_file_id.str, core_filename, info->core_file_id.len))
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -610,50 +719,52 @@ static bool core_info_list_update_missing_firmware_internal(
|
||||
info->firmware[i].path, path_size);
|
||||
info->firmware[i].missing = !path_is_valid(path);
|
||||
if (info->firmware[i].missing && !info->firmware[i].optional)
|
||||
{
|
||||
*set_missing_bios = true;
|
||||
RARCH_WARN("Firmware missing: %s\n", info->firmware[i].path);
|
||||
}
|
||||
}
|
||||
|
||||
free(path);
|
||||
return true;
|
||||
}
|
||||
|
||||
void core_info_free_current_core(void)
|
||||
void core_info_free_current_core(core_info_state_t *p_coreinfo)
|
||||
{
|
||||
if (core_info_current)
|
||||
free(core_info_current);
|
||||
core_info_current = NULL;
|
||||
if (p_coreinfo->current)
|
||||
free(p_coreinfo->current);
|
||||
p_coreinfo->current = NULL;
|
||||
}
|
||||
|
||||
bool core_info_init_current_core(void)
|
||||
{
|
||||
core_info_current = (core_info_t*)calloc(1, sizeof(core_info_t));
|
||||
if (!core_info_current)
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
core_info_t *current = (core_info_t*)calloc(1, sizeof(*current));
|
||||
if (!current)
|
||||
return false;
|
||||
p_coreinfo->current = current;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_info_get_current_core(core_info_t **core)
|
||||
{
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!core)
|
||||
return false;
|
||||
*core = core_info_current;
|
||||
*core = p_coreinfo->current;
|
||||
return true;
|
||||
}
|
||||
|
||||
void core_info_deinit_list(void)
|
||||
{
|
||||
if (core_info_curr_list)
|
||||
core_info_list_free(core_info_curr_list);
|
||||
core_info_curr_list = NULL;
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (p_coreinfo->curr_list)
|
||||
core_info_list_free(p_coreinfo->curr_list);
|
||||
p_coreinfo->curr_list = NULL;
|
||||
}
|
||||
|
||||
bool core_info_init_list(const char *path_info, const char *dir_cores,
|
||||
const char *exts, bool dir_show_hidden_files)
|
||||
{
|
||||
if (!(core_info_curr_list = core_info_list_new(dir_cores,
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!(p_coreinfo->curr_list = core_info_list_new(dir_cores,
|
||||
!string_is_empty(path_info) ? path_info : dir_cores,
|
||||
exts,
|
||||
dir_show_hidden_files)))
|
||||
@@ -663,52 +774,61 @@ bool core_info_init_list(const char *path_info, const char *dir_cores,
|
||||
|
||||
bool core_info_get_list(core_info_list_t **core)
|
||||
{
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!core)
|
||||
return false;
|
||||
*core = core_info_curr_list;
|
||||
*core = p_coreinfo->curr_list;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info,
|
||||
bool *set_missing_bios)
|
||||
{
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!info)
|
||||
return false;
|
||||
return core_info_list_update_missing_firmware_internal(
|
||||
core_info_curr_list,
|
||||
p_coreinfo->curr_list,
|
||||
info->path, info->directory.system,
|
||||
set_missing_bios);
|
||||
}
|
||||
|
||||
bool core_info_load(core_info_ctx_find_t *info)
|
||||
bool core_info_load(
|
||||
core_info_ctx_find_t *info,
|
||||
core_info_state_t *p_coreinfo)
|
||||
{
|
||||
core_info_t *core_info = NULL;
|
||||
core_info_t *core_info = NULL;
|
||||
|
||||
if (!info)
|
||||
return false;
|
||||
|
||||
if (!core_info_current)
|
||||
if (!p_coreinfo->current)
|
||||
core_info_init_current_core();
|
||||
|
||||
core_info_get_current_core(&core_info);
|
||||
|
||||
if (!core_info_curr_list)
|
||||
if (!p_coreinfo->curr_list)
|
||||
return false;
|
||||
|
||||
if (!core_info_list_get_info(core_info_curr_list,
|
||||
if (!core_info_list_get_info(p_coreinfo->curr_list,
|
||||
core_info, info->path))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_info_find(core_info_ctx_find_t *info, const char *core_path)
|
||||
bool core_info_find(core_info_ctx_find_t *info)
|
||||
{
|
||||
if (!info || !core_info_curr_list)
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (!info || !p_coreinfo->curr_list)
|
||||
return false;
|
||||
info->inf = core_info_find_internal(core_info_curr_list, core_path);
|
||||
|
||||
info->inf = core_info_find_internal(p_coreinfo->curr_list, info->path);
|
||||
|
||||
if (!info->inf)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -729,20 +849,21 @@ void core_info_list_get_supported_cores(core_info_list_t *core_info_list,
|
||||
const char *path, const core_info_t **infos, size_t *num_infos)
|
||||
{
|
||||
size_t i;
|
||||
size_t supported = 0;
|
||||
size_t supported = 0;
|
||||
#ifdef HAVE_COMPRESSION
|
||||
struct string_list *list = NULL;
|
||||
struct string_list *list = NULL;
|
||||
#endif
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (!core_info_list)
|
||||
return;
|
||||
|
||||
core_info_tmp_path = path;
|
||||
p_coreinfo->tmp_path = path;
|
||||
|
||||
#ifdef HAVE_COMPRESSION
|
||||
if (path_is_compressed_file(path))
|
||||
list = file_archive_get_file_list(path, NULL);
|
||||
core_info_tmp_list = list;
|
||||
p_coreinfo->tmp_list = list;
|
||||
#endif
|
||||
|
||||
/* Let supported core come first in list so we can return
|
||||
@@ -839,8 +960,9 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list)
|
||||
|
||||
bool core_info_database_match_archive_member(const char *database_path)
|
||||
{
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (string_is_empty(new_path))
|
||||
return false;
|
||||
@@ -852,13 +974,13 @@ bool core_info_database_match_archive_member(const char *database_path)
|
||||
|
||||
path_remove_extension(database);
|
||||
|
||||
if (core_info_curr_list)
|
||||
if (p_coreinfo->curr_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < core_info_curr_list->count; i++)
|
||||
for (i = 0; i < p_coreinfo->curr_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_curr_list->list[i];
|
||||
const core_info_t *info = &p_coreinfo->curr_list->list[i];
|
||||
|
||||
if (!info->database_match_archive_member)
|
||||
continue;
|
||||
@@ -880,8 +1002,9 @@ error:
|
||||
bool core_info_database_supports_content_path(
|
||||
const char *database_path, const char *path)
|
||||
{
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (string_is_empty(new_path))
|
||||
return false;
|
||||
@@ -893,13 +1016,13 @@ bool core_info_database_supports_content_path(
|
||||
|
||||
path_remove_extension(database);
|
||||
|
||||
if (core_info_curr_list)
|
||||
if (p_coreinfo->curr_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < core_info_curr_list->count; i++)
|
||||
for (i = 0; i < p_coreinfo->curr_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_curr_list->list[i];
|
||||
const core_info_t *info = &p_coreinfo->curr_list->list[i];
|
||||
|
||||
if (!string_list_find_elem(info->supported_extensions_list,
|
||||
path_get_extension(path)))
|
||||
@@ -923,22 +1046,30 @@ bool core_info_list_get_display_name(core_info_list_t *core_info_list,
|
||||
const char *path, char *s, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
const char *core_filename = NULL;
|
||||
|
||||
if (!core_info_list)
|
||||
if (!core_info_list || string_is_empty(path))
|
||||
return false;
|
||||
|
||||
core_filename = path_basename(path);
|
||||
if (string_is_empty(core_filename))
|
||||
return false;
|
||||
|
||||
for (i = 0; i < core_info_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_list->list[i];
|
||||
|
||||
if (!string_is_equal(path_basename(info->path), path_basename(path)))
|
||||
if (!info || (info->core_file_id.len == 0))
|
||||
continue;
|
||||
|
||||
if (!info->display_name)
|
||||
continue;
|
||||
if (!strncmp(info->core_file_id.str, core_filename, info->core_file_id.len))
|
||||
{
|
||||
if (string_is_empty(info->display_name))
|
||||
break;
|
||||
|
||||
strlcpy(s, info->display_name, len);
|
||||
return true;
|
||||
strlcpy(s, info->display_name, len);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -962,6 +1093,100 @@ bool core_info_get_display_name(const char *path, char *s, size_t len)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns core_info parameters required for
|
||||
* core updater tasks, read from specified file.
|
||||
* Returned core_updater_info_t object must be
|
||||
* freed using core_info_free_core_updater_info().
|
||||
* Returns NULL if 'path' is invalid. */
|
||||
core_updater_info_t *core_info_get_core_updater_info(const char *path)
|
||||
{
|
||||
char *tmp_str = NULL;
|
||||
bool tmp_bool = false;
|
||||
core_updater_info_t *info = NULL;
|
||||
config_file_t *conf = NULL;
|
||||
|
||||
if (string_is_empty(path))
|
||||
return NULL;
|
||||
|
||||
/* Read config file */
|
||||
conf = config_file_new_from_path_to_string(path);
|
||||
|
||||
if (!conf)
|
||||
return NULL;
|
||||
|
||||
/* Create info struct */
|
||||
info = (core_updater_info_t*)calloc(1, sizeof(*info));
|
||||
|
||||
if (!info)
|
||||
return NULL;
|
||||
|
||||
/* Fetch required parameters */
|
||||
|
||||
/* > is_experimental */
|
||||
info->is_experimental = false;
|
||||
if (config_get_bool(conf, "is_experimental", &tmp_bool))
|
||||
info->is_experimental = tmp_bool;
|
||||
|
||||
/* > display_name */
|
||||
info->display_name = NULL;
|
||||
if (config_get_string(conf, "display_name", &tmp_str))
|
||||
{
|
||||
if (!string_is_empty(tmp_str))
|
||||
info->display_name = tmp_str;
|
||||
else
|
||||
free(tmp_str);
|
||||
|
||||
tmp_str = NULL;
|
||||
}
|
||||
|
||||
/* > description */
|
||||
info->description = NULL;
|
||||
if (config_get_string(conf, "description", &tmp_str))
|
||||
{
|
||||
if (!string_is_empty(tmp_str))
|
||||
info->description = tmp_str;
|
||||
else
|
||||
free(tmp_str);
|
||||
|
||||
tmp_str = NULL;
|
||||
}
|
||||
|
||||
/* > licenses */
|
||||
info->licenses = NULL;
|
||||
if (config_get_string(conf, "license", &tmp_str))
|
||||
{
|
||||
if (!string_is_empty(tmp_str))
|
||||
info->licenses = tmp_str;
|
||||
else
|
||||
free(tmp_str);
|
||||
|
||||
tmp_str = NULL;
|
||||
}
|
||||
|
||||
/* Clean up */
|
||||
config_file_free(conf);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
void core_info_free_core_updater_info(core_updater_info_t *info)
|
||||
{
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
if (info->display_name)
|
||||
free(info->display_name);
|
||||
|
||||
if (info->description)
|
||||
free(info->description);
|
||||
|
||||
if (info->licenses)
|
||||
free(info->licenses);
|
||||
|
||||
free(info);
|
||||
info = NULL;
|
||||
}
|
||||
|
||||
static int core_info_qsort_func_path(const core_info_t *a,
|
||||
const core_info_t *b)
|
||||
{
|
||||
@@ -1314,3 +1539,144 @@ bool core_info_hw_api_supported(core_info_t *info)
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Sets 'locked' status of specified core
|
||||
* > Returns true if successful
|
||||
* > Like all functions that access the cached
|
||||
* core info list this is *not* thread safe */
|
||||
bool core_info_set_core_lock(const char *core_path, bool lock)
|
||||
{
|
||||
char *lock_file_path = NULL;
|
||||
RFILE *lock_file = NULL;
|
||||
bool lock_file_exists = false;
|
||||
core_info_ctx_find_t core_info;
|
||||
|
||||
if (string_is_empty(core_path))
|
||||
goto error;
|
||||
|
||||
/* Search for specified core */
|
||||
core_info.inf = NULL;
|
||||
core_info.path = core_path;
|
||||
|
||||
if (!core_info_find(&core_info))
|
||||
goto error;
|
||||
|
||||
/* Get associated lock file path */
|
||||
lock_file_path = core_info_get_core_lock_file_path(core_info.inf->path);
|
||||
|
||||
if (string_is_empty(lock_file_path))
|
||||
goto error;
|
||||
|
||||
/* Check whether lock file exists */
|
||||
lock_file_exists = path_is_valid(lock_file_path);
|
||||
|
||||
/* Create or delete lock file, as required */
|
||||
if (lock && !lock_file_exists)
|
||||
{
|
||||
lock_file = filestream_open(
|
||||
lock_file_path,
|
||||
RETRO_VFS_FILE_ACCESS_WRITE,
|
||||
RETRO_VFS_FILE_ACCESS_HINT_NONE);
|
||||
|
||||
if (!lock_file)
|
||||
goto error;
|
||||
|
||||
/* We have to write something - just output
|
||||
* a single character */
|
||||
if (filestream_putc(lock_file, 0) != 0)
|
||||
goto error;
|
||||
|
||||
filestream_close(lock_file);
|
||||
lock_file = NULL;
|
||||
}
|
||||
else if (!lock && lock_file_exists)
|
||||
if (filestream_delete(lock_file_path) != 0)
|
||||
goto error;
|
||||
|
||||
/* Clean up */
|
||||
free(lock_file_path);
|
||||
lock_file_path = NULL;
|
||||
|
||||
/* File operations were successful - update
|
||||
* core info entry */
|
||||
core_info.inf->is_locked = lock;
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
if (lock_file_path)
|
||||
{
|
||||
free(lock_file_path);
|
||||
lock_file_path = NULL;
|
||||
}
|
||||
|
||||
if (lock_file)
|
||||
{
|
||||
filestream_close(lock_file);
|
||||
lock_file = NULL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Fetches 'locked' status of specified core
|
||||
* > If 'validate_path' is 'true', will search
|
||||
* cached core info list for a corresponding
|
||||
* 'sanitised' core file path. This is *not*
|
||||
* thread safe
|
||||
* > If 'validate_path' is 'false', performs a
|
||||
* direct filesystem check. This *is* thread
|
||||
* safe, but validity of specified core path
|
||||
* must be checked externally */
|
||||
bool core_info_get_core_lock(const char *core_path, bool validate_path)
|
||||
{
|
||||
const char *core_file_path = NULL;
|
||||
char *lock_file_path = NULL;
|
||||
bool is_locked = false;
|
||||
core_info_ctx_find_t core_info;
|
||||
|
||||
if (string_is_empty(core_path))
|
||||
goto end;
|
||||
|
||||
/* Check whether core path is to be validated */
|
||||
if (validate_path)
|
||||
{
|
||||
core_info.inf = NULL;
|
||||
core_info.path = core_path;
|
||||
|
||||
if (core_info_find(&core_info))
|
||||
core_file_path = core_info.inf->path;
|
||||
}
|
||||
else
|
||||
core_file_path = core_path;
|
||||
|
||||
/* A core cannot be locked if it does not exist... */
|
||||
if (string_is_empty(core_file_path) ||
|
||||
!path_is_valid(core_file_path))
|
||||
goto end;
|
||||
|
||||
/* Get lock file path */
|
||||
lock_file_path = core_info_get_core_lock_file_path(core_file_path);
|
||||
|
||||
if (string_is_empty(lock_file_path))
|
||||
goto end;
|
||||
|
||||
/* Check whether lock file exists */
|
||||
is_locked = path_is_valid(lock_file_path);
|
||||
|
||||
/* If core path has been validated (and a
|
||||
* core info object is available), ensure
|
||||
* that core info 'is_locked' field is
|
||||
* up to date */
|
||||
if (validate_path && core_info.inf)
|
||||
core_info.inf->is_locked = is_locked;
|
||||
|
||||
end:
|
||||
if (lock_file_path)
|
||||
{
|
||||
free(lock_file_path);
|
||||
lock_file_path = NULL;
|
||||
}
|
||||
|
||||
return is_locked;
|
||||
}
|
||||
+74
-3
@@ -35,10 +35,29 @@ typedef struct
|
||||
bool optional;
|
||||
} core_info_firmware_t;
|
||||
|
||||
/* Simple container/convenience struct for
|
||||
* holding the 'id' of a core file
|
||||
* > 'id' is the filename without extension or
|
||||
* platform-specific suffix
|
||||
* > 'id' is used for core info searches - enables
|
||||
* matching regardless of core file base path,
|
||||
* and is platform-independent (e.g. an Android
|
||||
* core file will be correctly identified on Linux)
|
||||
* > 'len' is used to cache the length of 'str', for
|
||||
* improved performance when performing string
|
||||
* comparisons */
|
||||
typedef struct
|
||||
{
|
||||
char *str;
|
||||
size_t len;
|
||||
} core_file_id_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool supports_no_game;
|
||||
bool database_match_archive_member;
|
||||
bool is_experimental;
|
||||
bool is_locked;
|
||||
size_t firmware_count;
|
||||
char *path;
|
||||
void *config_data;
|
||||
@@ -56,6 +75,7 @@ typedef struct
|
||||
char *databases;
|
||||
char *notes;
|
||||
char *required_hw_api;
|
||||
char *description;
|
||||
struct string_list *categories_list;
|
||||
struct string_list *databases_list;
|
||||
struct string_list *note_list;
|
||||
@@ -65,9 +85,20 @@ typedef struct
|
||||
struct string_list *licenses_list;
|
||||
struct string_list *required_hw_api_list;
|
||||
core_info_firmware_t *firmware;
|
||||
core_file_id_t core_file_id;
|
||||
void *userdata;
|
||||
} core_info_t;
|
||||
|
||||
/* A subset of core_info parameters required for
|
||||
* core updater tasks */
|
||||
typedef struct
|
||||
{
|
||||
bool is_experimental;
|
||||
char *display_name;
|
||||
char *description;
|
||||
char *licenses;
|
||||
} core_updater_info_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
core_info_t *list;
|
||||
@@ -98,6 +129,18 @@ enum core_info_list_qsort_type
|
||||
CORE_INFO_LIST_SORT_SYSTEM_NAME
|
||||
};
|
||||
|
||||
struct core_info_state
|
||||
{
|
||||
#ifdef HAVE_COMPRESSION
|
||||
const struct string_list *tmp_list;
|
||||
#endif
|
||||
const char *tmp_path;
|
||||
core_info_t *current;
|
||||
core_info_list_t *curr_list;
|
||||
};
|
||||
|
||||
typedef struct core_info_state core_info_state_t;
|
||||
|
||||
size_t core_info_list_num_info_files(core_info_list_t *list);
|
||||
|
||||
/* Non-reentrant, does not allocate. Returns pointer to internal state. */
|
||||
@@ -109,6 +152,14 @@ bool core_info_list_get_display_name(core_info_list_t *list,
|
||||
|
||||
bool core_info_get_display_name(const char *path, char *s, size_t len);
|
||||
|
||||
/* Returns core_info parameters required for
|
||||
* core updater tasks, read from specified file.
|
||||
* Returned core_updater_info_t object must be
|
||||
* freed using core_info_free_core_updater_info().
|
||||
* Returns NULL if 'path' is invalid. */
|
||||
core_updater_info_t *core_info_get_core_updater_info(const char *path);
|
||||
void core_info_free_core_updater_info(core_updater_info_t *info);
|
||||
|
||||
void core_info_get_name(const char *path, char *s, size_t len,
|
||||
const char *path_info, const char *dir_cores,
|
||||
const char *exts, bool show_hidden_files,
|
||||
@@ -116,7 +167,7 @@ void core_info_get_name(const char *path, char *s, size_t len,
|
||||
|
||||
core_info_t *core_info_get(core_info_list_t *list, size_t i);
|
||||
|
||||
void core_info_free_current_core(void);
|
||||
void core_info_free_current_core(core_info_state_t *p_coreinfo);
|
||||
|
||||
bool core_info_init_current_core(void);
|
||||
|
||||
@@ -132,9 +183,11 @@ bool core_info_get_list(core_info_list_t **core);
|
||||
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info,
|
||||
bool *set_missing_bios);
|
||||
|
||||
bool core_info_find(core_info_ctx_find_t *info, const char *name);
|
||||
bool core_info_find(core_info_ctx_find_t *info);
|
||||
|
||||
bool core_info_load(core_info_ctx_find_t *info);
|
||||
bool core_info_load(
|
||||
core_info_ctx_find_t *info,
|
||||
core_info_state_t *p_coreinfo);
|
||||
|
||||
bool core_info_database_supports_content_path(const char *database_path, const char *path);
|
||||
|
||||
@@ -149,6 +202,24 @@ bool core_info_list_get_info(core_info_list_t *core_info_list,
|
||||
|
||||
bool core_info_hw_api_supported(core_info_t *info);
|
||||
|
||||
/* Sets 'locked' status of specified core
|
||||
* > Returns true if successful
|
||||
* > Like all functions that access the cached
|
||||
* core info list this is *not* thread safe */
|
||||
bool core_info_set_core_lock(const char *core_path, bool lock);
|
||||
/* Fetches 'locked' status of specified core
|
||||
* > If 'validate_path' is 'true', will search
|
||||
* cached core info list for a corresponding
|
||||
* 'sanitised' core file path. This is *not*
|
||||
* thread safe
|
||||
* > If 'validate_path' is 'false', performs a
|
||||
* direct filesystem check. This *is* thread
|
||||
* safe, but validity of specified core path
|
||||
* must be checked externally */
|
||||
bool core_info_get_core_lock(const char *core_path, bool validate_path);
|
||||
|
||||
core_info_state_t *coreinfo_get_ptr(void);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif /* CORE_INFO_H_ */
|
||||
+105
-21
@@ -82,6 +82,18 @@ static void core_updater_list_free_entry(core_updater_list_entry_t *entry)
|
||||
free(entry->display_name);
|
||||
entry->display_name = NULL;
|
||||
}
|
||||
|
||||
if (entry->description)
|
||||
{
|
||||
free(entry->description);
|
||||
entry->description = NULL;
|
||||
}
|
||||
|
||||
if (entry->licenses_list)
|
||||
{
|
||||
string_list_free(entry->licenses_list);
|
||||
entry->licenses_list = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Creates a new, empty core updater list.
|
||||
@@ -410,13 +422,11 @@ static bool core_updater_list_set_paths(
|
||||
char remote_core_path[PATH_MAX_LENGTH];
|
||||
char local_core_path[PATH_MAX_LENGTH];
|
||||
char local_info_path[PATH_MAX_LENGTH];
|
||||
char display_name[255];
|
||||
bool is_archive;
|
||||
|
||||
remote_core_path[0] = '\0';
|
||||
local_core_path[0] = '\0';
|
||||
local_info_path[0] = '\0';
|
||||
display_name[0] = '\0';
|
||||
|
||||
if (!entry || string_is_empty(filename_str))
|
||||
return false;
|
||||
@@ -499,10 +509,8 @@ static bool core_updater_list_set_paths(
|
||||
last_underscore = (char*)strrchr(local_info_path, '_');
|
||||
|
||||
if (!string_is_empty(last_underscore))
|
||||
{
|
||||
if (string_is_not_equal_fast(last_underscore, "_libretro", 9))
|
||||
if (!string_is_equal(last_underscore, "_libretro"))
|
||||
*last_underscore = '\0';
|
||||
}
|
||||
|
||||
/* > Add proper file extension */
|
||||
strlcat(
|
||||
@@ -518,29 +526,94 @@ static bool core_updater_list_set_paths(
|
||||
|
||||
entry->local_info_path = strdup(local_info_path);
|
||||
|
||||
/* display_name
|
||||
* > Note: It's a bit rubbish that we have to
|
||||
* read the actual core info files here...
|
||||
* Would be better to cache this globally
|
||||
* (at present, we only cache info for
|
||||
* *installed* cores...) */
|
||||
if (path_is_valid(local_info_path))
|
||||
if (!core_info_get_display_name(
|
||||
local_info_path, display_name, sizeof(display_name)))
|
||||
display_name[0] = '\0';
|
||||
return true;
|
||||
}
|
||||
|
||||
/* > If info file does not exist, just use
|
||||
* core filename */
|
||||
if (string_is_empty(display_name))
|
||||
strlcpy(display_name, filename_str, sizeof(display_name));
|
||||
/* Reads info file associated with core and
|
||||
* adds relevant information to updater list
|
||||
* entry */
|
||||
static bool core_updater_list_set_core_info(
|
||||
core_updater_list_entry_t *entry,
|
||||
const char *local_info_path,
|
||||
const char *filename_str)
|
||||
{
|
||||
core_updater_info_t *core_info = NULL;
|
||||
|
||||
if (!entry ||
|
||||
string_is_empty(local_info_path) ||
|
||||
string_is_empty(filename_str))
|
||||
return false;
|
||||
|
||||
/* Clear any existing core info */
|
||||
if (entry->display_name)
|
||||
{
|
||||
free(entry->display_name);
|
||||
entry->display_name = NULL;
|
||||
}
|
||||
|
||||
entry->display_name = strdup(display_name);
|
||||
if (entry->description)
|
||||
{
|
||||
free(entry->description);
|
||||
entry->description = NULL;
|
||||
}
|
||||
|
||||
if (entry->licenses_list)
|
||||
{
|
||||
/* Note: We can safely leave this as NULL if
|
||||
* the core info file is invalid */
|
||||
string_list_free(entry->licenses_list);
|
||||
entry->licenses_list = NULL;
|
||||
}
|
||||
|
||||
entry->is_experimental = false;
|
||||
|
||||
/* Read core info file
|
||||
* > Note: It's a bit rubbish that we have to
|
||||
* read the actual core info files here...
|
||||
* Would be better to cache this globally
|
||||
* (at present, we only cache info for
|
||||
* *installed* cores...) */
|
||||
core_info = core_info_get_core_updater_info(local_info_path);
|
||||
|
||||
if (core_info)
|
||||
{
|
||||
/* display_name + is_experimental */
|
||||
if (!string_is_empty(core_info->display_name))
|
||||
{
|
||||
entry->display_name = strdup(core_info->display_name);
|
||||
entry->is_experimental = core_info->is_experimental;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If display name is blank, use core filename and
|
||||
* assume core is experimental (i.e. all 'fit for consumption'
|
||||
* cores must have a valid/complete core info file) */
|
||||
entry->display_name = strdup(filename_str);
|
||||
entry->is_experimental = true;
|
||||
}
|
||||
|
||||
/* description */
|
||||
if (!string_is_empty(core_info->description))
|
||||
entry->description = strdup(core_info->description);
|
||||
else
|
||||
entry->description = strdup("");
|
||||
|
||||
/* licenses_list */
|
||||
if (!string_is_empty(core_info->licenses))
|
||||
entry->licenses_list = string_split(core_info->licenses, "|");
|
||||
|
||||
/* Clean up */
|
||||
core_info_free_core_updater_info(core_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If info file is missing, use core filename and
|
||||
* assume core is experimental (i.e. all 'fit for consumption'
|
||||
* cores must have a valid/complete core info file) */
|
||||
entry->display_name = strdup(filename_str);
|
||||
entry->is_experimental = true;
|
||||
entry->description = strdup("");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -576,10 +649,15 @@ static bool core_updater_list_push_entry(
|
||||
list_entry->remote_core_path = entry->remote_core_path;
|
||||
list_entry->local_core_path = entry->local_core_path;
|
||||
list_entry->local_info_path = entry->local_info_path;
|
||||
|
||||
/* Assign core info */
|
||||
list_entry->display_name = entry->display_name;
|
||||
list_entry->description = entry->description;
|
||||
list_entry->licenses_list = entry->licenses_list;
|
||||
list_entry->is_experimental = entry->is_experimental;
|
||||
|
||||
/* Copy crc */
|
||||
list_entry->crc = entry->crc;
|
||||
list_entry->crc = entry->crc;
|
||||
|
||||
/* Copy date */
|
||||
memcpy(&list_entry->date, &entry->date, sizeof(core_updater_list_date_t));
|
||||
@@ -644,6 +722,12 @@ static void core_updater_list_add_entry(
|
||||
filename_str))
|
||||
goto error;
|
||||
|
||||
if (!core_updater_list_set_core_info(
|
||||
&entry,
|
||||
entry.local_info_path,
|
||||
filename_str))
|
||||
goto error;
|
||||
|
||||
/* Add entry to list */
|
||||
if (!core_updater_list_push_entry(core_list, &entry))
|
||||
goto error;
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#include <retro_common_api.h>
|
||||
#include <libretro.h>
|
||||
|
||||
#include <lists/string_list.h>
|
||||
|
||||
#include <boolean.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
@@ -52,6 +54,9 @@ typedef struct
|
||||
char *local_core_path;
|
||||
char *local_info_path;
|
||||
char *display_name;
|
||||
char *description;
|
||||
struct string_list *licenses_list;
|
||||
bool is_experimental;
|
||||
uint32_t crc;
|
||||
core_updater_list_date_t date;
|
||||
} core_updater_list_entry_t;
|
||||
|
||||
@@ -144,7 +144,7 @@ void libretro_dummy_retro_get_system_av_info(
|
||||
refresh_rate = 60.0;
|
||||
|
||||
info->timing.fps = refresh_rate;
|
||||
info->timing.sample_rate = 30000.0;
|
||||
info->timing.sample_rate = 48000.0;
|
||||
|
||||
info->geometry.base_width = frame_buf_width;
|
||||
info->geometry.base_height = frame_buf_height;
|
||||
|
||||
@@ -126,12 +126,6 @@ else ifneq (,$(findstring win,$(platform)))
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_BIGENDIAN),1)
|
||||
CPUOPTS += -DHAVE_BIGENDIAN=1 -DMSB_FIRST
|
||||
else
|
||||
CPUOPTS += -DHAVE_BIGENDIAN=0
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SSA), 1)
|
||||
LIBS += $(shell pkg-config libass --libs)
|
||||
DEFINES += -DHAVE_SSA
|
||||
|
||||
@@ -94,7 +94,13 @@ static unsigned sw_sws_threads;
|
||||
static video_buffer_t *video_buffer;
|
||||
static tpool_t *tpool;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
/* If libavutil is at least version 55 or higher,
|
||||
* and if libavcodec is at least version 57.80.100 or higher,
|
||||
* enable hardware acceleration */
|
||||
#define ENABLE_HW_ACCEL ((LIBAVUTIL_VERSION_MAJOR > 55) && ENABLE_HW_ACCEL_CHECK2())
|
||||
#define ENABLE_HW_ACCEL_CHECK2() ((LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR >= 80 && LIBAVCODEC_VERSION_MICRO >= 100) || (LIBAVCODEC_VERSION_MAJOR > 57))
|
||||
|
||||
#if ENABLE_HW_ACCEL
|
||||
static enum AVHWDeviceType hw_decoder;
|
||||
static bool hw_decoding_enabled;
|
||||
static enum AVPixelFormat pix_fmt;
|
||||
@@ -278,11 +284,11 @@ void CORE_PREFIX(retro_get_system_av_info)(struct retro_system_av_info *info)
|
||||
void CORE_PREFIX(retro_set_environment)(retro_environment_t cb)
|
||||
{
|
||||
static const struct retro_variable vars[] = {
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
{ "ffmpeg_hw_decoder", "Use Hardware decoder (restart); off|auto|"
|
||||
"cuda|d3d11va|drm|dxva2|mediacodec|opencl|qsv|vaapi|vdpau|videotoolbox" },
|
||||
#endif
|
||||
{ "ffmpeg_sw_decoder_threads", "Software decoder thread count (restart); auto|1|2|4|8|16" },
|
||||
{ "ffmpeg_sw_decoder_threads", "Software decoder thread count (restart); auto|1|2|4|6|8|10|12|14|16" },
|
||||
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
|
||||
{ "ffmpeg_temporal_interp", "Temporal Interpolation; disabled|enabled" },
|
||||
#ifdef HAVE_GL_FFT
|
||||
@@ -409,7 +415,7 @@ static void check_variables(bool firststart)
|
||||
slock_unlock(decode_thread_lock);
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (firststart)
|
||||
{
|
||||
hw_var.key = "ffmpeg_hw_decoder";
|
||||
@@ -491,9 +497,6 @@ static void seek_frame(int seek_frames)
|
||||
}
|
||||
audio_frames = frame_cnt * media.sample_rate / media.interpolate_fps;
|
||||
|
||||
tpool_wait(tpool);
|
||||
video_buffer_clear(video_buffer);
|
||||
|
||||
if (audio_decode_fifo)
|
||||
fifo_clear(audio_decode_fifo);
|
||||
scond_signal(fifo_decode_cond);
|
||||
@@ -506,7 +509,6 @@ static void seek_frame(int seek_frames)
|
||||
}
|
||||
|
||||
slock_unlock(fifo_lock);
|
||||
|
||||
}
|
||||
|
||||
void CORE_PREFIX(retro_run)(void)
|
||||
@@ -690,38 +692,42 @@ void CORE_PREFIX(retro_run)(void)
|
||||
frames[0] = tmp;
|
||||
}
|
||||
|
||||
while (!decode_thread_dead && min_pts > frames[1].pts)
|
||||
{
|
||||
int64_t pts = 0;
|
||||
|
||||
if (!decode_thread_dead)
|
||||
video_buffer_wait_for_finished_slot(video_buffer);
|
||||
|
||||
if (!decode_thread_dead)
|
||||
{
|
||||
uint32_t *data = video_frame_temp_buffer;
|
||||
|
||||
video_decoder_context_t *ctx = NULL;
|
||||
video_buffer_get_finished_slot(video_buffer, &ctx);
|
||||
pts = ctx->pts;
|
||||
|
||||
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
|
||||
if (use_gl)
|
||||
if (use_gl)
|
||||
{
|
||||
float mix_factor;
|
||||
|
||||
while (!decode_thread_dead && min_pts > frames[1].pts)
|
||||
{
|
||||
int64_t pts = 0;
|
||||
|
||||
if (!decode_thread_dead)
|
||||
video_buffer_wait_for_finished_slot(video_buffer);
|
||||
|
||||
if (!decode_thread_dead)
|
||||
{
|
||||
unsigned y;
|
||||
const uint8_t *src;
|
||||
int stride, width;
|
||||
uint32_t *data = video_frame_temp_buffer;
|
||||
|
||||
video_decoder_context_t *ctx = NULL;
|
||||
video_buffer_get_finished_slot(video_buffer, &ctx);
|
||||
pts = ctx->pts;
|
||||
|
||||
#ifndef HAVE_OPENGLES
|
||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, frames[1].pbo);
|
||||
#ifdef __MACH__
|
||||
data = (uint32_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
|
||||
data = (uint32_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
|
||||
#else
|
||||
data = (uint32_t*)glMapBufferRange(GL_PIXEL_UNPACK_BUFFER,
|
||||
data = (uint32_t*)glMapBufferRange(GL_PIXEL_UNPACK_BUFFER,
|
||||
0, media.width * media.height * sizeof(uint32_t), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const uint8_t *src = ctx->target->data[0];
|
||||
int stride = ctx->target->linesize[0];
|
||||
int width = media.width * sizeof(uint32_t);
|
||||
for (unsigned y = 0; y < media.height; y++, src += stride, data += width/4)
|
||||
src = ctx->target->data[0];
|
||||
stride = ctx->target->linesize[0];
|
||||
width = media.width * sizeof(uint32_t);
|
||||
for (y = 0; y < media.height; y++, src += stride, data += width/4)
|
||||
memcpy(data, src, width);
|
||||
|
||||
#ifndef HAVE_OPENGLES
|
||||
@@ -739,28 +745,13 @@ void CORE_PREFIX(retro_run)(void)
|
||||
#ifndef HAVE_OPENGLES
|
||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
#endif
|
||||
video_buffer_open_slot(video_buffer, ctx);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const uint8_t *src = ctx->target->data[0];
|
||||
int stride = ctx->target->linesize[0];
|
||||
size_t width = media.width * sizeof(uint32_t);
|
||||
for (unsigned y = 0; y < media.height; y++, src += stride, data += width/4)
|
||||
memcpy(data, src, width);
|
||||
|
||||
dupe = false;
|
||||
}
|
||||
video_buffer_open_slot(video_buffer, ctx);
|
||||
frames[1].pts = av_q2d(fctx->streams[video_stream_index]->time_base) * pts;
|
||||
}
|
||||
|
||||
frames[1].pts = av_q2d(fctx->streams[video_stream_index]->time_base) * pts;
|
||||
}
|
||||
|
||||
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
|
||||
if (use_gl)
|
||||
{
|
||||
float mix_factor = (min_pts - frames[0].pts) / (frames[1].pts - frames[0].pts);
|
||||
mix_factor = (min_pts - frames[0].pts) / (frames[1].pts - frames[0].pts);
|
||||
|
||||
if (!temporal_interpolation)
|
||||
mix_factor = 1.0f;
|
||||
@@ -802,6 +793,36 @@ void CORE_PREFIX(retro_run)(void)
|
||||
else
|
||||
#endif
|
||||
{
|
||||
while (!decode_thread_dead && min_pts > frames[1].pts)
|
||||
{
|
||||
int64_t pts = 0;
|
||||
|
||||
if (!decode_thread_dead)
|
||||
video_buffer_wait_for_finished_slot(video_buffer);
|
||||
|
||||
if (!decode_thread_dead)
|
||||
{
|
||||
unsigned y;
|
||||
const uint8_t *src;
|
||||
int stride, width;
|
||||
uint32_t *data = video_frame_temp_buffer;
|
||||
video_decoder_context_t *ctx = NULL;
|
||||
|
||||
video_buffer_get_finished_slot(video_buffer, &ctx);
|
||||
pts = ctx->pts;
|
||||
src = ctx->target->data[0];
|
||||
stride = ctx->target->linesize[0];
|
||||
width = media.width * sizeof(uint32_t);
|
||||
for (y = 0; y < media.height; y++, src += stride, data += width/4)
|
||||
memcpy(data, src, width);
|
||||
|
||||
dupe = false;
|
||||
video_buffer_open_slot(video_buffer, ctx);
|
||||
}
|
||||
|
||||
frames[1].pts = av_q2d(fctx->streams[video_stream_index]->time_base) * pts;
|
||||
}
|
||||
|
||||
CORE_PREFIX(video_cb)(dupe ? NULL : video_frame_temp_buffer,
|
||||
media.width, media.height, media.width * sizeof(uint32_t));
|
||||
}
|
||||
@@ -837,7 +858,7 @@ void CORE_PREFIX(retro_run)(void)
|
||||
CORE_PREFIX(audio_batch_cb)(audio_buffer, to_read_frames);
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
/*
|
||||
* Try to initialize a specific HW decoder defined by type.
|
||||
* Optionaly tests the pixel format list for a compatible pixel format.
|
||||
@@ -936,7 +957,7 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
{
|
||||
enum AVPixelFormat format = AV_PIX_FMT_NONE;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (!force_sw_decoder)
|
||||
{
|
||||
if (hw_decoder == AV_HWDEVICE_TYPE_NONE)
|
||||
@@ -960,7 +981,7 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
|
||||
format = fctx->streams[video_stream_index]->codec->pix_fmt;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
hw_decoding_enabled = false;
|
||||
}
|
||||
else
|
||||
@@ -970,7 +991,7 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
return format;
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
/* Callback used by ffmpeg to configure the pixelformat to use. */
|
||||
static enum AVPixelFormat get_format(AVCodecContext *ctx,
|
||||
const enum AVPixelFormat *pix_fmts)
|
||||
@@ -1005,7 +1026,7 @@ static bool open_codec(AVCodecContext **ctx, enum AVMediaType type, unsigned ind
|
||||
{
|
||||
video_stream_index = index;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
vctx->get_format = get_format;
|
||||
pix_fmt = select_decoder((*ctx), NULL);
|
||||
#else
|
||||
@@ -1293,7 +1314,7 @@ static void sws_worker_thread(void *arg)
|
||||
AVFrame *tmp_frame = NULL;
|
||||
video_decoder_context_t *ctx = (video_decoder_context_t*) arg;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (hw_decoding_enabled)
|
||||
tmp_frame = ctx->hw_source;
|
||||
else
|
||||
@@ -1336,7 +1357,7 @@ static void sws_worker_thread(void *arg)
|
||||
#endif
|
||||
|
||||
av_frame_unref(ctx->source);
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
av_frame_unref(ctx->hw_source);
|
||||
#endif
|
||||
|
||||
@@ -1357,7 +1378,8 @@ static void decode_video(AVCodecContext *ctx, AVPacket *pkt, size_t frame_size)
|
||||
{
|
||||
if (main_sleeping)
|
||||
{
|
||||
log_cb(RETRO_LOG_ERROR, "[FFMPEG] Thread: Video deadlock detected.\n");
|
||||
if (!do_seek)
|
||||
log_cb(RETRO_LOG_ERROR, "[FFMPEG] Thread: Video deadlock detected.\n");
|
||||
tpool_wait(tpool);
|
||||
video_buffer_clear(video_buffer);
|
||||
return;
|
||||
@@ -1394,7 +1416,7 @@ static void decode_video(AVCodecContext *ctx, AVPacket *pkt, size_t frame_size)
|
||||
goto end;
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (hw_decoding_enabled)
|
||||
/* Copy data from VRAM to RAM */
|
||||
if ((ret = av_hwframe_transfer_data(decoder_ctx->hw_source, decoder_ctx->source, 0)) < 0)
|
||||
@@ -1443,7 +1465,7 @@ static int16_t *decode_audio(AVCodecContext *ctx, AVPacket *pkt,
|
||||
return buffer;
|
||||
}
|
||||
|
||||
while(true)
|
||||
for (;;)
|
||||
{
|
||||
ret = avcodec_receive_frame(ctx, frame);
|
||||
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
|
||||
@@ -1530,8 +1552,16 @@ static void decode_thread_seek(double time)
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool earlier_or_close_enough(double p1, double p2) {
|
||||
return (p1 <= p2 || (p1-p2) <= 0.001);
|
||||
/**
|
||||
* This function makes sure that we don't decode too many
|
||||
* packets and cause stalls in our decoding pipeline.
|
||||
* This could happen if we decode too many packets and
|
||||
* saturate our buffers. We have a window of "still okay"
|
||||
* to decode, that depends on the media fps.
|
||||
**/
|
||||
static bool earlier_or_close_enough(double p1, double p2)
|
||||
{
|
||||
return (p1 <= p2 || (p1-p2) < (1.0 / media.interpolate_fps) );
|
||||
}
|
||||
|
||||
static void decode_thread(void *data)
|
||||
@@ -1643,15 +1673,17 @@ static void decode_thread(void *data)
|
||||
|
||||
/*
|
||||
* Decode audio packet if:
|
||||
* 1. there is a vido packet for in the buffer
|
||||
* 2. it's the start of file
|
||||
* 3. it's audio only media
|
||||
* 4. EOF
|
||||
* 1. it's the start of file or it's audio only media
|
||||
* 2. there is a video packet for in the buffer
|
||||
* 3. EOF
|
||||
**/
|
||||
if (!packet_buffer_empty(audio_packet_buffer) &&
|
||||
((!eof && earlier_or_close_enough(next_audio_start, next_video_end)) ||
|
||||
next_video_end == 0.0 ||
|
||||
eof))
|
||||
(
|
||||
next_video_end == 0.0 ||
|
||||
(!eof && earlier_or_close_enough(next_audio_start, next_video_end)) ||
|
||||
eof
|
||||
)
|
||||
)
|
||||
{
|
||||
packet_buffer_get_packet(audio_packet_buffer, pkt);
|
||||
last_audio_end = audio_timebase * (pkt->pts + pkt->duration);
|
||||
@@ -1668,7 +1700,12 @@ static void decode_thread(void *data)
|
||||
* 3. EOF
|
||||
**/
|
||||
if (!packet_buffer_empty(video_packet_buffer) &&
|
||||
((!eof && earlier_or_close_enough(next_video_end, last_audio_end)) || !actx_active || eof ))
|
||||
(
|
||||
(!eof && earlier_or_close_enough(next_video_end, last_audio_end)) ||
|
||||
!actx_active ||
|
||||
eof
|
||||
)
|
||||
)
|
||||
{
|
||||
packet_buffer_get_packet(video_packet_buffer, pkt);
|
||||
|
||||
@@ -1733,8 +1770,10 @@ static void decode_thread(void *data)
|
||||
for (i = 0; (int)i < audio_streams_num; i++)
|
||||
swr_free(&swr[i]);
|
||||
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (vctx && vctx->hw_device_ctx)
|
||||
av_buffer_unref(&vctx->hw_device_ctx);
|
||||
#endif
|
||||
|
||||
packet_buffer_destroy(audio_packet_buffer);
|
||||
packet_buffer_destroy(video_packet_buffer);
|
||||
|
||||
@@ -16,7 +16,7 @@ struct packet_buffer
|
||||
|
||||
packet_buffer_t *packet_buffer_create()
|
||||
{
|
||||
packet_buffer_t *b = malloc(sizeof(packet_buffer_t));
|
||||
packet_buffer_t *b = (packet_buffer_t*)malloc(sizeof(packet_buffer_t));
|
||||
if (!b)
|
||||
return NULL;
|
||||
|
||||
@@ -99,7 +99,7 @@ void packet_buffer_get_packet(packet_buffer_t *packet_buffer, AVPacket *pkt)
|
||||
{
|
||||
AVPacketNode_t *new_tail = NULL;
|
||||
|
||||
if (packet_buffer->tail == NULL)
|
||||
if (!packet_buffer->tail)
|
||||
return;
|
||||
|
||||
av_packet_move_ref(pkt, packet_buffer->tail->data);
|
||||
|
||||
@@ -25,14 +25,14 @@ struct video_buffer
|
||||
|
||||
video_buffer_t *video_buffer_create(size_t capacity, int frame_size, int width, int height)
|
||||
{
|
||||
video_buffer_t *b = malloc(sizeof(video_buffer_t));
|
||||
video_buffer_t *b = (video_buffer_t*)malloc(sizeof(video_buffer_t));
|
||||
if (!b)
|
||||
return NULL;
|
||||
|
||||
memset(b, 0, sizeof(video_buffer_t));
|
||||
b->capacity = capacity;
|
||||
|
||||
b->status = malloc(sizeof(enum kbStatus) * capacity);
|
||||
b->status = (enum kbStatus*)malloc(sizeof(enum kbStatus) * capacity);
|
||||
if (!b->status)
|
||||
goto fail;
|
||||
for (int i = 0; i < capacity; i++)
|
||||
@@ -44,21 +44,21 @@ video_buffer_t *video_buffer_create(size_t capacity, int frame_size, int width,
|
||||
if (!b->lock || !b->open_cond || !b->finished_cond)
|
||||
goto fail;
|
||||
|
||||
b->buffer = malloc(sizeof(video_decoder_context_t) * capacity);
|
||||
b->buffer = (video_decoder_context_t*)malloc(sizeof(video_decoder_context_t) * capacity);
|
||||
if (!b->buffer)
|
||||
goto fail;
|
||||
|
||||
for (int i = 0; i < capacity; i++)
|
||||
{
|
||||
b->buffer[i].index = i;
|
||||
b->buffer[i].pts = 0;
|
||||
b->buffer[i].sws = sws_alloc_context();
|
||||
b->buffer[i].source = av_frame_alloc();
|
||||
b->buffer[i].index = i;
|
||||
b->buffer[i].pts = 0;
|
||||
b->buffer[i].sws = sws_alloc_context();
|
||||
b->buffer[i].source = av_frame_alloc();
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
b->buffer[i].hw_source = av_frame_alloc();
|
||||
#endif
|
||||
b->buffer[i].target = av_frame_alloc();
|
||||
b->buffer[i].frame_buf = av_malloc(frame_size);
|
||||
b->buffer[i].target = av_frame_alloc();
|
||||
b->buffer[i].frame_buf = (uint8_t*)av_malloc(frame_size);
|
||||
|
||||
avpicture_fill((AVPicture*)b->buffer[i].target, (const uint8_t*)b->buffer[i].frame_buf,
|
||||
PIX_FMT_RGB32, width, height);
|
||||
|
||||
+1
-1
@@ -24,4 +24,4 @@ void dump_result_value(Result val);
|
||||
#define PRINTFPOS_STR(X,Y) "\x1b["X";"Y"H"
|
||||
#define PRINTF_LINE(X) "\x1b["X";0H"
|
||||
|
||||
#endif //_CTR_DEBUG_H__
|
||||
#endif /* _CTR_DEBUG_H__ */
|
||||
+15
-12
@@ -88,7 +88,9 @@ struct MemPool
|
||||
last = nullptr;
|
||||
}
|
||||
|
||||
//void Dump(const char* title);
|
||||
#if 0
|
||||
void Dump(const char* title);
|
||||
#endif
|
||||
u32 GetFreeSpace();
|
||||
};
|
||||
|
||||
@@ -159,25 +161,25 @@ static bool linearInit(void)
|
||||
|
||||
void* linearMemAlign(size_t size, size_t alignment)
|
||||
{
|
||||
// Enforce minimum alignment
|
||||
int shift;
|
||||
/* Enforce minimum alignment */
|
||||
if (alignment < 16)
|
||||
alignment = 16;
|
||||
|
||||
// Convert alignment to shift amount
|
||||
int shift;
|
||||
/* Convert alignment to shift amount */
|
||||
for (shift = 4; shift < 32; shift ++)
|
||||
{
|
||||
if ((1U<<shift) == alignment)
|
||||
break;
|
||||
}
|
||||
if (shift == 32) // Invalid alignment
|
||||
if (shift == 32) /* Invalid alignment */
|
||||
return nullptr;
|
||||
|
||||
// Initialize the pool if it is not ready
|
||||
/* Initialize the pool if it is not ready */
|
||||
if (!sLinearPool.Ready() && !linearInit())
|
||||
return nullptr;
|
||||
|
||||
// Allocate the chunk
|
||||
/* Allocate the chunk */
|
||||
MemChunk chunk;
|
||||
if (!sLinearPool.Allocate(chunk, size, shift))
|
||||
return nullptr;
|
||||
@@ -211,23 +213,24 @@ void* linearAlloc(size_t size)
|
||||
|
||||
void* linearRealloc(void* mem, size_t size)
|
||||
{
|
||||
// TODO
|
||||
/* TODO */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void linearFree(void* mem)
|
||||
{
|
||||
auto node = getNode(mem);
|
||||
if (!node) return;
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
// Free the chunk
|
||||
/* Free the chunk */
|
||||
sLinearPool.Deallocate(node->chunk);
|
||||
|
||||
// Free the node
|
||||
/* Free the node */
|
||||
delNode(node);
|
||||
}
|
||||
|
||||
u32 linearSpaceFree()
|
||||
u32 linearSpaceFree(void)
|
||||
{
|
||||
return sLinearPool.GetFreeSpace();
|
||||
}
|
||||
|
||||
+20
-12
@@ -17,8 +17,8 @@ u32 ctr_get_linear_unused(void);
|
||||
u32 ctr_get_stack_free(void)
|
||||
{
|
||||
extern u32 __stack_bottom;
|
||||
|
||||
uint32_t* stack_bottom_current = (u32*)__stack_bottom;
|
||||
|
||||
while(*stack_bottom_current++ == 0xFCFCFCFC);
|
||||
stack_bottom_current--;
|
||||
|
||||
@@ -37,25 +37,32 @@ void ctr_linear_free_pages(u32 pages);
|
||||
|
||||
void ctr_free_pages(u32 pages)
|
||||
{
|
||||
u32 linear_free_pages;
|
||||
u32 stack_free, stack_usage, stack_free_pages;
|
||||
|
||||
if(!pages)
|
||||
return;
|
||||
|
||||
u32 linear_free_pages = ctr_get_linear_free() >> 12;
|
||||
linear_free_pages = ctr_get_linear_free() >> 12;
|
||||
|
||||
if((ctr_get_linear_unused() >> 12) > pages + 0x100)
|
||||
if ((ctr_get_linear_unused() >> 12) > pages + 0x100)
|
||||
return ctr_linear_free_pages(pages);
|
||||
|
||||
#if 0
|
||||
if(linear_free_pages > pages + 0x400)
|
||||
if (linear_free_pages > pages + 0x400)
|
||||
return ctr_linear_free_pages(pages);
|
||||
#endif
|
||||
|
||||
u32 stack_free = ctr_get_stack_free();
|
||||
u32 stack_usage = __stacksize__ > stack_free? __stacksize__ - stack_free: 0;
|
||||
stack_free = ctr_get_stack_free();
|
||||
stack_usage = __stacksize__ > stack_free
|
||||
? __stacksize__ - stack_free
|
||||
: 0;
|
||||
|
||||
stack_free = stack_free > __stack_size_extra ? __stack_size_extra : stack_free;
|
||||
stack_free = stack_free > __stack_size_extra
|
||||
? __stack_size_extra
|
||||
: stack_free;
|
||||
|
||||
u32 stack_free_pages = stack_free >> 12;
|
||||
stack_free_pages = stack_free >> 12;
|
||||
|
||||
if(linear_free_pages + (stack_free_pages - (stack_usage >> 12)) > pages)
|
||||
{
|
||||
@@ -83,7 +90,8 @@ void ctr_free_pages(u32 pages)
|
||||
__stacksize__ -= stack_free_pages << 12;
|
||||
#if 0
|
||||
printf("s:0x%08X-->0x%08X(-0x%08X) \n", stack_free,
|
||||
stack_free - (stack_free_pages << 12), stack_free_pages << 12);
|
||||
stack_free - (stack_free_pages << 12),
|
||||
stack_free_pages << 12);
|
||||
DEBUG_HOLD();
|
||||
#endif
|
||||
}
|
||||
@@ -110,13 +118,13 @@ void ctr_request_free_pages(u32 pages)
|
||||
void* _sbrk_r(struct _reent *ptr, ptrdiff_t incr)
|
||||
{
|
||||
static u32 sbrk_top = 0;
|
||||
u32 tmp;
|
||||
int diff;
|
||||
|
||||
if (!sbrk_top)
|
||||
sbrk_top = __heapBase;
|
||||
|
||||
u32 tmp;
|
||||
|
||||
int diff = ((sbrk_top + incr + 0xFFF) & ~0xFFF)
|
||||
diff = ((sbrk_top + incr + 0xFFF) & ~0xFFF)
|
||||
- (__heapBase + __heap_size);
|
||||
|
||||
if (diff > 0)
|
||||
|
||||
+174
-131
@@ -15,15 +15,55 @@
|
||||
#define SVC_ACL_MASK(svc_id) (0x1 << ((svc_id) & 0x1F))
|
||||
#define THREAD_PAGE_ACL_OFFSET 0xF38
|
||||
|
||||
u32 __ctr_svchax = 0;
|
||||
u32 __ctr_svchax = 0;
|
||||
u32 __ctr_svchax_srv = 0;
|
||||
|
||||
extern void* __service_ptr;
|
||||
|
||||
typedef u32(*backdoor_fn)(u32 arg0, u32 arg1);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Handle started_event;
|
||||
Handle lock;
|
||||
volatile u32 target_kaddr;
|
||||
volatile u32 target_val;
|
||||
} mch2_thread_args_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32* stack_top;
|
||||
Handle handle;
|
||||
bool keep;
|
||||
mch2_thread_args_t args;
|
||||
} mch2_thread_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 old_cpu_time_limit;
|
||||
bool isNew3DS;
|
||||
u32 kernel_fcram_mapping_offset;
|
||||
|
||||
Handle arbiter;
|
||||
volatile u32 alloc_address;
|
||||
volatile u32 alloc_size;
|
||||
u8* flush_buffer;
|
||||
|
||||
Handle dummy_threads_lock;
|
||||
Handle target_threads_lock;
|
||||
Handle main_thread_lock;
|
||||
u32* thread_page_va;
|
||||
u32 thread_page_kva;
|
||||
|
||||
u32 threads_limit;
|
||||
Handle alloc_thread;
|
||||
Handle poll_thread;
|
||||
mch2_thread_t threads[MCH2_THREAD_COUNT_MAX];
|
||||
} mch2_vars_t;
|
||||
|
||||
|
||||
__attribute((naked))
|
||||
static u32 svc_7b(backdoor_fn entry_fn, ...) // can pass up to two arguments to entry_fn(...)
|
||||
static u32 svc_7b(backdoor_fn entry_fn, ...) /* can pass up to two arguments to entry_fn(...) */
|
||||
{
|
||||
__asm__ volatile(
|
||||
"push {r0, r1, r2} \n\t"
|
||||
@@ -46,7 +86,7 @@ static u32 svc_7b(backdoor_fn entry_fn, ...) // can pass up to two arguments to
|
||||
|
||||
static void k_enable_all_svcs(u32 isNew3DS)
|
||||
{
|
||||
u32* thread_ACL = *(*(u32***)CURRENT_KTHREAD + 0x22) - 0x6;
|
||||
u32* thread_ACL = *(*(u32***)CURRENT_KTHREAD + 0x22) - 0x6;
|
||||
u32* process_ACL = *(u32**)CURRENT_KPROCESS + (isNew3DS ? 0x24 : 0x22);
|
||||
|
||||
memset(thread_ACL, 0xFF, 0x10);
|
||||
@@ -88,45 +128,6 @@ static u32 get_thread_page(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Handle started_event;
|
||||
Handle lock;
|
||||
volatile u32 target_kaddr;
|
||||
volatile u32 target_val;
|
||||
} mch2_thread_args_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32* stack_top;
|
||||
Handle handle;
|
||||
bool keep;
|
||||
mch2_thread_args_t args;
|
||||
} mch2_thread_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 old_cpu_time_limit;
|
||||
bool isNew3DS;
|
||||
u32 kernel_fcram_mapping_offset;
|
||||
|
||||
Handle arbiter;
|
||||
volatile u32 alloc_address;
|
||||
volatile u32 alloc_size;
|
||||
u8* flush_buffer;
|
||||
|
||||
Handle dummy_threads_lock;
|
||||
Handle target_threads_lock;
|
||||
Handle main_thread_lock;
|
||||
u32* thread_page_va;
|
||||
u32 thread_page_kva;
|
||||
|
||||
u32 threads_limit;
|
||||
Handle alloc_thread;
|
||||
Handle poll_thread;
|
||||
mch2_thread_t threads[MCH2_THREAD_COUNT_MAX];
|
||||
} mch2_vars_t;
|
||||
|
||||
static void alloc_thread_entry(mch2_vars_t* mch2)
|
||||
{
|
||||
u32 tmp;
|
||||
@@ -161,19 +162,17 @@ static void target_thread_entry(mch2_thread_args_t* args)
|
||||
static u32 get_first_free_basemem_page(bool isNew3DS)
|
||||
{
|
||||
s64 v1;
|
||||
int memused_base;
|
||||
int memused_base_linear; // guessed
|
||||
|
||||
memused_base = osGetMemRegionUsed(MEMREGION_BASE);
|
||||
int memused_base_linear; /* guessed */
|
||||
int memused_base = osGetMemRegionUsed(MEMREGION_BASE);
|
||||
|
||||
svcGetSystemInfo(&v1, 2, 0);
|
||||
memused_base_linear = 0x6C000 + v1 +
|
||||
(osGetKernelVersion() > SYSTEM_VERSION(2, 49, 0) ? (isNew3DS ? 0x2000 : 0x1000) : 0x0);
|
||||
|
||||
return (osGetKernelVersion() > SYSTEM_VERSION(2, 40, 0) ? 0xE0000000 : 0xF0000000) // kernel FCRAM mapping
|
||||
+ (isNew3DS ? 0x10000000 : 0x08000000) // FCRAM size
|
||||
- (memused_base - memused_base_linear) // memory usage for pages allocated without the MEMOP_LINEAR flag
|
||||
- 0x1000; // skip to the start addr of the next free page
|
||||
return (osGetKernelVersion() > SYSTEM_VERSION(2, 40, 0) ? 0xE0000000 : 0xF0000000) /* kernel FCRAM mapping */
|
||||
+ (isNew3DS ? 0x10000000 : 0x08000000) /* FCRAM size */
|
||||
- (memused_base - memused_base_linear) /* memory usage for pages allocated without the MEMOP_LINEAR flag */
|
||||
- 0x1000; /* skip to the start addr of the next free page */
|
||||
|
||||
}
|
||||
|
||||
@@ -199,13 +198,25 @@ static void do_memchunkhax2(void)
|
||||
{
|
||||
static u8 flush_buffer[0x8000];
|
||||
static u8 thread_stacks[MCH2_THREAD_STACKS_SIZE];
|
||||
|
||||
extern u32 __heapBase;
|
||||
extern u32 __heap_size;
|
||||
int i;
|
||||
u32 tmp;
|
||||
mch2_vars_t mch2 = {0};
|
||||
u32 linear_buffer;
|
||||
u32 linear_address;
|
||||
u32 dst_memchunk;
|
||||
u32 mem_free;
|
||||
u32 fragmented_size;
|
||||
u32* mapped_page;
|
||||
volatile u32 *thread_ACL;
|
||||
u32 alloc_address_kaddr;
|
||||
u32 fragmented_address = 0;
|
||||
u32 linear_size = 0xF000;
|
||||
u32 skip_pages = 2;
|
||||
mch2_vars_t mch2 = {0};
|
||||
|
||||
mch2.flush_buffer = flush_buffer;
|
||||
mch2.threads_limit = get_threads_limit();
|
||||
mch2.flush_buffer = flush_buffer;
|
||||
mch2.threads_limit = get_threads_limit();
|
||||
mch2.kernel_fcram_mapping_offset = (osGetKernelVersion() > SYSTEM_VERSION(2, 40, 0)) ? 0xC0000000 : 0xD0000000;
|
||||
|
||||
for (i = 0; i < MCH2_THREAD_COUNT_MAX; i++)
|
||||
@@ -217,8 +228,10 @@ static void do_memchunkhax2(void)
|
||||
|
||||
for (i = 0; i < mch2.threads_limit; i++)
|
||||
{
|
||||
svcCreateThread(&mch2.threads[i].handle, (ThreadFunc)check_tls_thread_entry, (u32)&mch2.threads[i].keep,
|
||||
mch2.threads[i].stack_top, 0x18, 0);
|
||||
svcCreateThread(&mch2.threads[i].handle,
|
||||
(ThreadFunc)check_tls_thread_entry,
|
||||
(u32)&mch2.threads[i].keep,
|
||||
mch2.threads[i].stack_top, 0x18, 0);
|
||||
svcWaitSynchronization(mch2.threads[i].handle, U64_MAX);
|
||||
}
|
||||
|
||||
@@ -231,61 +244,70 @@ static void do_memchunkhax2(void)
|
||||
|
||||
for (i = 0; i < mch2.threads_limit; i++)
|
||||
if (!mch2.threads[i].keep)
|
||||
svcCreateThread(&mch2.threads[i].handle, (ThreadFunc)dummy_thread_entry, mch2.dummy_threads_lock,
|
||||
mch2.threads[i].stack_top, 0x3F - i, 0);
|
||||
svcCreateThread(&mch2.threads[i].handle,
|
||||
(ThreadFunc)dummy_thread_entry,
|
||||
mch2.dummy_threads_lock,
|
||||
mch2.threads[i].stack_top, 0x3F - i, 0);
|
||||
|
||||
svcSignalEvent(mch2.dummy_threads_lock);
|
||||
|
||||
for (i = mch2.threads_limit - 1; i >= 0; i--)
|
||||
{
|
||||
if (!mch2.threads[i].keep)
|
||||
{
|
||||
svcWaitSynchronization(mch2.threads[i].handle, U64_MAX);
|
||||
svcCloseHandle(mch2.threads[i].handle);
|
||||
mch2.threads[i].handle = 0;
|
||||
}
|
||||
}
|
||||
|
||||
svcCloseHandle(mch2.dummy_threads_lock);
|
||||
|
||||
u32 fragmented_address = 0;
|
||||
mch2.arbiter = __sync_get_arbiter();
|
||||
|
||||
mch2.arbiter = __sync_get_arbiter();
|
||||
svcControlMemory(&linear_buffer, 0, 0, 0x1000,
|
||||
MEMOP_ALLOC_LINEAR, MEMPERM_READ | MEMPERM_WRITE);
|
||||
|
||||
u32 linear_buffer;
|
||||
svcControlMemory(&linear_buffer, 0, 0, 0x1000, MEMOP_ALLOC_LINEAR, MEMPERM_READ | MEMPERM_WRITE);
|
||||
mch2.alloc_size = ((((linear_size - (skip_pages << 12))
|
||||
+ 0x1000) >> 13) << 12);
|
||||
|
||||
u32 linear_size = 0xF000;
|
||||
u32 skip_pages = 2;
|
||||
mch2.alloc_size = ((((linear_size - (skip_pages << 12)) + 0x1000) >> 13) << 12);
|
||||
u32 mem_free = osGetMemRegionFree(MEMREGION_APPLICATION);
|
||||
mem_free = osGetMemRegionFree(MEMREGION_APPLICATION);
|
||||
fragmented_size = mem_free - linear_size;
|
||||
|
||||
u32 fragmented_size = mem_free - linear_size;
|
||||
extern u32 __heapBase;
|
||||
extern u32 __heap_size;
|
||||
fragmented_address = __heapBase + __heap_size;
|
||||
u32 linear_address;
|
||||
mch2.alloc_address = fragmented_address + fragmented_size;
|
||||
fragmented_address = __heapBase + __heap_size;
|
||||
mch2.alloc_address = fragmented_address + fragmented_size;
|
||||
|
||||
svcControlMemory(&linear_address, 0x0, 0x0, linear_size, MEMOP_ALLOC_LINEAR,
|
||||
MEMPERM_READ | MEMPERM_WRITE);
|
||||
svcControlMemory(&linear_address,
|
||||
0x0, 0x0, linear_size, MEMOP_ALLOC_LINEAR,
|
||||
MEMPERM_READ | MEMPERM_WRITE);
|
||||
|
||||
if (fragmented_size)
|
||||
svcControlMemory(&tmp, (u32)fragmented_address, 0x0, fragmented_size, MEMOP_ALLOC,
|
||||
MEMPERM_READ | MEMPERM_WRITE);
|
||||
svcControlMemory(&tmp,
|
||||
(u32)fragmented_address, 0x0, fragmented_size, MEMOP_ALLOC,
|
||||
MEMPERM_READ | MEMPERM_WRITE);
|
||||
|
||||
if (skip_pages)
|
||||
svcControlMemory(&tmp, (u32)linear_address, 0x0, (skip_pages << 12), MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
svcControlMemory(&tmp,
|
||||
(u32)linear_address, 0x0, (skip_pages << 12), MEMOP_FREE,
|
||||
MEMPERM_DONTCARE);
|
||||
|
||||
for (i = skip_pages; i < (linear_size >> 12) ; i += 2)
|
||||
svcControlMemory(&tmp, (u32)linear_address + (i << 12), 0x0, 0x1000, MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
svcControlMemory(&tmp,
|
||||
(u32)linear_address + (i << 12), 0x0, 0x1000,
|
||||
MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
|
||||
u32 alloc_address_kaddr = osConvertVirtToPhys((void*)linear_address) + mch2.kernel_fcram_mapping_offset;
|
||||
alloc_address_kaddr = osConvertVirtToPhys(
|
||||
(void*)linear_address) + mch2.kernel_fcram_mapping_offset;
|
||||
|
||||
mch2.thread_page_kva = get_first_free_basemem_page(mch2.isNew3DS) - 0x10000; // skip down 16 pages
|
||||
mch2.thread_page_kva = get_first_free_basemem_page(mch2.isNew3DS)
|
||||
- 0x10000; /* skip down 16 pages */
|
||||
((u32*)linear_buffer)[0] = 1;
|
||||
((u32*)linear_buffer)[1] = mch2.thread_page_kva;
|
||||
((u32*)linear_buffer)[2] = alloc_address_kaddr + (((mch2.alloc_size >> 12) - 3) << 13) + (skip_pages << 12);
|
||||
|
||||
u32 dst_memchunk = linear_address + (((mch2.alloc_size >> 12) - 2) << 13) + (skip_pages << 12);
|
||||
dst_memchunk = linear_address
|
||||
+ (((mch2.alloc_size >> 12) - 2) << 13)
|
||||
+ (skip_pages << 12);
|
||||
|
||||
memcpy(flush_buffer, flush_buffer + 0x4000, 0x4000);
|
||||
|
||||
@@ -293,18 +315,21 @@ static void do_memchunkhax2(void)
|
||||
GSPGPU_FlushDataCache((void*)linear_buffer, 16);
|
||||
memcpy(flush_buffer, flush_buffer + 0x4000, 0x4000);
|
||||
|
||||
/* can't clear gspEvents[GSPGPU_EVENT_PPF]), directly so execute a dummy copy
|
||||
* and use gspWaitForEvent to clear it. */
|
||||
/* can't clear gspEvents[GSPGPU_EVENT_PPF]),
|
||||
* directly so execute a dummy copy
|
||||
* and use gspWaitForEvent to clear it. */
|
||||
|
||||
/* LightEvent_Clear(&gspEvents[GSPGPU_EVENT_PPF]); */
|
||||
/* LightEvent_Clear(&gspEvents[GSPGPU_EVENT_PPF]); */
|
||||
GX_TextureCopy((void*)linear_buffer, 0, (void*)dst_memchunk, 0, 16, 8);
|
||||
gspWaitForEvent(GSPGPU_EVENT_PPF, false);
|
||||
|
||||
svcCreateThread(&mch2.alloc_thread, (ThreadFunc)alloc_thread_entry, (u32)&mch2,
|
||||
mch2.threads[MCH2_THREAD_COUNT_MAX - 1].stack_top, 0x3F, 1);
|
||||
svcCreateThread(&mch2.alloc_thread,
|
||||
(ThreadFunc)alloc_thread_entry, (u32)&mch2,
|
||||
mch2.threads[MCH2_THREAD_COUNT_MAX - 1].stack_top, 0x3F, 1);
|
||||
|
||||
while ((u32) svcArbitrateAddress(mch2.arbiter, mch2.alloc_address, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 0,
|
||||
0) == 0xD9001814);
|
||||
while ((u32) svcArbitrateAddress(mch2.arbiter, mch2.alloc_address,
|
||||
ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 0,
|
||||
0) == 0xD9001814);
|
||||
|
||||
GX_TextureCopy((void*)linear_buffer, 0, (void*)dst_memchunk, 0, 16, 8);
|
||||
memcpy(flush_buffer, flush_buffer + 0x4000, 0x4000);
|
||||
@@ -313,9 +338,9 @@ static void do_memchunkhax2(void)
|
||||
svcWaitSynchronization(mch2.alloc_thread, U64_MAX);
|
||||
svcCloseHandle(mch2.alloc_thread);
|
||||
|
||||
u32* mapped_page = (u32*)(mch2.alloc_address + mch2.alloc_size - 0x1000);
|
||||
|
||||
volatile u32* thread_ACL = &mapped_page[THREAD_PAGE_ACL_OFFSET >> 2];
|
||||
mapped_page = (u32*)
|
||||
(mch2.alloc_address + mch2.alloc_size - 0x1000);
|
||||
thread_ACL = &mapped_page[THREAD_PAGE_ACL_OFFSET >> 2];
|
||||
|
||||
svcCreateEvent(&mch2.main_thread_lock, 0);
|
||||
svcCreateEvent(&mch2.target_threads_lock, 1);
|
||||
@@ -327,16 +352,18 @@ static void do_memchunkhax2(void)
|
||||
continue;
|
||||
|
||||
mch2.threads[i].args.started_event = mch2.main_thread_lock;
|
||||
mch2.threads[i].args.lock = mch2.target_threads_lock;
|
||||
mch2.threads[i].args.target_kaddr = 0;
|
||||
mch2.threads[i].args.lock = mch2.target_threads_lock;
|
||||
mch2.threads[i].args.target_kaddr = 0;
|
||||
|
||||
thread_ACL[0] = 0;
|
||||
thread_ACL[0] = 0;
|
||||
GSPGPU_FlushDataCache((void*)thread_ACL, 16);
|
||||
GSPGPU_InvalidateDataCache((void*)thread_ACL, 16);
|
||||
|
||||
svcClearEvent(mch2.main_thread_lock);
|
||||
svcCreateThread(&mch2.threads[i].handle, (ThreadFunc)target_thread_entry, (u32)&mch2.threads[i].args,
|
||||
mch2.threads[i].stack_top, 0x18, 0);
|
||||
svcCreateThread(&mch2.threads[i].handle,
|
||||
(ThreadFunc)target_thread_entry,
|
||||
(u32)&mch2.threads[i].args,
|
||||
mch2.threads[i].stack_top, 0x18, 0);
|
||||
svcWaitSynchronization(mch2.main_thread_lock, U64_MAX);
|
||||
|
||||
if (thread_ACL[0])
|
||||
@@ -344,8 +371,10 @@ static void do_memchunkhax2(void)
|
||||
thread_ACL[SVC_ACL_OFFSET(0x7B) >> 2] = SVC_ACL_MASK(0x7B);
|
||||
GSPGPU_FlushDataCache((void*)thread_ACL, 16);
|
||||
GSPGPU_InvalidateDataCache((void*)thread_ACL, 16);
|
||||
mch2.threads[i].args.target_kaddr = get_thread_page() + THREAD_PAGE_ACL_OFFSET + SVC_ACL_OFFSET(0x7B);
|
||||
mch2.threads[i].args.target_val = SVC_ACL_MASK(0x7B);
|
||||
mch2.threads[i].args.target_kaddr = get_thread_page()
|
||||
+ THREAD_PAGE_ACL_OFFSET
|
||||
+ SVC_ACL_OFFSET(0x7B);
|
||||
mch2.threads[i].args.target_val = SVC_ACL_MASK(0x7B);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -367,14 +396,18 @@ static void do_memchunkhax2(void)
|
||||
svcCloseHandle(mch2.target_threads_lock);
|
||||
svcCloseHandle(mch2.main_thread_lock);
|
||||
|
||||
svcControlMemory(&tmp, mch2.alloc_address, 0, mch2.alloc_size, MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
svcControlMemory(&tmp, mch2.alloc_address, 0, mch2.alloc_size,
|
||||
MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
write_kaddr(alloc_address_kaddr + linear_size - 0x3000 + 0x4, alloc_address_kaddr + linear_size - 0x1000);
|
||||
svcControlMemory(&tmp, (u32)fragmented_address, 0x0, fragmented_size, MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
svcControlMemory(&tmp, (u32)fragmented_address, 0x0, fragmented_size,
|
||||
MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
|
||||
for (i = 1 + skip_pages; i < (linear_size >> 12) ; i += 2)
|
||||
svcControlMemory(&tmp, (u32)linear_address + (i << 12), 0x0, 0x1000, MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
svcControlMemory(&tmp, (u32)linear_address + (i << 12), 0x0, 0x1000,
|
||||
MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
|
||||
svcControlMemory(&tmp, linear_buffer, 0, 0x1000, MEMOP_FREE, MEMPERM_DONTCARE);
|
||||
svcControlMemory(&tmp, linear_buffer, 0, 0x1000, MEMOP_FREE,
|
||||
MEMPERM_DONTCARE);
|
||||
|
||||
APT_SetAppCpuTimeLimit(mch2.old_cpu_time_limit);
|
||||
}
|
||||
@@ -404,8 +437,9 @@ static void gspwn(u32 dst, u32 src, u32 size, u8* flush_buffer)
|
||||
* *(u32*)val1 = 0x0;
|
||||
*/
|
||||
|
||||
// X-X--X-X
|
||||
// X-XXXX-X
|
||||
/* X-X--X-X
|
||||
* X-XXXX-X
|
||||
*/
|
||||
|
||||
static void memchunkhax1_write_pair(u32 val1, u32 val2)
|
||||
{
|
||||
@@ -419,7 +453,8 @@ static void memchunkhax1_write_pair(u32 val1, u32 val2)
|
||||
u32* next_ptr1;
|
||||
u32* prev_ptr6;
|
||||
|
||||
svcControlMemory(&linear_buffer, 0, 0, 0x10000, MEMOP_ALLOC_LINEAR, MEMPERM_READ | MEMPERM_WRITE);
|
||||
svcControlMemory(&linear_buffer, 0, 0, 0x10000,
|
||||
MEMOP_ALLOC_LINEAR, MEMPERM_READ | MEMPERM_WRITE);
|
||||
|
||||
flush_buffer = (u8*)(linear_buffer + 0x8000);
|
||||
|
||||
@@ -427,23 +462,24 @@ static void memchunkhax1_write_pair(u32 val1, u32 val2)
|
||||
svcControlMemory(&tmp, linear_buffer + 0x3000, 0, 0x2000, MEMOP_FREE, 0);
|
||||
svcControlMemory(&tmp, linear_buffer + 0x6000, 0, 0x1000, MEMOP_FREE, 0);
|
||||
|
||||
next_ptr1 = (u32*)(linear_buffer + 0x0004);
|
||||
next_ptr1 = (u32*)(linear_buffer + 0x0004);
|
||||
gspwn(linear_buffer + 0x0000, linear_buffer + 0x1000, 16, flush_buffer);
|
||||
|
||||
next_ptr3 = (u32*)(linear_buffer + 0x2004);
|
||||
prev_ptr3 = (u32*)(linear_buffer + 0x2008);
|
||||
next_ptr3 = (u32*)(linear_buffer + 0x2004);
|
||||
prev_ptr3 = (u32*)(linear_buffer + 0x2008);
|
||||
gspwn(linear_buffer + 0x2000, linear_buffer + 0x3000, 16, flush_buffer);
|
||||
|
||||
prev_ptr6 = (u32*)(linear_buffer + 0x5008);
|
||||
prev_ptr6 = (u32*)(linear_buffer + 0x5008);
|
||||
gspwn(linear_buffer + 0x5000, linear_buffer + 0x6000, 16, flush_buffer);
|
||||
|
||||
*next_ptr1 = *next_ptr3;
|
||||
*prev_ptr6 = *prev_ptr3;
|
||||
*next_ptr1 = *next_ptr3;
|
||||
*prev_ptr6 = *prev_ptr3;
|
||||
|
||||
*prev_ptr3 = val1 - 4;
|
||||
*next_ptr3 = val2;
|
||||
*prev_ptr3 = val1 - 4;
|
||||
*next_ptr3 = val2;
|
||||
gspwn(linear_buffer + 0x3000, linear_buffer + 0x2000, 16, flush_buffer);
|
||||
svcControlMemory(&tmp, 0, 0, 0x2000, MEMOP_ALLOC_LINEAR, MEMPERM_READ | MEMPERM_WRITE);
|
||||
svcControlMemory(&tmp, 0, 0, 0x2000,
|
||||
MEMOP_ALLOC_LINEAR, MEMPERM_READ | MEMPERM_WRITE);
|
||||
|
||||
gspwn(linear_buffer + 0x1000, linear_buffer + 0x0000, 16, flush_buffer);
|
||||
gspwn(linear_buffer + 0x6000, linear_buffer + 0x5000, 16, flush_buffer);
|
||||
@@ -451,38 +487,42 @@ static void memchunkhax1_write_pair(u32 val1, u32 val2)
|
||||
svcControlMemory(&tmp, linear_buffer + 0x0000, 0, 0x1000, MEMOP_FREE, 0);
|
||||
svcControlMemory(&tmp, linear_buffer + 0x2000, 0, 0x4000, MEMOP_FREE, 0);
|
||||
svcControlMemory(&tmp, linear_buffer + 0x7000, 0, 0x9000, MEMOP_FREE, 0);
|
||||
|
||||
}
|
||||
|
||||
static void do_memchunkhax1(void)
|
||||
{
|
||||
u32 saved_vram_value = *(u32*)0x1F000008;
|
||||
|
||||
// 0x1F000000 contains the enable bit for svc 0x7B
|
||||
memchunkhax1_write_pair(get_thread_page() + THREAD_PAGE_ACL_OFFSET + SVC_ACL_OFFSET(0x7B), 0x1F000000);
|
||||
/* 0x1F000000 contains the enable bit for svc 0x7B */
|
||||
memchunkhax1_write_pair(get_thread_page()
|
||||
+ THREAD_PAGE_ACL_OFFSET
|
||||
+ SVC_ACL_OFFSET(0x7B), 0x1F000000);
|
||||
|
||||
write_kaddr(0x1F000008, saved_vram_value);
|
||||
}
|
||||
|
||||
Result get_luma_version(u32 *major, u32 *minor) {
|
||||
s64 out;
|
||||
u32 version;
|
||||
Result get_luma_version(u32 *major, u32 *minor)
|
||||
{
|
||||
s64 out;
|
||||
u32 version;
|
||||
|
||||
if (R_FAILED(svcGetSystemInfo(&out, 0x10000, 0)))
|
||||
return -1;
|
||||
if (R_FAILED(svcGetSystemInfo(&out, 0x10000, 0)))
|
||||
return -1;
|
||||
|
||||
version = (u32)out;
|
||||
*major = GET_VERSION_MAJOR(version);
|
||||
*minor = GET_VERSION_MINOR(version);
|
||||
return 0;
|
||||
version = (u32)out;
|
||||
*major = GET_VERSION_MAJOR(version);
|
||||
*minor = GET_VERSION_MINOR(version);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Result svchax_init(bool patch_srv)
|
||||
{
|
||||
bool isNew3DS;
|
||||
u32 kver;
|
||||
|
||||
APT_CheckNew3DS(&isNew3DS);
|
||||
|
||||
u32 kver = osGetKernelVersion();
|
||||
kver = osGetKernelVersion();
|
||||
|
||||
if (!__ctr_svchax)
|
||||
{
|
||||
@@ -491,9 +531,11 @@ Result svchax_init(bool patch_srv)
|
||||
u32 luma_major, luma_minor;
|
||||
|
||||
if (kver > SYSTEM_VERSION(2, 50, 11) &&
|
||||
(R_FAILED(get_luma_version(&luma_major, &luma_minor) || luma_major < 8)))
|
||||
(R_FAILED(get_luma_version(&luma_major, &luma_minor)
|
||||
|| luma_major < 8)))
|
||||
return -1;
|
||||
else if (kver > SYSTEM_VERSION(2, 46, 0) && kver <= SYSTEM_VERSION(2, 50, 11))
|
||||
else if (kver > SYSTEM_VERSION(2, 46, 0)
|
||||
&& kver <= SYSTEM_VERSION(2, 50, 11))
|
||||
do_memchunkhax2();
|
||||
else if (kver <= SYSTEM_VERSION(2, 46, 0))
|
||||
do_memchunkhax1();
|
||||
@@ -506,8 +548,9 @@ Result svchax_init(bool patch_srv)
|
||||
|
||||
if (patch_srv && !__ctr_svchax_srv)
|
||||
{
|
||||
u32 PID_kaddr = read_kaddr(CURRENT_KPROCESS) + (isNew3DS ? 0xBC : (kver > SYSTEM_VERSION(2, 40, 0)) ? 0xB4 : 0xAC);
|
||||
u32 old_PID = read_kaddr(PID_kaddr);
|
||||
u32 PID_kaddr = read_kaddr(CURRENT_KPROCESS)
|
||||
+ (isNew3DS ? 0xBC : (kver > SYSTEM_VERSION(2, 40, 0)) ? 0xB4 : 0xAC);
|
||||
u32 old_PID = read_kaddr(PID_kaddr);
|
||||
write_kaddr(PID_kaddr, 0);
|
||||
srvExit();
|
||||
srvInit();
|
||||
|
||||
+40
-37
@@ -10,6 +10,7 @@
|
||||
|
||||
#define CTR_APPMEMALLOC_PTR ((u32*)0x1FF80040)
|
||||
|
||||
/* Global variables */
|
||||
u32 __stacksize__ = 0x00400000;
|
||||
u32 __linear_heap_size = 0x01000000;
|
||||
|
||||
@@ -22,22 +23,24 @@ u32 __stack_size_extra;
|
||||
|
||||
extern u32 __linear_heap_size_hbl;
|
||||
extern u32 __heap_size_hbl;
|
||||
extern void* __service_ptr;
|
||||
|
||||
extern void (*__system_retAddr)(void);
|
||||
|
||||
/* Forward declarations */
|
||||
void envDestroyHandles(void);
|
||||
void __appExit();
|
||||
void __appExit(void);
|
||||
void __libc_fini_array(void);
|
||||
|
||||
void __appInit();
|
||||
void __appInit(void);
|
||||
void __libc_init_array(void);
|
||||
void __system_initSyscalls(void);
|
||||
void __system_initArgv();
|
||||
void __system_initArgv(void);
|
||||
|
||||
void __ctru_exit(int rc);
|
||||
int __libctru_gtod(struct _reent* ptr, struct timeval* tp, struct timezone* tz);
|
||||
int __libctru_gtod(struct _reent* ptr,
|
||||
struct timeval* tp, struct timezone* tz);
|
||||
void (*__system_retAddr)(void);
|
||||
extern void* __service_ptr;
|
||||
|
||||
Result __sync_init(void) __attribute__((weak));
|
||||
|
||||
@@ -140,37 +143,41 @@ extern const char* __system_arglist;
|
||||
char __argv_hmac[0x20] = {0x1d, 0x78, 0xff, 0xb9, 0xc5, 0xbc, 0x78, 0xb7, 0xac, 0x29, 0x1d, 0x3e, 0x16, 0xd0, 0xcf, 0x53,
|
||||
0xef, 0x12, 0x58, 0x83, 0xb6, 0x9e, 0x2f, 0x79, 0x47, 0xf9, 0x35, 0x61, 0xeb, 0x50, 0xd7, 0x67};
|
||||
|
||||
Result APT_ReceiveDeliverArg_(void* param, size_t param_size, void* hmac, size_t hmac_size, u64* source_pid, bool* received)
|
||||
Result APT_ReceiveDeliverArg_(void* param, size_t param_size,
|
||||
void* hmac, size_t hmac_size, u64* source_pid, bool* received)
|
||||
{
|
||||
u32 cmdbuf[16];
|
||||
cmdbuf[0]=IPC_MakeHeader(0x35,2,0);
|
||||
cmdbuf[1]=param_size;
|
||||
cmdbuf[2]=hmac_size;
|
||||
|
||||
u32 saved_threadstorage[4];
|
||||
u32* staticbufs = getThreadStaticBuffers();
|
||||
saved_threadstorage[0]=staticbufs[0];
|
||||
saved_threadstorage[1]=staticbufs[1];
|
||||
saved_threadstorage[2]=staticbufs[2];
|
||||
saved_threadstorage[3]=staticbufs[3];
|
||||
staticbufs[0]=IPC_Desc_StaticBuffer(param_size, 0);
|
||||
staticbufs[1]=(u32)param;
|
||||
staticbufs[2]=IPC_Desc_StaticBuffer(hmac_size, 2);
|
||||
staticbufs[3]=(u32)hmac;
|
||||
u32 *staticbufs;
|
||||
Result ret;
|
||||
|
||||
Result ret = aptSendCommand(cmdbuf);
|
||||
staticbufs[0]=saved_threadstorage[0];
|
||||
staticbufs[1]=saved_threadstorage[1];
|
||||
staticbufs[2]=saved_threadstorage[2];
|
||||
staticbufs[3]=saved_threadstorage[3];
|
||||
cmdbuf[0] = IPC_MakeHeader(0x35,2,0);
|
||||
cmdbuf[1] = param_size;
|
||||
cmdbuf[2] = hmac_size;
|
||||
|
||||
staticbufs = getThreadStaticBuffers();
|
||||
saved_threadstorage[0] = staticbufs[0];
|
||||
saved_threadstorage[1] = staticbufs[1];
|
||||
saved_threadstorage[2] = staticbufs[2];
|
||||
saved_threadstorage[3] = staticbufs[3];
|
||||
staticbufs[0] = IPC_Desc_StaticBuffer(param_size, 0);
|
||||
staticbufs[1] = (u32)param;
|
||||
staticbufs[2] = IPC_Desc_StaticBuffer(hmac_size, 2);
|
||||
staticbufs[3] = (u32)hmac;
|
||||
|
||||
ret = aptSendCommand(cmdbuf);
|
||||
staticbufs[0] = saved_threadstorage[0];
|
||||
staticbufs[1] = saved_threadstorage[1];
|
||||
staticbufs[2] = saved_threadstorage[2];
|
||||
staticbufs[3] = saved_threadstorage[3];
|
||||
|
||||
if(R_FAILED(ret))
|
||||
return ret;
|
||||
|
||||
if(source_pid)
|
||||
*source_pid = ((u64*)cmdbuf)[1];
|
||||
*source_pid = ((u64*)cmdbuf)[1];
|
||||
if(received)
|
||||
*received = ((bool*)cmdbuf)[16];
|
||||
*received = ((bool*)cmdbuf)[16];
|
||||
|
||||
return cmdbuf[1];
|
||||
}
|
||||
@@ -202,13 +209,15 @@ void __system_initArgv(void)
|
||||
|
||||
if (__system_argc)
|
||||
{
|
||||
__system_argv = (char**) malloc((__system_argc + 1) * sizeof(char**));
|
||||
__system_argv[0] = arg_struct->args;
|
||||
__system_argv = (char**)malloc(
|
||||
(__system_argc + 1) * sizeof(char**));
|
||||
__system_argv[0] = arg_struct->args;
|
||||
for (i = 1; i < __system_argc; i++)
|
||||
__system_argv[i] = __system_argv[i - 1] + strlen(__system_argv[i - 1]) + 1;
|
||||
|
||||
i = __system_argc - 1;
|
||||
i = __system_argc - 1;
|
||||
__system_argc = 1;
|
||||
|
||||
while (i)
|
||||
{
|
||||
if(__system_argv[i] && isalnum(__system_argv[i][0])
|
||||
@@ -223,8 +232,8 @@ void __system_initArgv(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
__system_argc = 1;
|
||||
__system_argv = (char**) malloc(sizeof(char**) * 2);
|
||||
__system_argc = 1;
|
||||
__system_argv = (char**) malloc(sizeof(char**) * 2);
|
||||
__system_argv[0] = "sdmc:/retroarch/retroarch";
|
||||
}
|
||||
__system_argv[__system_argc] = NULL;
|
||||
@@ -269,8 +278,6 @@ void dump_result_value(Result val)
|
||||
printf("level : %u\n", res.level);
|
||||
}
|
||||
|
||||
bool select_pressed = false;
|
||||
|
||||
void wait_for_input(void)
|
||||
{
|
||||
printf("\n\nPress Start.\n\n");
|
||||
@@ -290,10 +297,6 @@ void wait_for_input(void)
|
||||
if (kDown & KEY_SELECT)
|
||||
exit(0);
|
||||
|
||||
#if 0
|
||||
select_pressed = true;
|
||||
#endif
|
||||
|
||||
svcSleepThread(1000000);
|
||||
}
|
||||
}
|
||||
|
||||
+73
-58
@@ -9,75 +9,90 @@ extern const loaderFuncs_s loader_Ninjhax1;
|
||||
extern const loaderFuncs_s loader_Ninjhax2;
|
||||
extern const loaderFuncs_s loader_Rosalina;
|
||||
|
||||
static void (*launch_3dsx)(const char* path, argData_s* args, executableMetadata_s* em);
|
||||
static void (*launch_3dsx)(const char* path,
|
||||
argData_s* args, executableMetadata_s* em);
|
||||
|
||||
static int exec_3dsx_actual(const char* path, const char** args, bool appendPath){
|
||||
struct stat sBuff;
|
||||
argData_s newProgramArgs;
|
||||
unsigned int argChars = 0;
|
||||
unsigned int argNum = 0;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
static int exec_3dsx_actual(const char* path,
|
||||
const char** args, bool appendPath)
|
||||
{
|
||||
bool inited;
|
||||
bool fileExists;
|
||||
struct stat sBuff;
|
||||
argData_s newProgramArgs;
|
||||
unsigned int argChars = 0;
|
||||
unsigned int argNum = 0;
|
||||
|
||||
if(path == NULL || path[0] == '\0'){
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
if (!path || path[0] == '\0')
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if(!fileExists){
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if(S_ISDIR(sBuff.st_mode)){
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if (!fileExists)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if (S_ISDIR(sBuff.st_mode))
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
//args the string functions write to the passed string, this will cause a write to read only memory sot the string must be cloned
|
||||
memset(newProgramArgs.buf, '\0', sizeof(newProgramArgs.buf));
|
||||
newProgramArgs.dst = (char*)&newProgramArgs.buf[1];
|
||||
if(appendPath){
|
||||
strcpy(newProgramArgs.dst, path);
|
||||
newProgramArgs.dst += strlen(path) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
/* args the string functions write to the passed string,
|
||||
* this will cause a write to read only memory,
|
||||
* so the string must be cloned */
|
||||
memset(newProgramArgs.buf, '\0', sizeof(newProgramArgs.buf));
|
||||
newProgramArgs.dst = (char*)&newProgramArgs.buf[1];
|
||||
if (appendPath)
|
||||
{
|
||||
strcpy(newProgramArgs.dst, path);
|
||||
newProgramArgs.dst += strlen(path) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
}
|
||||
|
||||
}
|
||||
while(args[argNum] != NULL){
|
||||
strcpy(newProgramArgs.dst, args[argNum]);
|
||||
newProgramArgs.dst += strlen(args[argNum]) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
argNum++;
|
||||
}
|
||||
while(args[argNum])
|
||||
{
|
||||
strcpy(newProgramArgs.dst, args[argNum]);
|
||||
newProgramArgs.dst += strlen(args[argNum]) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
argNum++;
|
||||
}
|
||||
|
||||
inited = loader_Rosalina.init();
|
||||
launch_3dsx = loader_Rosalina.launchFile;
|
||||
inited = loader_Rosalina.init();
|
||||
launch_3dsx = loader_Rosalina.launchFile;
|
||||
|
||||
if(!inited){
|
||||
inited = loader_Ninjhax2.init();
|
||||
launch_3dsx = loader_Ninjhax2.launchFile;
|
||||
}
|
||||
if (!inited)
|
||||
{
|
||||
inited = loader_Ninjhax2.init();
|
||||
launch_3dsx = loader_Ninjhax2.launchFile;
|
||||
}
|
||||
|
||||
if(!inited){
|
||||
inited = loader_Ninjhax1.init();
|
||||
launch_3dsx = loader_Ninjhax1.launchFile;
|
||||
}
|
||||
if (!inited)
|
||||
{
|
||||
inited = loader_Ninjhax1.init();
|
||||
launch_3dsx = loader_Ninjhax1.launchFile;
|
||||
}
|
||||
|
||||
if(inited){
|
||||
osSetSpeedupEnable(false);
|
||||
launch_3dsx(path, &newProgramArgs, NULL);
|
||||
exit(0);
|
||||
}
|
||||
if (inited)
|
||||
{
|
||||
osSetSpeedupEnable(false);
|
||||
launch_3dsx(path, &newProgramArgs, NULL);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//should never be reached
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
/* should never be reached */
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int exec_3dsx(const char* path, const char** args){
|
||||
return exec_3dsx_actual(path, args, true/*appendPath*/);
|
||||
int exec_3dsx(const char* path, const char** args)
|
||||
{
|
||||
return exec_3dsx_actual(path, args, true/*appendPath*/);
|
||||
}
|
||||
|
||||
int exec_3dsx_no_path_in_args(const char* path, const char** args){
|
||||
return exec_3dsx_actual(path, args, false/*appendPath*/);
|
||||
}
|
||||
int exec_3dsx_no_path_in_args(const char* path, const char** args)
|
||||
{
|
||||
return exec_3dsx_actual(path, args, false/*appendPath*/);
|
||||
}
|
||||
@@ -1,9 +1,14 @@
|
||||
#ifndef EXEC_3DSX_H
|
||||
#define EXEC_3DSX_H
|
||||
|
||||
//since 3dsx programs are not guaranteed access to the OS, the 3dsx bootloader run by the exploit must run the next program
|
||||
//your program must have no extra threads running when this is called, these limits do not apply to exec_cia
|
||||
/* since 3dsx programs are not guaranteed access to the OS,
|
||||
* the 3dsx bootloader run by the exploit must run the next program
|
||||
*
|
||||
* your program must have no extra threads running when this is called,
|
||||
* these limits do not apply to exec_cia
|
||||
*/
|
||||
int exec_3dsx_no_path_in_args(const char* path, const char** args);
|
||||
|
||||
int exec_3dsx(const char* path, const char** args);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
+179
-152
@@ -6,194 +6,221 @@
|
||||
|
||||
#define FILE_CHUNK_SIZE 4096
|
||||
|
||||
typedef struct{
|
||||
u32 argc;
|
||||
char args[0x300 - 0x4];
|
||||
typedef struct
|
||||
{
|
||||
u32 argc;
|
||||
char args[0x300 - 0x4];
|
||||
}ciaParam;
|
||||
|
||||
char argvHmac[0x20] = {0x1d, 0x78, 0xff, 0xb9, 0xc5, 0xbc, 0x78, 0xb7, 0xac, 0x29, 0x1d, 0x3e, 0x16, 0xd0, 0xcf, 0x53, 0xef, 0x12, 0x58, 0x83, 0xb6, 0x9e, 0x2f, 0x79, 0x47, 0xf9, 0x35, 0x61, 0xeb, 0x50, 0xd7, 0x67};
|
||||
|
||||
static void errorAndQuit(const char* errorStr){
|
||||
errorConf error;
|
||||
static void errorAndQuit(const char* errorStr)
|
||||
{
|
||||
errorConf error;
|
||||
|
||||
errorInit(&error, ERROR_TEXT, CFG_LANGUAGE_EN);
|
||||
errorText(&error, errorStr);
|
||||
errorDisp(&error);
|
||||
exit(0);
|
||||
errorInit(&error, ERROR_TEXT, CFG_LANGUAGE_EN);
|
||||
errorText(&error, errorStr);
|
||||
errorDisp(&error);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static int isCiaInstalled(u64 titleId, u16 version){
|
||||
u32 titlesToRetrieve;
|
||||
u32 titlesRetrieved;
|
||||
u64* titleIds;
|
||||
bool titleExists = false;
|
||||
AM_TitleEntry titleInfo;
|
||||
Result failed;
|
||||
static int isCiaInstalled(u64 titleId, u16 version)
|
||||
{
|
||||
u32 titlesToRetrieve;
|
||||
u32 titlesRetrieved;
|
||||
u64* titleIds;
|
||||
u32 titlesToCheck;
|
||||
AM_TitleEntry titleInfo;
|
||||
bool titleExists = false;
|
||||
Result failed = AM_GetTitleCount(MEDIATYPE_SD, &titlesToRetrieve);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
failed = AM_GetTitleCount(MEDIATYPE_SD, &titlesToRetrieve);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
titleIds = malloc(titlesToRetrieve * sizeof(uint64_t));
|
||||
if (!titleIds)
|
||||
return -1;
|
||||
|
||||
titleIds = malloc(titlesToRetrieve * sizeof(uint64_t));
|
||||
if(titleIds == NULL)
|
||||
return -1;
|
||||
failed = AM_GetTitleList(&titlesRetrieved, MEDIATYPE_SD, titlesToRetrieve, titleIds);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
failed = AM_GetTitleList(&titlesRetrieved, MEDIATYPE_SD, titlesToRetrieve, titleIds);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
for(titlesToCheck = 0; titlesToCheck < titlesRetrieved; titlesToCheck++)
|
||||
{
|
||||
if (titleIds[titlesToCheck] == titleId)
|
||||
{
|
||||
titleExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for(u32 titlesToCheck = 0; titlesToCheck < titlesRetrieved; titlesToCheck++){
|
||||
if(titleIds[titlesToCheck] == titleId){
|
||||
titleExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(titleIds);
|
||||
|
||||
free(titleIds);
|
||||
if (titleExists)
|
||||
{
|
||||
failed = AM_GetTitleInfo(MEDIATYPE_SD,
|
||||
1 /*titleCount*/, &titleId, &titleInfo);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
if(titleExists){
|
||||
failed = AM_GetTitleInfo(MEDIATYPE_SD, 1 /*titleCount*/, &titleId, &titleInfo);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
if (titleInfo.version == version)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(titleInfo.version == version)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int installCia(Handle ciaFile){
|
||||
Result failed;
|
||||
Handle outputHandle;
|
||||
u64 fileSize;
|
||||
u64 fileOffset = 0;
|
||||
u32 bytesRead;
|
||||
u32 bytesWritten;
|
||||
u8 transferBuffer[FILE_CHUNK_SIZE];
|
||||
static int installCia(Handle ciaFile)
|
||||
{
|
||||
Handle outputHandle;
|
||||
u64 fileSize;
|
||||
u32 bytesRead;
|
||||
u32 bytesWritten;
|
||||
u8 transferBuffer[FILE_CHUNK_SIZE];
|
||||
u64 fileOffset = 0;
|
||||
Result failed = AM_StartCiaInstall(MEDIATYPE_SD, &outputHandle);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
failed = AM_StartCiaInstall(MEDIATYPE_SD, &outputHandle);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
failed = FSFILE_GetSize(ciaFile, &fileSize);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
failed = FSFILE_GetSize(ciaFile, &fileSize);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
while(fileOffset < fileSize)
|
||||
{
|
||||
u64 bytesRemaining = fileSize - fileOffset;
|
||||
failed = FSFILE_Read(ciaFile, &bytesRead,
|
||||
fileOffset, transferBuffer,
|
||||
bytesRemaining < FILE_CHUNK_SIZE
|
||||
? bytesRemaining
|
||||
: FILE_CHUNK_SIZE);
|
||||
if (R_FAILED(failed))
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while(fileOffset < fileSize){
|
||||
u64 bytesRemaining = fileSize - fileOffset;
|
||||
failed = FSFILE_Read(ciaFile, &bytesRead, fileOffset, transferBuffer, bytesRemaining < FILE_CHUNK_SIZE ? bytesRemaining : FILE_CHUNK_SIZE);
|
||||
if(R_FAILED(failed)){
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
failed = FSFILE_Write(outputHandle, &bytesWritten,
|
||||
fileOffset, transferBuffer, bytesRead, 0);
|
||||
if (R_FAILED(failed))
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
if (R_DESCRIPTION(failed) == RD_ALREADY_EXISTS)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
failed = FSFILE_Write(outputHandle, &bytesWritten, fileOffset, transferBuffer, bytesRead, 0);
|
||||
if(R_FAILED(failed)){
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
if(R_DESCRIPTION(failed) == RD_ALREADY_EXISTS)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
if (bytesWritten != bytesRead)
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(bytesWritten != bytesRead){
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
fileOffset += bytesWritten;
|
||||
}
|
||||
|
||||
fileOffset += bytesWritten;
|
||||
}
|
||||
failed = AM_FinishCiaInstall(outputHandle);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
failed = AM_FinishCiaInstall(outputHandle);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int exec_cia(const char* path, const char** args){
|
||||
struct stat sBuff;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
int exec_cia(const char* path, const char** args)
|
||||
{
|
||||
struct stat sBuff;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
|
||||
if(path == NULL || path[0] == '\0'){
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
if (!path || path[0] == '\0')
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if(!fileExists){
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if(S_ISDIR(sBuff.st_mode)){
|
||||
errno = EINVAL;;
|
||||
return -1;
|
||||
}
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if (!fileExists)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if (S_ISDIR(sBuff.st_mode))
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
inited = R_SUCCEEDED(amInit()) && R_SUCCEEDED(fsInit());
|
||||
if(inited){
|
||||
Result res;
|
||||
AM_TitleEntry ciaInfo;
|
||||
FS_Archive ciaArchive;
|
||||
Handle ciaFile;
|
||||
int ciaInstalled;
|
||||
ciaParam param;
|
||||
int argsLength;
|
||||
inited = R_SUCCEEDED(amInit()) && R_SUCCEEDED(fsInit());
|
||||
|
||||
//open cia file
|
||||
res = FSUSER_OpenArchive(&ciaArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""));
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("Cant open SD FS archive.");
|
||||
if (inited)
|
||||
{
|
||||
AM_TitleEntry ciaInfo;
|
||||
FS_Archive ciaArchive;
|
||||
Handle ciaFile;
|
||||
int ciaInstalled;
|
||||
ciaParam param;
|
||||
int argsLength;
|
||||
/* open CIA file */
|
||||
Result res = FSUSER_OpenArchive(&ciaArchive,
|
||||
ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""));
|
||||
|
||||
res = FSUSER_OpenFile(&ciaFile, ciaArchive, fsMakePath(PATH_ASCII, path + 5/*skip "sdmc:"*/), FS_OPEN_READ, 0);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("Cant open CIA file.");
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("Cant open SD FS archive.");
|
||||
|
||||
res = AM_GetCiaFileInfo(MEDIATYPE_SD, &ciaInfo, ciaFile);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("Cant get CIA file info.");
|
||||
res = FSUSER_OpenFile(&ciaFile,
|
||||
ciaArchive, fsMakePath(PATH_ASCII, path + 5/*skip "sdmc:"*/),
|
||||
FS_OPEN_READ, 0);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("Cant open CIA file.");
|
||||
|
||||
ciaInstalled = isCiaInstalled(ciaInfo.titleID, ciaInfo.version);
|
||||
if(ciaInstalled == -1){
|
||||
//error
|
||||
errorAndQuit("Could not read title id list.");
|
||||
}
|
||||
else if(ciaInstalled == 0){
|
||||
//not installed
|
||||
int error = installCia(ciaFile);
|
||||
if(error == -1)
|
||||
errorAndQuit("Cant install CIA.");
|
||||
}
|
||||
res = AM_GetCiaFileInfo(MEDIATYPE_SD, &ciaInfo, ciaFile);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("Cant get CIA file info.");
|
||||
|
||||
FSFILE_Close(ciaFile);
|
||||
FSUSER_CloseArchive(ciaArchive);
|
||||
ciaInstalled = isCiaInstalled(ciaInfo.titleID, ciaInfo.version);
|
||||
if (ciaInstalled == -1)
|
||||
{
|
||||
/* error */
|
||||
errorAndQuit("Could not read title ID list.");
|
||||
}
|
||||
else if (ciaInstalled == 0)
|
||||
{
|
||||
/* not installed */
|
||||
int error = installCia(ciaFile);
|
||||
if (error == -1)
|
||||
errorAndQuit("Cant install CIA.");
|
||||
}
|
||||
|
||||
param.argc = 0;
|
||||
argsLength = 0;
|
||||
char* argLocation = param.args;
|
||||
while(args[param.argc] != NULL){
|
||||
strcpy(argLocation, args[param.argc]);
|
||||
argLocation += strlen(args[param.argc]) + 1;
|
||||
argsLength += strlen(args[param.argc]) + 1;
|
||||
param.argc++;
|
||||
}
|
||||
FSFILE_Close(ciaFile);
|
||||
FSUSER_CloseArchive(ciaArchive);
|
||||
|
||||
res = APT_PrepareToDoApplicationJump(0, ciaInfo.titleID, 0x1);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant prepare.");
|
||||
param.argc = 0;
|
||||
argsLength = 0;
|
||||
char *argLocation = param.args;
|
||||
|
||||
res = APT_DoApplicationJump(¶m, sizeof(param.argc) + argsLength, argvHmac);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant jump.");
|
||||
while(args[param.argc])
|
||||
{
|
||||
strcpy(argLocation, args[param.argc]);
|
||||
argLocation += strlen(args[param.argc]) + 1;
|
||||
argsLength += strlen(args[param.argc]) + 1;
|
||||
param.argc++;
|
||||
}
|
||||
|
||||
//wait for application jump, for some reason its not instant
|
||||
while(1);
|
||||
}
|
||||
res = APT_PrepareToDoApplicationJump(0, ciaInfo.titleID, 0x1);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant prepare.");
|
||||
|
||||
//should never be reached
|
||||
amExit();
|
||||
fsExit();
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
res = APT_DoApplicationJump(¶m, sizeof(param.argc)
|
||||
+ argsLength, argvHmac);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant jump.");
|
||||
|
||||
/* wait for application jump, for some reason its not instant */
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* should never be reached */
|
||||
amExit();
|
||||
fsExit();
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
// C stdlib includes
|
||||
/* C stdlib includes */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
// 3DS includes
|
||||
/* 3DS includes */
|
||||
#include <3ds.h>
|
||||
|
||||
#define ENTRY_ARGBUFSIZE 0x400
|
||||
@@ -73,7 +73,7 @@ typedef struct
|
||||
u32 processAppCodeAddress;
|
||||
u32 processHookTidLow, processHookTidHigh;
|
||||
u32 mediatype;
|
||||
bool capabilities[0x10]; // {socuAccess, csndAccess, qtmAccess, nfcAccess, httpcAccess, reserved...}
|
||||
bool capabilities[0x10]; /* {socuAccess, csndAccess, qtmAccess, nfcAccess, httpcAccess, reserved...} */
|
||||
} memmap_header_t;
|
||||
|
||||
typedef struct
|
||||
|
||||
@@ -2,21 +2,25 @@
|
||||
|
||||
Handle launchOpenFile(const char* path)
|
||||
{
|
||||
if (strncmp(path, "sdmc:/", 6) == 0)
|
||||
path += 5;
|
||||
else if (*path != '/')
|
||||
return 0;
|
||||
Handle file;
|
||||
Result res;
|
||||
ssize_t units;
|
||||
static uint16_t __utf16path[PATH_MAX+1];
|
||||
|
||||
// Convert the executable path to UTF-16
|
||||
static uint16_t __utf16path[PATH_MAX+1];
|
||||
ssize_t units = utf8_to_utf16(__utf16path, (const uint8_t*)path, PATH_MAX);
|
||||
if (units < 0 || units >= PATH_MAX) return 0;
|
||||
__utf16path[units] = 0;
|
||||
if (strncmp(path, "sdmc:/", 6) == 0)
|
||||
path += 5;
|
||||
else if (*path != '/')
|
||||
return 0;
|
||||
|
||||
// Open the file directly
|
||||
FS_Path apath = { PATH_EMPTY, 1, (u8*)"" };
|
||||
FS_Path fpath = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
|
||||
Handle file;
|
||||
Result res = FSUSER_OpenFileDirectly(&file, ARCHIVE_SDMC, apath, fpath, FS_OPEN_READ, 0);
|
||||
return R_SUCCEEDED(res) ? file : 0;
|
||||
/* Convert the executable path to UTF-16 */
|
||||
units = utf8_to_utf16(__utf16path, (const uint8_t*)path, PATH_MAX);
|
||||
if (units < 0 || units >= PATH_MAX) return 0;
|
||||
__utf16path[units] = 0;
|
||||
|
||||
/* Open the file directly */
|
||||
FS_Path apath = { PATH_EMPTY, 1, (u8*)"" };
|
||||
FS_Path fpath = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
|
||||
res = FSUSER_OpenFileDirectly(&file, ARCHIVE_SDMC,
|
||||
apath, fpath, FS_OPEN_READ, 0);
|
||||
return R_SUCCEEDED(res) ? file : 0;
|
||||
}
|
||||
@@ -12,15 +12,15 @@ enum
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// Mandatory fields
|
||||
/* Mandatory fields */
|
||||
const char* name;
|
||||
u32 flags;
|
||||
bool (* init)(void);
|
||||
void (* deinit)(void);
|
||||
void (* launchFile)(const char* path, argData_s* args, executableMetadata_s* em);
|
||||
|
||||
// Optional fields
|
||||
/* Optional fields */
|
||||
void (* useTitle)(u64 tid, u8 mediatype);
|
||||
} loaderFuncs_s;
|
||||
|
||||
Handle launchOpenFile(const char* path);
|
||||
Handle launchOpenFile(const char* path);
|
||||
@@ -69,5 +69,7 @@ const loaderFuncs_s loader_Ninjhax2 =
|
||||
.init = init,
|
||||
.deinit = deinit,
|
||||
.launchFile = launchFile,
|
||||
//.useTitle = useTitle,
|
||||
#if 0
|
||||
.useTitle = useTitle,
|
||||
#endif
|
||||
};
|
||||
@@ -9,28 +9,32 @@ static bool init(void)
|
||||
|
||||
static Result HBLDR_SetTarget(const char* path)
|
||||
{
|
||||
Result rc;
|
||||
u32 pathLen = strlen(path) + 1;
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
|
||||
cmdbuf[0] = IPC_MakeHeader(2, 0, 2); //0x20002
|
||||
cmdbuf[1] = IPC_Desc_StaticBuffer(pathLen, 0);
|
||||
cmdbuf[2] = (u32)path;
|
||||
cmdbuf[0] = IPC_MakeHeader(2, 0, 2); /* 0x20002 */
|
||||
cmdbuf[1] = IPC_Desc_StaticBuffer(pathLen, 0);
|
||||
cmdbuf[2] = (u32)path;
|
||||
|
||||
Result rc = svcSendSyncRequest(hbldrHandle);
|
||||
if (R_SUCCEEDED(rc)) rc = cmdbuf[1];
|
||||
rc = svcSendSyncRequest(hbldrHandle);
|
||||
if (R_SUCCEEDED(rc))
|
||||
rc = cmdbuf[1];
|
||||
return rc;
|
||||
}
|
||||
|
||||
static Result HBLDR_SetArgv(const void* buffer, u32 size)
|
||||
{
|
||||
Result rc;
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
|
||||
cmdbuf[0] = IPC_MakeHeader(3, 0, 2); //0x30002
|
||||
cmdbuf[1] = IPC_Desc_StaticBuffer(size, 1);
|
||||
cmdbuf[2] = (u32)buffer;
|
||||
cmdbuf[0] = IPC_MakeHeader(3, 0, 2); /* 0x30002 */
|
||||
cmdbuf[1] = IPC_Desc_StaticBuffer(size, 1);
|
||||
cmdbuf[2] = (u32)buffer;
|
||||
|
||||
Result rc = svcSendSyncRequest(hbldrHandle);
|
||||
if (R_SUCCEEDED(rc)) rc = cmdbuf[1];
|
||||
rc = svcSendSyncRequest(hbldrHandle);
|
||||
if (R_SUCCEEDED(rc))
|
||||
rc = cmdbuf[1];
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -39,7 +43,8 @@ static void deinit(void)
|
||||
svcCloseHandle(hbldrHandle);
|
||||
}
|
||||
|
||||
static void launchFile(const char* path, argData_s* args, executableMetadata_s* em)
|
||||
static void launchFile(const char* path,
|
||||
argData_s* args, executableMetadata_s* em)
|
||||
{
|
||||
if (strncmp(path, "sdmc:/",6) == 0)
|
||||
path += 5;
|
||||
|
||||
+117
-92
@@ -15,9 +15,9 @@
|
||||
|
||||
void GPU_Init(Handle *gsphandle)
|
||||
{
|
||||
gpuCmdBuf=NULL;
|
||||
gpuCmdBufSize=0;
|
||||
gpuCmdBufOffset=0;
|
||||
gpuCmdBuf = NULL;
|
||||
gpuCmdBufSize = 0;
|
||||
gpuCmdBufOffset = 0;
|
||||
}
|
||||
|
||||
void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize)
|
||||
@@ -25,56 +25,64 @@ void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize)
|
||||
GPUCMD_SetBuffer(gpuBuf, gpuBufSize, 0);
|
||||
}
|
||||
|
||||
void GPU_SetFloatUniform(GPU_SHADER_TYPE type, u32 startreg, u32* data, u32 numreg)
|
||||
void GPU_SetFloatUniform(GPU_SHADER_TYPE type,
|
||||
u32 startreg, u32* data, u32 numreg)
|
||||
{
|
||||
if(!data)return;
|
||||
int regOffset;
|
||||
if(!data)
|
||||
return;
|
||||
|
||||
int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0);
|
||||
regOffset = (type == GPU_GEOMETRY_SHADER) ? (-0x30) : (0x0);
|
||||
|
||||
GPUCMD_AddWrite(GPUREG_VSH_FLOATUNIFORM_CONFIG+regOffset, 0x80000000|startreg);
|
||||
GPUCMD_AddWrites(GPUREG_VSH_FLOATUNIFORM_DATA+regOffset, data, numreg*4);
|
||||
GPUCMD_AddWrite(GPUREG_VSH_FLOATUNIFORM_CONFIG+regOffset,
|
||||
0x80000000 | startreg);
|
||||
GPUCMD_AddWrites(GPUREG_VSH_FLOATUNIFORM_DATA+regOffset, data, numreg*4);
|
||||
}
|
||||
|
||||
//takes PAs as arguments
|
||||
void GPU_SetViewport(u32* depthBuffer, u32* colorBuffer, u32 x, u32 y, u32 w, u32 h)
|
||||
/* takes PAs as arguments */
|
||||
void GPU_SetViewport(u32* depthBuffer, u32* colorBuffer,
|
||||
u32 x, u32 y, u32 w, u32 h)
|
||||
{
|
||||
u32 f116e;
|
||||
u32 param[0x4];
|
||||
float fw=(float)w;
|
||||
float fh=(float)h;
|
||||
float fw = (float)w;
|
||||
float fh = (float)h;
|
||||
|
||||
GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_FLUSH, 0x00000001);
|
||||
GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_INVALIDATE, 0x00000001);
|
||||
|
||||
u32 f116e=0x01000000|(((h-1)&0xFFF)<<12)|(w&0xFFF);
|
||||
f116e = 0x01000000 | (((h-1) & 0xFFF) << 12) | (w & 0xFFF);
|
||||
|
||||
param[0x0]=((u32)depthBuffer)>>3;
|
||||
param[0x1]=((u32)colorBuffer)>>3;
|
||||
param[0x2]=f116e;
|
||||
param[0x0] = ((u32)depthBuffer) >> 3;
|
||||
param[0x1] = ((u32)colorBuffer) >> 3;
|
||||
param[0x2] = f116e;
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_DEPTHBUFFER_LOC, param, 0x00000003);
|
||||
|
||||
GPUCMD_AddWrite(GPUREG_RENDERBUF_DIM, f116e);
|
||||
GPUCMD_AddWrite(GPUREG_DEPTHBUFFER_FORMAT, 0x00000003); //depth buffer format
|
||||
GPUCMD_AddWrite(GPUREG_COLORBUFFER_FORMAT, 0x00000002); //color buffer format
|
||||
GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_BLOCK32, 0x00000000); //?
|
||||
/* depth buffer format */
|
||||
GPUCMD_AddWrite(GPUREG_DEPTHBUFFER_FORMAT, 0x00000003);
|
||||
/* color buffer format */
|
||||
GPUCMD_AddWrite(GPUREG_COLORBUFFER_FORMAT, 0x00000002);
|
||||
GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_BLOCK32, 0x00000000); /* ? */
|
||||
|
||||
param[0x0]=f32tof24(fw/2);
|
||||
param[0x1]=f32tof31(2.0f / fw) << 1;
|
||||
param[0x2]=f32tof24(fh/2);
|
||||
param[0x3]=f32tof31(2.0f / fh) << 1;
|
||||
param[0x0] = f32tof24(fw/2);
|
||||
param[0x1] = f32tof31(2.0f / fw) << 1;
|
||||
param[0x2] = f32tof24(fh/2);
|
||||
param[0x3] = f32tof31(2.0f / fh) << 1;
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_VIEWPORT_WIDTH, param, 0x00000004);
|
||||
|
||||
GPUCMD_AddWrite(GPUREG_VIEWPORT_XY, (y<<16)|(x&0xFFFF));
|
||||
GPUCMD_AddWrite(GPUREG_VIEWPORT_XY, (y << 16)|(x & 0xFFFF));
|
||||
|
||||
param[0x0]=0x00000000;
|
||||
param[0x1]=0x00000000;
|
||||
param[0x2]=((h-1)<<16)|((w-1)&0xFFFF);
|
||||
param[0x0] = 0x00000000;
|
||||
param[0x1] = 0x00000000;
|
||||
param[0x2] = ((h-1) << 16)|((w-1) & 0xFFFF);
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_SCISSORTEST_MODE, param, 0x00000003);
|
||||
|
||||
//enable depth buffer
|
||||
param[0x0]=0x0000000F;
|
||||
param[0x1]=0x0000000F;
|
||||
param[0x2]=0x00000002;
|
||||
param[0x3]=0x00000002;
|
||||
/* enable depth buffer */
|
||||
param[0x0] = 0x0000000F;
|
||||
param[0x1] = 0x0000000F;
|
||||
param[0x2] = 0x00000002;
|
||||
param[0x3] = 0x00000002;
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_COLORBUFFER_READ, param, 0x00000004);
|
||||
}
|
||||
|
||||
@@ -83,8 +91,8 @@ void GPU_SetScissorTest(GPU_SCISSORMODE mode, u32 left, u32 bottom, u32 right, u
|
||||
u32 param[3];
|
||||
|
||||
param[0x0] = mode;
|
||||
param[0x1] = (bottom<<16)|(left&0xFFFF);
|
||||
param[0x2] = ((top-1)<<16)|((right-1)&0xFFFF);
|
||||
param[0x1] = (bottom << 16) | (left & 0xFFFF);
|
||||
param[0x2] = ((top-1) << 16) | ((right-1) & 0xFFFF);
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_SCISSORTEST_MODE, param, 0x00000003);
|
||||
}
|
||||
|
||||
@@ -97,12 +105,14 @@ void GPU_DepthMap(float zScale, float zOffset)
|
||||
|
||||
void GPU_SetAlphaTest(bool enable, GPU_TESTFUNC function, u8 ref)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_FRAGOP_ALPHA_TEST, (enable&1)|((function&7)<<4)|(ref<<8));
|
||||
GPUCMD_AddWrite(GPUREG_FRAGOP_ALPHA_TEST,
|
||||
(enable&1)|((function&7) << 4)|(ref << 8));
|
||||
}
|
||||
|
||||
void GPU_SetStencilTest(bool enable, GPU_TESTFUNC function, u8 ref, u8 input_mask, u8 write_mask)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_STENCIL_TEST, (enable&1)|((function&7)<<4)|(write_mask<<8)|(ref<<16)|(input_mask<<24));
|
||||
GPUCMD_AddWrite(GPUREG_STENCIL_TEST,
|
||||
(enable&1)|((function&7) << 4)|(write_mask << 8)|(ref << 16)|(input_mask << 24));
|
||||
}
|
||||
|
||||
void GPU_SetStencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pass)
|
||||
@@ -112,14 +122,14 @@ void GPU_SetStencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pa
|
||||
|
||||
void GPU_SetDepthTestAndWriteMask(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_DEPTH_COLOR_MASK, (enable&1)|((function&7)<<4)|(writemask<<8));
|
||||
GPUCMD_AddWrite(GPUREG_DEPTH_COLOR_MASK, (enable&1)|((function&7) << 4)|(writemask << 8));
|
||||
}
|
||||
|
||||
void GPU_SetAlphaBlending(GPU_BLENDEQUATION colorEquation, GPU_BLENDEQUATION alphaEquation,
|
||||
GPU_BLENDFACTOR colorSrc, GPU_BLENDFACTOR colorDst,
|
||||
GPU_BLENDFACTOR alphaSrc, GPU_BLENDFACTOR alphaDst)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_BLEND_FUNC, colorEquation | (alphaEquation<<8) | (colorSrc<<16) | (colorDst<<20) | (alphaSrc<<24) | (alphaDst<<28));
|
||||
GPUCMD_AddWrite(GPUREG_BLEND_FUNC, colorEquation | (alphaEquation << 8) | (colorSrc << 16) | (colorDst << 20) | (alphaSrc << 24) | (alphaDst << 28));
|
||||
GPUCMD_AddMaskedWrite(GPUREG_COLOR_OPERATION, 0x2, 0x00000100);
|
||||
}
|
||||
|
||||
@@ -136,8 +146,8 @@ void GPU_SetBlendingColor(u8 r, u8 g, u8 b, u8 a)
|
||||
|
||||
void GPU_SetTextureEnable(GPU_TEXUNIT units)
|
||||
{
|
||||
GPUCMD_AddMaskedWrite(GPUREG_SH_OUTATTR_CLOCK, 0x2, units<<8); // enables texcoord outputs
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT_CONFIG, 0x00011000|units); // enables texture units
|
||||
GPUCMD_AddMaskedWrite(GPUREG_SH_OUTATTR_CLOCK, 0x2, units << 8); /* enables texcoord outputs */
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT_CONFIG, 0x00011000|units); /* enables texture units */
|
||||
}
|
||||
|
||||
void GPU_SetTexture(GPU_TEXUNIT unit, u32* data, u16 width, u16 height, u32 param, GPU_TEXCOLOR colorType)
|
||||
@@ -146,22 +156,22 @@ void GPU_SetTexture(GPU_TEXUNIT unit, u32* data, u16 width, u16 height, u32 para
|
||||
{
|
||||
case GPU_TEXUNIT0:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_TYPE, colorType);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_ADDR1, ((u32)data)>>3);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_DIM, (width<<16)|height);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_ADDR1, ((u32)data) >> 3);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_DIM, (width << 16)|height);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_PARAM, param);
|
||||
break;
|
||||
|
||||
case GPU_TEXUNIT1:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_TYPE, colorType);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_ADDR, ((u32)data)>>3);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_DIM, (width<<16)|height);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_ADDR, ((u32)data) >> 3);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_DIM, (width << 16)|height);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_PARAM, param);
|
||||
break;
|
||||
|
||||
case GPU_TEXUNIT2:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_TYPE, colorType);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_ADDR, ((u32)data)>>3);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_DIM, (width<<16)|height);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_ADDR, ((u32)data) >> 3);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_DIM, (width << 16)|height);
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_PARAM, param);
|
||||
break;
|
||||
}
|
||||
@@ -170,49 +180,60 @@ void GPU_SetTexture(GPU_TEXUNIT unit, u32* data, u16 width, u16 height, u32 para
|
||||
void GPU_SetTextureBorderColor(GPU_TEXUNIT unit,u32 borderColor)
|
||||
{
|
||||
switch (unit)
|
||||
{
|
||||
case GPU_TEXUNIT0:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_BORDER_COLOR, borderColor);
|
||||
break;
|
||||
{
|
||||
case GPU_TEXUNIT0:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT0_BORDER_COLOR, borderColor);
|
||||
break;
|
||||
|
||||
case GPU_TEXUNIT1:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_BORDER_COLOR, borderColor);
|
||||
break;
|
||||
case GPU_TEXUNIT1:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT1_BORDER_COLOR, borderColor);
|
||||
break;
|
||||
|
||||
case GPU_TEXUNIT2:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_BORDER_COLOR, borderColor);
|
||||
break;
|
||||
}
|
||||
case GPU_TEXUNIT2:
|
||||
GPUCMD_AddWrite(GPUREG_TEXUNIT2_BORDER_COLOR, borderColor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const u8 GPU_FORMATSIZE[4]={1,1,2,4};
|
||||
|
||||
void GPU_SetAttributeBuffers(u8 totalAttributes, u32* baseAddress, u64 attributeFormats, u16 attributeMask, u64 attributePermutation, u8 numBuffers, u32 bufferOffsets[], u64 bufferPermutations[], u8 bufferNumAttributes[])
|
||||
void GPU_SetAttributeBuffers(
|
||||
u8 totalAttributes,
|
||||
u32* baseAddress,
|
||||
u64 attributeFormats,
|
||||
u16 attributeMask,
|
||||
u64 attributePermutation,
|
||||
u8 numBuffers,
|
||||
u32 bufferOffsets[],
|
||||
u64 bufferPermutations[],
|
||||
u8 bufferNumAttributes[])
|
||||
{
|
||||
int i, j;
|
||||
u32 param[0x28];
|
||||
u8 sizeTable[0xC];
|
||||
|
||||
memset(param, 0x00, 0x28*4);
|
||||
|
||||
param[0x0]=((u32)baseAddress)>>3;
|
||||
param[0x1]=attributeFormats&0xFFFFFFFF;
|
||||
param[0x2]=((totalAttributes-1)<<28)|((attributeMask&0xFFF)<<16)|((attributeFormats>>32)&0xFFFF);
|
||||
param[0x0] = ((u32)baseAddress) >> 3;
|
||||
param[0x1] = attributeFormats & 0xFFFFFFFF;
|
||||
param[0x2] = ((totalAttributes-1) << 28) | ((attributeMask & 0xFFF) << 16) | ((attributeFormats >> 32) & 0xFFFF);
|
||||
|
||||
int i, j;
|
||||
u8 sizeTable[0xC];
|
||||
for(i=0;i<totalAttributes;i++)
|
||||
for(i = 0; i < totalAttributes; i++)
|
||||
{
|
||||
u8 v=attributeFormats&0xF;
|
||||
sizeTable[i]=GPU_FORMATSIZE[v&3]*((v>>2)+1);
|
||||
attributeFormats>>=4;
|
||||
u8 v = attributeFormats & 0xF;
|
||||
sizeTable[i] = GPU_FORMATSIZE[v & 3]*((v>>2)+1);
|
||||
attributeFormats >>= 4;
|
||||
}
|
||||
|
||||
for(i=0;i<numBuffers;i++)
|
||||
{
|
||||
u16 stride=0;
|
||||
param[3*(i+1)+0]=bufferOffsets[i];
|
||||
param[3*(i+1)+1]=bufferPermutations[i]&0xFFFFFFFF;
|
||||
for(j=0;j<bufferNumAttributes[i];j++)stride+=sizeTable[(bufferPermutations[i]>>(4*j))&0xF];
|
||||
param[3*(i+1)+2]=(bufferNumAttributes[i]<<28)|((stride&0xFFF)<<16)|((bufferPermutations[i]>>32)&0xFFFF);
|
||||
u16 stride = 0;
|
||||
param[3*(i+1)+0] = bufferOffsets[i];
|
||||
param[3*(i+1)+1] = bufferPermutations[i] & 0xFFFFFFFF;
|
||||
for(j = 0; j < bufferNumAttributes[i]; j++)
|
||||
stride += sizeTable[(bufferPermutations[i]>>(4*j)) & 0xF];
|
||||
|
||||
param[3*(i+1)+2] = (bufferNumAttributes[i] << 28) | ((stride & 0xFFF)<< 16) | ((bufferPermutations[i] >> 32) & 0xFFFF);
|
||||
}
|
||||
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_ATTRIBBUFFERS_LOC, param, 0x00000027);
|
||||
@@ -220,17 +241,17 @@ void GPU_SetAttributeBuffers(u8 totalAttributes, u32* baseAddress, u64 attribute
|
||||
GPUCMD_AddMaskedWrite(GPUREG_VSH_INPUTBUFFER_CONFIG, 0xB, 0xA0000000|(totalAttributes-1));
|
||||
GPUCMD_AddWrite(GPUREG_VSH_NUM_ATTR, (totalAttributes-1));
|
||||
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW, ((u32[]){attributePermutation&0xFFFFFFFF, (attributePermutation>>32)&0xFFFF}), 2);
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW, ((u32[]){attributePermutation & 0xFFFFFFFF, (attributePermutation >> 32) & 0xFFFF}), 2);
|
||||
}
|
||||
|
||||
void GPU_SetAttributeBuffersAddress(u32* baseAddress)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_ATTRIBBUFFERS_LOC, ((u32)baseAddress)>>3);
|
||||
GPUCMD_AddWrite(GPUREG_ATTRIBBUFFERS_LOC, ((u32)baseAddress) >> 3);
|
||||
}
|
||||
|
||||
void GPU_SetFaceCulling(GPU_CULLMODE mode)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_FACECULLING_CONFIG, mode&0x3);
|
||||
GPUCMD_AddWrite(GPUREG_FACECULLING_CONFIG, mode & 0x3);
|
||||
}
|
||||
|
||||
void GPU_SetCombinerBufferWrite(u8 rgb_config, u8 alpha_config)
|
||||
@@ -242,32 +263,34 @@ const u8 GPU_TEVID[]={0xC0,0xC8,0xD0,0xD8,0xF0,0xF8};
|
||||
|
||||
void GPU_SetTexEnv(u8 id, u16 rgbSources, u16 alphaSources, u16 rgbOperands, u16 alphaOperands, GPU_COMBINEFUNC rgbCombine, GPU_COMBINEFUNC alphaCombine, u32 constantColor)
|
||||
{
|
||||
if(id>6)return;
|
||||
u32 param[0x5];
|
||||
if(id > 6)
|
||||
return;
|
||||
memset(param, 0x00, 5*4);
|
||||
|
||||
param[0x0]=(alphaSources<<16)|(rgbSources);
|
||||
param[0x1]=(alphaOperands<<12)|(rgbOperands);
|
||||
param[0x2]=(alphaCombine<<16)|(rgbCombine);
|
||||
param[0x3]=constantColor;
|
||||
param[0x4]=0x00000000; // ?
|
||||
param[0x0] = (alphaSources << 16) | (rgbSources);
|
||||
param[0x1] = (alphaOperands << 12) | (rgbOperands);
|
||||
param[0x2] = (alphaCombine << 16) | (rgbCombine);
|
||||
param[0x3] = constantColor;
|
||||
param[0x4] = 0x00000000; /* ? */
|
||||
|
||||
GPUCMD_AddIncrementalWrites(GPUREG_0000|GPU_TEVID[id], param, 0x00000005);
|
||||
}
|
||||
|
||||
void GPU_DrawArray(GPU_Primitive_t primitive, u32 first, u32 count)
|
||||
{
|
||||
//set primitive type
|
||||
/* set primitive type */
|
||||
GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x2, primitive);
|
||||
GPUCMD_AddMaskedWrite(GPUREG_RESTART_PRIMITIVE, 0x2, 0x00000001);
|
||||
//index buffer address register should be cleared (except bit 31) before drawing
|
||||
/* index buffer address register should be cleared
|
||||
* (except bit 31) before drawing */
|
||||
GPUCMD_AddWrite(GPUREG_INDEXBUFFER_CONFIG, 0x80000000);
|
||||
//pass number of vertices
|
||||
/* pass number of vertices */
|
||||
GPUCMD_AddWrite(GPUREG_NUMVERTICES, count);
|
||||
//set first vertex
|
||||
/* set first vertex */
|
||||
GPUCMD_AddWrite(GPUREG_VERTEX_OFFSET, first);
|
||||
|
||||
//all the following except 0x000F022E might be useless
|
||||
/* all the following except 0x000F022E might be useless */
|
||||
GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG2, 0x1, 0x00000001);
|
||||
GPUCMD_AddMaskedWrite(GPUREG_START_DRAW_FUNC0, 0x1, 0x00000000);
|
||||
GPUCMD_AddWrite(GPUREG_DRAWARRAYS, 0x00000001);
|
||||
@@ -278,12 +301,12 @@ void GPU_DrawArray(GPU_Primitive_t primitive, u32 first, u32 count)
|
||||
|
||||
void GPU_DrawElements(GPU_Primitive_t primitive, u32* indexArray, u32 n)
|
||||
{
|
||||
//set primitive type
|
||||
/* set primitive type */
|
||||
GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x2, primitive);
|
||||
GPUCMD_AddMaskedWrite(GPUREG_RESTART_PRIMITIVE, 0x2, 0x00000001);
|
||||
//index buffer (TODO : support multiple types)
|
||||
/* index buffer (TODO : support multiple types) */
|
||||
GPUCMD_AddWrite(GPUREG_INDEXBUFFER_CONFIG, 0x80000000|((u32)indexArray));
|
||||
//pass number of vertices
|
||||
/* pass number of vertices */
|
||||
GPUCMD_AddWrite(GPUREG_NUMVERTICES, n);
|
||||
|
||||
GPUCMD_AddWrite(GPUREG_VERTEX_OFFSET, 0x00000000);
|
||||
@@ -296,10 +319,11 @@ void GPU_DrawElements(GPU_Primitive_t primitive, u32* indexArray, u32 n)
|
||||
GPUCMD_AddMaskedWrite(GPUREG_START_DRAW_FUNC0, 0x1, 0x00000001);
|
||||
GPUCMD_AddWrite(GPUREG_VTX_FUNC, 0x00000001);
|
||||
|
||||
// CHECKME: does this one also require GPUREG_FRAMEBUFFER_FLUSH at the end?
|
||||
/* CHECKME: does this one also require
|
||||
* GPUREG_FRAMEBUFFER_FLUSH at the end? */
|
||||
}
|
||||
|
||||
void GPU_FinishDrawing()
|
||||
void GPU_FinishDrawing(void)
|
||||
{
|
||||
GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_FLUSH, 0x00000001);
|
||||
GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_INVALIDATE, 0x00000001);
|
||||
@@ -315,7 +339,8 @@ void GPU_Finalize(void)
|
||||
GPUCMD_Split(NULL, NULL);
|
||||
#else
|
||||
GPUCMD_AddWrite(GPUREG_FINALIZE, 0x12345678);
|
||||
//not the cleanest way of guaranteeing 0x10-byte size but whatever good enough for now
|
||||
/* not the cleanest way of guaranteeing 0x10-byte size
|
||||
* but whatever good enough for now */
|
||||
GPUCMD_AddWrite(GPUREG_FINALIZE,0x12345678);
|
||||
#endif
|
||||
}
|
||||
+32
-39
@@ -29,7 +29,6 @@
|
||||
|
||||
#include "core_info.h"
|
||||
#include "database_info.h"
|
||||
#include "verbosity.h"
|
||||
|
||||
int database_info_build_query_enum(char *s, size_t len,
|
||||
enum database_query_type type,
|
||||
@@ -105,7 +104,6 @@ int database_info_build_query_enum(char *s, size_t len,
|
||||
add_quotes = false;
|
||||
break;
|
||||
case DATABASE_QUERY_NONE:
|
||||
RARCH_LOG("Unknown type: %d\n", type);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -122,10 +120,6 @@ int database_info_build_query_enum(char *s, size_t len,
|
||||
|
||||
strlcat(s, "}", len);
|
||||
|
||||
#if 0
|
||||
RARCH_LOG("query: %s\n", s);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -223,30 +217,39 @@ static int database_cursor_iterate(libretrodb_cursor_t *cur,
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->franchise = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "bbfc_rating"))
|
||||
else if (string_ends_with(str, "_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->bbfc_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "esrb_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->esrb_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "elspa_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->elspa_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "cero_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->cero_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "pegi_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->pegi_rating = strdup(val_string);
|
||||
if (string_is_equal(str, "bbfc_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->bbfc_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "esrb_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->esrb_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "elspa_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->elspa_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "cero_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->cero_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "pegi_rating"))
|
||||
{
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->pegi_rating = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "edge_rating"))
|
||||
db_info->edge_magazine_rating = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "famitsu_rating"))
|
||||
db_info->famitsu_magazine_rating = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "tgdb_rating"))
|
||||
db_info->tgdb_rating = (unsigned)val->val.uint_;
|
||||
}
|
||||
else if (string_is_equal(str, "enhancement_hw"))
|
||||
{
|
||||
@@ -258,14 +261,8 @@ static int database_cursor_iterate(libretrodb_cursor_t *cur,
|
||||
if (!string_is_empty(val_string))
|
||||
db_info->edge_magazine_review = strdup(val_string);
|
||||
}
|
||||
else if (string_is_equal(str, "edge_rating"))
|
||||
db_info->edge_magazine_rating = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "edge_issue"))
|
||||
db_info->edge_magazine_issue = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "famitsu_rating"))
|
||||
db_info->famitsu_magazine_rating = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "tgdb_rating"))
|
||||
db_info->tgdb_rating = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "users"))
|
||||
db_info->max_users = (unsigned)val->val.uint_;
|
||||
else if (string_is_equal(str, "releasemonth"))
|
||||
@@ -289,10 +286,6 @@ static int database_cursor_iterate(libretrodb_cursor_t *cur,
|
||||
else if (string_is_equal(str, "md5"))
|
||||
db_info->md5 = bin_to_hex_alloc(
|
||||
(uint8_t*)val->val.binary.buff, val->val.binary.len);
|
||||
else
|
||||
{
|
||||
RARCH_LOG("Unknown key: %s\n", str);
|
||||
}
|
||||
}
|
||||
|
||||
rmsgpack_dom_value_free(&item);
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
#ifndef _PS3_DEFINES_H
|
||||
#define _PS3_DEFINES_H
|
||||
|
||||
#include <sdk_version.h>
|
||||
|
||||
/*============================================================
|
||||
AUDIO PROTOTYPES
|
||||
============================================================ */
|
||||
@@ -71,6 +69,7 @@ extern int audioAddData(uint32_t portNum, float *data, uint32_t frames, float vo
|
||||
#define sys_semaphore_t sys_sem_t
|
||||
|
||||
#else
|
||||
#include <sdk_version.h>
|
||||
#include <cell/audio.h>
|
||||
#include <sys/event.h>
|
||||
#include <sys/synchronization.h>
|
||||
@@ -330,6 +329,11 @@ extern int audioAddData(uint32_t portNum, float *data, uint32_t frames, float vo
|
||||
#define sys_ppu_thread_join sysThreadJoin
|
||||
#define sys_ppu_thread_exit sysThreadExit
|
||||
|
||||
#define sys_process_exit sysProcessExit
|
||||
#define sys_game_process_exitspawn sysProcessExitSpawn2
|
||||
|
||||
#define SYS_PROCESS_PRIMARY_STACK_SIZE_1M SYS_PROCESS_SPAWN_STACK_SIZE_1M
|
||||
|
||||
#define SYS_PPU_THREAD_CREATE_JOINABLE 0 /* FIXME - not sure if this is correct */
|
||||
#elif defined(__CELLOS_LV2__)
|
||||
#include <sys/ppu_thread.h>
|
||||
@@ -572,6 +576,7 @@ extern int audioAddData(uint32_t portNum, float *data, uint32_t frames, float vo
|
||||
#define socketclose close
|
||||
|
||||
#define sys_net_initialize_network netInitialize
|
||||
#define sys_net_finalize_network netFinalizeNetwork
|
||||
#else
|
||||
#include <netex/net.h>
|
||||
#include <np.h>
|
||||
|
||||
Vendored
+1
@@ -4,6 +4,7 @@
|
||||
#ifndef __CPU_ARCH_H
|
||||
#define __CPU_ARCH_H
|
||||
|
||||
#include <retro_endianness.h>
|
||||
#include "7zTypes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Vendored
-92
@@ -1,92 +0,0 @@
|
||||
---
|
||||
AccessModifierOffset: -4
|
||||
AlignAfterOpenBracket: true
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlines: Left
|
||||
AlignOperands: false
|
||||
AlignTrailingComments: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortBlocksOnASingleLine: false
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: InlineOnly
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: true
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeBraces: Stroustrup
|
||||
BreakBeforeInheritanceComma: true
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializers: BeforeComma
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 100
|
||||
CommentPragmas: ''
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 2
|
||||
ContinuationIndentWidth: 2
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
FixNamespaceComments: true
|
||||
ForEachMacros: []
|
||||
IndentCaseLabels: false
|
||||
IncludeCategories:
|
||||
- Regex: '^("|<)stdafx\.h(pp)?("|>)'
|
||||
Priority: -1
|
||||
- Regex: '^<(W|w)indows.h>'
|
||||
Priority: 1
|
||||
- Regex: '^<'
|
||||
Priority: 2
|
||||
- Regex: '.*'
|
||||
Priority: 3
|
||||
IncludeIsMainRegex: '(_test|_win|_linux|_mac|_ios|_osx|_null)?$'
|
||||
IndentCaseLabels: false
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
PenaltyBreakAssignment: 0
|
||||
PenaltyBreakBeforeFirstCallParameter: 1
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyReturnTypeOnItsOwnLine: 9999999
|
||||
PointerAlignment: Left
|
||||
ReflowComments: true
|
||||
SortIncludes: false
|
||||
SortUsingDeclarations: true
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Cpp11
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
---
|
||||
Language: Cpp
|
||||
---
|
||||
Language: ObjC
|
||||
ObjCBlockIndentWidth: 4
|
||||
ObjCSpaceAfterProperty: true
|
||||
ObjCSpaceBeforeProtocolList: false
|
||||
---
|
||||
Language: Java
|
||||
BasedOnStyle: Google
|
||||
BreakAfterJavaFieldAnnotations: true
|
||||
...
|
||||
@@ -1,5 +0,0 @@
|
||||
/build*/
|
||||
/.vscode/
|
||||
/thirdparty/
|
||||
.vs/
|
||||
.DS_Store
|
||||
Vendored
-47
@@ -1,47 +0,0 @@
|
||||
language: cpp
|
||||
|
||||
env:
|
||||
global:
|
||||
- CLANG_FORMAT_SUFFIX="-dummy" # don't use formatting on Travis, this is
|
||||
# needed not to use default 3.5 version
|
||||
# which is too old.
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
env: MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
- os: linux
|
||||
env: MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0"
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-trusty-4.0
|
||||
packages:
|
||||
- clang-4.0
|
||||
- os: linux
|
||||
env: MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0"
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-trusty-5.0
|
||||
packages:
|
||||
- clang-5.0
|
||||
- os: osx
|
||||
osx_image: xcode9
|
||||
|
||||
# prevent Travis from overwriting our CXX variables
|
||||
before_install:
|
||||
- eval "${MATRIX_EVAL}"
|
||||
- echo $CXX
|
||||
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake -DCLANG_FORMAT_SUFFIX=$CLANG_FORMAT_SUFFIX --config Release ..
|
||||
- cmake --build . -- -j2
|
||||
Vendored
-56
@@ -1,56 +0,0 @@
|
||||
cmake_minimum_required (VERSION 3.2.0)
|
||||
project (DiscordRPC)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
|
||||
option(BUILD_EXAMPLES "Build example apps" ON)
|
||||
|
||||
# format
|
||||
file(GLOB_RECURSE ALL_SOURCE_FILES
|
||||
examples/*.cpp examples/*.h examples/*.c
|
||||
include/*.h
|
||||
src/*.cpp src/*.h src/*.c
|
||||
)
|
||||
|
||||
# Set CLANG_FORMAT_SUFFIX if you are using custom clang-format, e.g. clang-format-5.0
|
||||
find_program(CLANG_FORMAT_CMD clang-format${CLANG_FORMAT_SUFFIX})
|
||||
|
||||
if (CLANG_FORMAT_CMD)
|
||||
add_custom_target(
|
||||
clangformat
|
||||
COMMAND ${CLANG_FORMAT_CMD}
|
||||
-i -style=file -fallback-style=none
|
||||
${ALL_SOURCE_FILES}
|
||||
DEPENDS
|
||||
${ALL_SOURCE_FILES}
|
||||
)
|
||||
endif(CLANG_FORMAT_CMD)
|
||||
|
||||
# thirdparty stuff
|
||||
execute_process(
|
||||
COMMAND mkdir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty
|
||||
ERROR_QUIET
|
||||
)
|
||||
|
||||
find_file(RAPIDJSONTEST NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH)
|
||||
if (NOT RAPIDJSONTEST)
|
||||
message("no rapidjson, download")
|
||||
set(RJ_TAR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/v1.1.0.tar.gz)
|
||||
file(DOWNLOAD https://github.com/miloyip/rapidjson/archive/v1.1.0.tar.gz ${RJ_TAR_FILE})
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -E tar xzf ${RJ_TAR_FILE}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty
|
||||
)
|
||||
file(REMOVE ${RJ_TAR_FILE})
|
||||
endif(NOT RAPIDJSONTEST)
|
||||
|
||||
find_file(RAPIDJSON NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH)
|
||||
|
||||
add_library(rapidjson STATIC IMPORTED ${RAPIDJSON})
|
||||
|
||||
# add subdirs
|
||||
|
||||
add_subdirectory(src)
|
||||
if (BUILD_EXAMPLES)
|
||||
add_subdirectory(examples/send-presence)
|
||||
endif(BUILD_EXAMPLES)
|
||||
Vendored
-91
@@ -1,91 +0,0 @@
|
||||
# Discord RPC
|
||||
|
||||
This is a library for interfacing your game with a locally running Discord desktop client. It's known to work on Windows, macOS, and Linux. You can use the lib directly if you like, or use it as a guide to writing your own if it doesn't suit your game as is. PRs/feedback welcome if you have an improvement everyone might want, or can describe how this doesn't meet your needs.
|
||||
|
||||
Included here are some quick demos that implement the very minimal subset to show current status, and
|
||||
have callbacks for where a more complete game would do more things (joining, spectating, etc).
|
||||
|
||||
## Documentation
|
||||
|
||||
The most up to date documentation for Rich Presence can always be found on our [developer site](https://discordapp.com/developers/docs/rich-presence/how-to)! If you're interested in rolling your own native implementation of Rich Presence via IPC sockets instead of using our SDK—hey, you've got free time, right?—check out the ["Hard Mode" documentation](https://github.com/discordapp/discord-rpc/blob/master/documentation/hard-mode.md).
|
||||
|
||||
## Basic Usage
|
||||
|
||||
Zeroith, you should be set up to build things because you are a game developer, right?
|
||||
|
||||
First, head on over to the [Discord developers site](https://discordapp.com/developers/applications/me) and make yourself an app. Keep track of `Client ID` -- you'll need it here to pass to the init function.
|
||||
|
||||
### From package
|
||||
|
||||
Download a release package for your platform(s) -- they have subdirs with various prebuilt options, select the one you need add `/include` to your compile includes, `/lib` to your linker paths, and link with `discord-rpc`. For the dynamically linked builds, you'll need to ship the associated file along with your game.
|
||||
|
||||
### From repo
|
||||
|
||||
First-eth, you'll want `CMake`. There's a few different ways to install it on your system, and you should refer to [their website](https://cmake.org/install/). Many package managers provide ways of installing CMake as well.
|
||||
|
||||
To make sure it's installed correctly, type `cmake --version` into your flavor of terminal/cmd. If you get a response with a version number, you're good to go!
|
||||
|
||||
There's a [CMake](https://cmake.org/download/) file that should be able to generate the lib for you; Sometimes I use it like this:
|
||||
```sh
|
||||
cd <path to discord-rpc>
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DCMAKE_INSTALL_PREFIX=<path to install discord-rpc to>
|
||||
cmake --build . --config Release --target install
|
||||
```
|
||||
There is a wrapper build script `build.py` that runs `cmake` with a few different options.
|
||||
|
||||
Usually, I run `build.py` to get things started, then use the generated project files as I work on things. It does depend on `click` library, so do a quick `pip install click` to make sure you have it if you want to run `build.py`.
|
||||
|
||||
There are some CMake options you might care about:
|
||||
|
||||
| flag | default | does |
|
||||
|------|---------|------|
|
||||
| `ENABLE_IO_THREAD` | `ON` | When enabled, we start up a thread to do io processing, if disabled you should call `Discord_UpdateConnection` yourself.
|
||||
| `USE_STATIC_CRT` | `OFF` | (Windows) Enable to statically link the CRT, avoiding requiring users install the redistributable package. (The prebuilt binaries enable this option)
|
||||
| [`BUILD_SHARED_LIBS`](https://cmake.org/cmake/help/v3.7/variable/BUILD_SHARED_LIBS.html) | `OFF` | Build library as a DLL
|
||||
| `WARNINGS_AS_ERRORS` | `OFF` | When enabled, compiles with `-Werror` (on *nix platforms). |
|
||||
|
||||
## Continuous Builds
|
||||
|
||||
Why do we have three of these? Three times the fun!
|
||||
|
||||
| CI | badge |
|
||||
|----|-------|
|
||||
| TravisCI | [](https://travis-ci.org/discordapp/discord-rpc)
|
||||
| AppVeyor | [](https://ci.appveyor.com/project/crmarsh/discord-rpc)
|
||||
| Buildkite (internal) | [](https://buildkite.com/discord/discord-rpc)
|
||||
|
||||
## Sample: send-presence
|
||||
|
||||
This is a text adventure "game" that inits/deinits the connection to Discord, and sends a presence update on each command.
|
||||
|
||||
## Sample: button-clicker
|
||||
|
||||
This is a sample [Unity](https://unity3d.com/) project that wraps a DLL version of the library, and sends presence updates when you click on a button. Run `python build.py unity` in the root directory to build the correct library files and place them in their respective folders.
|
||||
|
||||
## Sample: unrealstatus
|
||||
|
||||
This is a sample [Unreal](https://www.unrealengine.com) project that wraps the DLL version of the library with an Unreal plugin, exposes a blueprint class for interacting with it, and uses that to make a very simple UI. Run `python build.py unreal` in the root directory to build the correct library files and place them in their respective folders.
|
||||
|
||||
## Wrappers and Implementations
|
||||
|
||||
Below is a table of unofficial, community-developed wrappers for and implementations of Rich Presence in various languages. If you would like to have yours added, please make a pull request adding your repository to the table. The repository should include:
|
||||
|
||||
- The code
|
||||
- A brief ReadMe of how to use it
|
||||
- A working example
|
||||
|
||||
###### Rich Presence Wrappers and Implementations
|
||||
|
||||
| Name | Language |
|
||||
|------|----------|
|
||||
| [DerelictDiscordRPC](https://github.com/voidblaster/DerelictDiscordRPC) | [D](https://dlang.org/) |
|
||||
| [discord-rpc.jar](https://github.com/Vatuu/discord-rpc "Discord-RPC.jar") | Java |
|
||||
| [java-discord-rpc](https://github.com/MinnDevelopment/java-discord-rpc) | Java |
|
||||
| [Discord-IPC](https://github.com/jagrosh/DiscordIPC) | Java |
|
||||
| [Discord Rich Presence](https://npmjs.org/discord-rich-presence) | JavaScript |
|
||||
| [drpc4k](https://github.com/Bluexin/drpc4k) | [Kotlin](https://kotlinlang.org/) |
|
||||
| [lua-discordRPC](https://github.com/pfirsich/lua-discordRPC) | LuaJIT (FFI) |
|
||||
| [pypresence](https://github.com/qwertyquerty/pypresence) | [Python](https://python.org/) |
|
||||
| [SwordRPC](https://github.com/Azoy/SwordRPC) | [Swift](https://swift.org) |
|
||||
Loaded 100 of 1171 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user