mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-10-12 02:09:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3352e235b6 | ||
|
|
816169fe9e | ||
|
|
effd379c25 | ||
|
|
a6b7c9c309 | ||
|
|
85c4392b34 | ||
|
|
c3bac7c92b | ||
|
|
45d41267f5 | ||
|
|
869e10027d | ||
|
|
246b593783 | ||
|
|
d22017bfca | ||
|
|
c7965405d3 | ||
|
|
d7358848e1 | ||
|
|
989f954432 | ||
|
|
4d88296485 | ||
|
|
086e1c34dd | ||
|
|
e6c6a7fb8b | ||
|
|
32830d45ff | ||
|
|
223979c088 | ||
|
|
0ea0c21fed | ||
|
|
7a921cbdf9 | ||
|
|
9db7de29fb | ||
|
|
63e690ca11 | ||
|
|
a19b721c26 | ||
|
|
73ea020525 | ||
|
|
2c10348408 | ||
|
|
028277bd2d | ||
|
|
67a341fded | ||
|
|
44879dd9f3 | ||
|
|
6ae54ae27b | ||
|
|
bf8a20c4b9 | ||
|
|
55bc9eda9a | ||
|
|
e296f81a37 | ||
|
|
d69a4173fa | ||
|
|
4a08e8cd0b | ||
|
|
7779742ac1 | ||
|
|
091b6711ae | ||
|
|
d0442e140b | ||
|
|
714e07b1dc | ||
|
|
001ab05f1a | ||
|
|
f30d71da6c | ||
|
|
d22ac91ee1 | ||
|
|
cbf880fb71 | ||
|
|
8fd3064905 | ||
|
|
e83c387ebe | ||
|
|
3b5cd4845e | ||
|
|
c0487a634e | ||
|
|
c299a65aab | ||
|
|
62a9c38754 | ||
|
|
67fe5e1107 | ||
|
|
1778113b71 | ||
|
|
8637754d6a | ||
|
|
083c4fc855 | ||
|
|
251fb86ab0 | ||
|
|
5853332db7 | ||
|
|
860926d731 | ||
|
|
eb889920e6 | ||
|
|
c96057296a | ||
|
|
863d963e97 | ||
|
|
0cf4b378f9 | ||
|
|
a8bebcba55 | ||
|
|
6fa5e2cc7c | ||
|
|
ff0bb52689 | ||
|
|
298c9fea22 | ||
|
|
244f3dfb89 | ||
|
|
28366d35d2 | ||
|
|
c4733a6eab | ||
|
|
f6b5f02501 | ||
|
|
338fb6cc7e | ||
|
|
833c100850 | ||
|
|
9d01396737 | ||
|
|
1e39c691dc | ||
|
|
bc63eaea48 | ||
|
|
795170635f | ||
|
|
b52e885cde | ||
|
|
079411eee8 | ||
|
|
d66bd5f70f | ||
|
|
9f1ee5bd28 | ||
|
|
a66147705f | ||
|
|
3a63b62486 | ||
|
|
28a5d4d4f0 | ||
|
|
6761d4a30c | ||
|
|
ed94626411 | ||
|
|
40a598b0ab | ||
|
|
ea528a1ced | ||
|
|
caf5894152 | ||
|
|
3956b21cb7 | ||
|
|
35ab3b0cd8 | ||
|
|
db27ea923d | ||
|
|
4260f68f85 | ||
|
|
c4102f3b18 | ||
|
|
9710044134 | ||
|
|
39767b8d46 | ||
|
|
e5a792515e | ||
|
|
8f67c910ab | ||
|
|
136295f70e | ||
|
|
6b3c47a42a | ||
|
|
60a7f9b3f2 | ||
|
|
d22672b156 | ||
|
|
dc970c513a | ||
|
|
2bcc755fca | ||
|
|
ed93c77433 | ||
|
|
92446de9d9 | ||
|
|
2e5d20c315 | ||
|
|
31ec26a7a1 | ||
|
|
8d2b6f6054 | ||
|
|
b073ead988 | ||
|
|
97083ebba4 | ||
|
|
713ae91e27 | ||
|
|
ee645d054d | ||
|
|
df6ee9c29d | ||
|
|
fc1408e643 | ||
|
|
214d3d0f1a | ||
|
|
edc92843a7 | ||
|
|
cdefb969ec | ||
|
|
266db1336d | ||
|
|
e2d82394f6 | ||
|
|
38c444cfa1 | ||
|
|
5c52521a0a | ||
|
|
5aae9b5536 | ||
|
|
42423588c8 | ||
|
|
ce3fdeda5e | ||
|
|
805c778f91 | ||
|
|
aafcf44581 | ||
|
|
da7472fe81 | ||
|
|
75fe95eeb1 | ||
|
|
efc8779275 | ||
|
|
81780d1932 | ||
|
|
85d0fff233 | ||
|
|
fe1e7a1bdb | ||
|
|
f63ec52479 | ||
|
|
6312bf5323 | ||
|
|
f8f067ca7c | ||
|
|
c7738b8b37 | ||
|
|
643c15c4e9 | ||
|
|
0c7f763889 | ||
|
|
b85fc50854 | ||
|
|
edd0965c1a | ||
|
|
766f1b2b01 | ||
|
|
984aa44220 | ||
|
|
b85a68e8a1 | ||
|
|
4cf41305e0 | ||
|
|
c4e99dbdb2 | ||
|
|
42e1d4d752 | ||
|
|
5637c22363 | ||
|
|
7e30a0f464 | ||
|
|
2553e45d76 | ||
|
|
250ce63527 | ||
|
|
5fc6f59821 | ||
|
|
7c1ab47262 | ||
|
|
6b5ee57718 | ||
|
|
d846eac0f1 | ||
|
|
fefeba03b8 | ||
|
|
56ac7f2572 | ||
|
|
3a3d264cb5 | ||
|
|
2ae5a7ff39 | ||
|
|
2e17ea1490 | ||
|
|
cbe119b457 | ||
|
|
960f4ceefc | ||
|
|
5ad060f150 | ||
|
|
1ff4f77eaf | ||
|
|
a8e15ce18a | ||
|
|
3ee56627eb | ||
|
|
cedc023922 | ||
|
|
8189577e8f | ||
|
|
b57daef75a | ||
|
|
62258a1f1a | ||
|
|
dab1dda903 | ||
|
|
1a61ef0440 | ||
|
|
4eb1267c5c | ||
|
|
e9766f1b76 | ||
|
|
b21e226b1c | ||
|
|
99717b7902 | ||
|
|
bad2d7f121 | ||
|
|
8413cd7b0a | ||
|
|
d59486295d | ||
|
|
f81a02ed5e | ||
|
|
69d08b6691 | ||
|
|
c95c4c32e6 | ||
|
|
b46fc2fc49 | ||
|
|
5a3cf5d9ac | ||
|
|
7542d38681 | ||
|
|
ce072f25e2 | ||
|
|
d5bb951237 | ||
|
|
4c0b5bbc62 | ||
|
|
51a6862bf4 | ||
|
|
b6c827b17a | ||
|
|
17c4b2387e | ||
|
|
f712b8aca4 | ||
|
|
91d0229bc5 | ||
|
|
b7c539ad7a | ||
|
|
0c231e6578 | ||
|
|
77674be1c1 | ||
|
|
70903d46e6 | ||
|
|
f86c079acf | ||
|
|
38d57eb02c | ||
|
|
d5e44f6224 | ||
|
|
3fbc3a3f00 | ||
|
|
427270884c | ||
|
|
73233fd347 | ||
|
|
d971c4e0f6 | ||
|
|
7f25720bd3 | ||
|
|
f2c82d3cf4 | ||
|
|
d53a1d10ab | ||
|
|
5b181ed28c | ||
|
|
c1e2b75a49 | ||
|
|
08b47616b6 | ||
|
|
13d58ac355 | ||
|
|
96329a6e29 | ||
|
|
9f257ee9f8 | ||
|
|
8cd0aab129 | ||
|
|
ccb2d89744 | ||
|
|
aa3c97f918 | ||
|
|
7a988c73a6 | ||
|
|
9b18bd4cd7 | ||
|
|
b81cf01456 | ||
|
|
daabbba5fc | ||
|
|
bbf7a070e7 | ||
|
|
27a8c074fa | ||
|
|
855d6935d9 | ||
|
|
35570a5ebf | ||
|
|
21e7206f7a | ||
|
|
1b33abf287 | ||
|
|
0838e3209e | ||
|
|
9485fe2693 | ||
|
|
cf402c8954 | ||
|
|
0327e76320 | ||
|
|
a120414d32 | ||
|
|
d995bfbdfb | ||
|
|
36aace57ca | ||
|
|
c6bd5d09f8 | ||
|
|
23a0116975 | ||
|
|
f72f6fe9c5 | ||
|
|
b00acff9dd | ||
|
|
284d2c43f9 | ||
|
|
0a08f9595e | ||
|
|
29c29d0074 | ||
|
|
efd52a0547 | ||
|
|
4f2bda26fc | ||
|
|
a14dd8ea51 | ||
|
|
6f9f5f7918 | ||
|
|
1f500aad53 | ||
|
|
34eb85683c | ||
|
|
6fab5a885f | ||
|
|
38f93461d1 | ||
|
|
6182f5346d | ||
|
|
afefecf1f0 | ||
|
|
ed03e41f88 | ||
|
|
f14a06938c | ||
|
|
e91042af97 | ||
|
|
617a488a0a | ||
|
|
854919b5e2 | ||
|
|
8f788cb522 | ||
|
|
6078f25aa7 | ||
|
|
4484e8c3f0 | ||
|
|
b6bcdade81 | ||
|
|
6adf086ed1 | ||
|
|
e7fc5228d5 | ||
|
|
23f03a19e8 | ||
|
|
2060f02636 | ||
|
|
e34b5f1f55 | ||
|
|
e083c1471c | ||
|
|
d9eba43360 | ||
|
|
3506d03dc5 | ||
|
|
24eb544046 | ||
|
|
6a1f0aed36 | ||
|
|
a0c433a065 | ||
|
|
6229733fbb | ||
|
|
7e971eb032 | ||
|
|
01ce1c31d1 | ||
|
|
212fd4b340 | ||
|
|
659f3d856a | ||
|
|
8cded28c45 | ||
|
|
454fbce4c6 | ||
|
|
26738762ea | ||
|
|
cd5edc38ff | ||
|
|
5250911a40 | ||
|
|
45e48c2499 | ||
|
|
15901589a5 | ||
|
|
bdecd3c180 | ||
|
|
61de5e8835 | ||
|
|
3b3fffa962 | ||
|
|
63ad2cce72 | ||
|
|
da2caa0881 | ||
|
|
93b06f2a39 | ||
|
|
f2d5542e66 | ||
|
|
7584f29ec7 | ||
|
|
9fd244cf9c | ||
|
|
bb722d5824 | ||
|
|
5de70628d7 | ||
|
|
e33c684b49 | ||
|
|
d9dbb1565a | ||
|
|
34992d8a8f | ||
|
|
9d7c186a4f | ||
|
|
702193a6c7 | ||
|
|
bbe00f6505 | ||
|
|
70a80b84d7 | ||
|
|
c8cc681591 | ||
|
|
8604f5a02f | ||
|
|
26ff4fd6b7 | ||
|
|
4bfd019c0d | ||
|
|
82bc41f4ad | ||
|
|
01abb255b2 | ||
|
|
cc713a0091 | ||
|
|
93032be4ab | ||
|
|
26964efa7e | ||
|
|
f0ded46753 | ||
|
|
47d251a818 | ||
|
|
b018c91135 | ||
|
|
d910d2c572 | ||
|
|
f384d87044 | ||
|
|
bd52bcf8d4 | ||
|
|
d58bd1c916 | ||
|
|
22d49ae96a | ||
|
|
3b6e3fb3b4 | ||
|
|
d287ba44ce | ||
|
|
4c133ab5bf | ||
|
|
ee0eb70de4 | ||
|
|
4b0b65c0c5 | ||
|
|
d0ea8d5262 | ||
|
|
9b505984f2 | ||
|
|
9adb534c7f | ||
|
|
c3fb1419fd | ||
|
|
dd233c9f38 | ||
|
|
9e01f2817f | ||
|
|
8831bd0918 | ||
|
|
b2b9f535dc | ||
|
|
a880ce89d1 | ||
|
|
06cbe4a0bc | ||
|
|
a6a4081894 | ||
|
|
bcf4a6209e | ||
|
|
4d71df70db | ||
|
|
05f2aaf2b9 | ||
|
|
1dcc6858b4 | ||
|
|
52e2800fb5 | ||
|
|
d74e031d4e | ||
|
|
2ae687cf00 | ||
|
|
a196ee1957 | ||
|
|
81fcadac38 | ||
|
|
4966d50e52 | ||
|
|
e860f7fb14 | ||
|
|
5911b3c1f1 | ||
|
|
77371e973f | ||
|
|
b0a2f9f65a | ||
|
|
e80bdf120b | ||
|
|
8d3235cd7c | ||
|
|
51462226a7 | ||
|
|
094c4057be | ||
|
|
2f89d15079 | ||
|
|
c4dab6e644 | ||
|
|
72375d9e3d | ||
|
|
674373dd6c | ||
|
|
7eb5da73fe | ||
|
|
12d8b795f7 | ||
|
|
0ed770633b | ||
|
|
19257b3121 | ||
|
|
32434dd848 | ||
|
|
9cdb74efc7 | ||
|
|
0e5c54709d | ||
|
|
35db227af4 | ||
|
|
a6ba47265f | ||
|
|
62246f75c8 | ||
|
|
a6d8d1144c | ||
|
|
5ef7f8bf3e | ||
|
|
09fc492257 | ||
|
|
a78ba8a271 | ||
|
|
263e5beb26 | ||
|
|
7ae680d9d1 | ||
|
|
c07b0dc373 | ||
|
|
c5b3359c4b | ||
|
|
a7fbd6c9a9 | ||
|
|
5cbcd07ff1 | ||
|
|
047d59df0c | ||
|
|
41687af077 | ||
|
|
6353575208 | ||
|
|
974ea68cf9 | ||
|
|
0f0de47c83 | ||
|
|
8a3d15d4fe | ||
|
|
422f5c0008 | ||
|
|
5a14644cd4 | ||
|
|
4e4325a2bf | ||
|
|
79dc835378 | ||
|
|
9404cd5cd8 | ||
|
|
9ef24509cb | ||
|
|
4b54d7ece1 | ||
|
|
a9180ce187 | ||
|
|
c0423d513d | ||
|
|
b6323861a5 | ||
|
|
a451bb574e | ||
|
|
fe551148d8 | ||
|
|
1675a82efd | ||
|
|
71a975c685 | ||
|
|
3813c09be6 | ||
|
|
3b7d0bc3fc | ||
|
|
2230975e55 | ||
|
|
787619cdba | ||
|
|
7d70be42af | ||
|
|
9671a654b7 | ||
|
|
6963157e63 | ||
|
|
9452c6b08c | ||
|
|
035875825e | ||
|
|
837e06e85b | ||
|
|
9e3132c3fc | ||
|
|
843d0ed298 | ||
|
|
f7f4c049fc | ||
|
|
1072540e3e | ||
|
|
0c8c13b8b7 | ||
|
|
303a109286 | ||
|
|
f0dc38cadd | ||
|
|
4efa2266e6 | ||
|
|
1f7a1e4078 | ||
|
|
2ead9b1f21 | ||
|
|
ddf5b52360 | ||
|
|
f66468ffcd | ||
|
|
d3405da5c4 | ||
|
|
020d282868 | ||
|
|
137821c866 | ||
|
|
e6d2e05b6e | ||
|
|
7b889a10cc | ||
|
|
1e1c2007a3 | ||
|
|
660f491310 | ||
|
|
670660c244 | ||
|
|
3d960064ef | ||
|
|
f6d2409b20 | ||
|
|
39bc897b93 | ||
|
|
5f35f2ac7d | ||
|
|
e1eb075604 | ||
|
|
d19d9ccd0b | ||
|
|
b4b4ae7a78 | ||
|
|
149fa9d750 | ||
|
|
791070c158 | ||
|
|
3bd2114815 | ||
|
|
46de48593c | ||
|
|
acd384ae2d | ||
|
|
b77666cbba | ||
|
|
128ee67bba | ||
|
|
7417033d7f | ||
|
|
e8a940172c | ||
|
|
290bdc4566 | ||
|
|
220aab1fd0 | ||
|
|
8e9f456029 | ||
|
|
aa450b56f1 | ||
|
|
6d70f3c237 | ||
|
|
6384541345 | ||
|
|
ffb014ca3d | ||
|
|
3c3f92f29b | ||
|
|
24255f7883 | ||
|
|
40fa836b81 | ||
|
|
b71caa94ac | ||
|
|
39658c0c52 | ||
|
|
9b8522e734 | ||
|
|
9875bf9c7b | ||
|
|
4ce4cf5242 | ||
|
|
52110e0647 | ||
|
|
19ce0cdc09 | ||
|
|
2e58f312d5 | ||
|
|
7523d01e0f | ||
|
|
7972cb5bdc | ||
|
|
685d5d3ea3 | ||
|
|
9f7caf90e3 | ||
|
|
f453194e32 | ||
|
|
440c637b1f | ||
|
|
d95809a069 | ||
|
|
6aac972bda | ||
|
|
df3fddc026 | ||
|
|
1ce49b60d9 | ||
|
|
8b5b23e6c0 | ||
|
|
26f329d186 | ||
|
|
5ace4438e2 | ||
|
|
b8e10225f9 | ||
|
|
224facf3ba | ||
|
|
9c12d8ff22 | ||
|
|
3b4339c8e0 | ||
|
|
8e12c4cb00 | ||
|
|
efe1678088 | ||
|
|
2f5be3559e | ||
|
|
960668ecf1 | ||
|
|
83084467c6 | ||
|
|
8464ab6a23 | ||
|
|
74ec128e62 | ||
|
|
194c6b8bee | ||
|
|
69272edba6 | ||
|
|
38531459df | ||
|
|
b3e3c68f15 | ||
|
|
5029dff73a | ||
|
|
689dee9944 | ||
|
|
68f9898171 | ||
|
|
08622a41b4 | ||
|
|
669a3277ff | ||
|
|
e6bd681227 | ||
|
|
0c5cfdddba | ||
|
|
d08ce79d04 | ||
|
|
bab52c132d | ||
|
|
cc1efd2a46 | ||
|
|
8297d963bf | ||
|
|
a17c41b4e1 | ||
|
|
b055747d4f | ||
|
|
4ef76866a5 | ||
|
|
675ccd4510 | ||
|
|
31a925b4f0 | ||
|
|
d153575e59 | ||
|
|
3afc62e525 | ||
|
|
f8446b227b | ||
|
|
8f937bda0f | ||
|
|
9d1208bf95 | ||
|
|
e7591439f4 | ||
|
|
fef0b1dd46 | ||
|
|
3281a1982e | ||
|
|
b8486a489d | ||
|
|
f97d791fe8 | ||
|
|
657a6c9511 | ||
|
|
38514c291d | ||
|
|
f138be2e6c | ||
|
|
ecda02c099 | ||
|
|
e9560da4e2 | ||
|
|
6406cece57 | ||
|
|
f7e787958e | ||
|
|
8912b9880e | ||
|
|
3ac9e0933f | ||
|
|
c1be0cf3bf | ||
|
|
48919330d7 | ||
|
|
ba12c489ec | ||
|
|
dbccf5fbad | ||
|
|
509bbddac1 | ||
|
|
11ccc498fd | ||
|
|
836d14c8af | ||
|
|
5a4babb0fd | ||
|
|
4e08d35661 | ||
|
|
7186b72a56 | ||
|
|
2b40ebdbc0 | ||
|
|
cae2d929ab | ||
|
|
34336ebfce | ||
|
|
f38d0e92e7 | ||
|
|
854365e6ce | ||
|
|
3529554c88 | ||
|
|
2a1f19b776 | ||
|
|
324b2da3ec | ||
|
|
07f6896622 | ||
|
|
8417e21e8d | ||
|
|
404b15b3c3 | ||
|
|
02473324f4 | ||
|
|
ed68e864c2 | ||
|
|
bc3065939f | ||
|
|
d1e91433ad | ||
|
|
4e7e895822 | ||
|
|
2bccf3f2af | ||
|
|
3586c7613a | ||
|
|
b1c8c0a448 | ||
|
|
5a18c3f8ea | ||
|
|
3055de0444 | ||
|
|
6811195345 | ||
|
|
5f12a4f7b5 | ||
|
|
e748fc294b | ||
|
|
082815f93e | ||
|
|
2da52d0309 | ||
|
|
702423158c | ||
|
|
969e2d8c57 | ||
|
|
5a60a5bebd | ||
|
|
44840dbbcf | ||
|
|
d6b2230b92 | ||
|
|
0e0345824e | ||
|
|
d917cfa43f | ||
|
|
813e753e3d | ||
|
|
c4b3b967d9 | ||
|
|
b41fcf3734 | ||
|
|
ecad586739 | ||
|
|
64036e0478 | ||
|
|
9c6539ea2d | ||
|
|
a97dc349b7 | ||
|
|
243bc0d06e | ||
|
|
e7df81ade0 | ||
|
|
743f5f07cb | ||
|
|
3ed603074c | ||
|
|
e8310e6c50 | ||
|
|
3ca634138d | ||
|
|
d8bef46c2a | ||
|
|
ae83ab5436 | ||
|
|
a00111a863 | ||
|
|
7416fe91fc | ||
|
|
e4631f93bd | ||
|
|
f2df9b469a | ||
|
|
4b7f9c38a6 | ||
|
|
a666318b95 | ||
|
|
aa811b6eef | ||
|
|
321e6d3a86 | ||
|
|
56ba5a765b | ||
|
|
aa4fb80465 | ||
|
|
d68c748976 | ||
|
|
8a21e0fcb8 | ||
|
|
408581b7bc | ||
|
|
416d66a438 | ||
|
|
5672ba887b | ||
|
|
14123d67e1 | ||
|
|
69b3828086 | ||
|
|
a44c54b428 | ||
|
|
dc5a439ec9 | ||
|
|
81f05daff2 | ||
|
|
456f83671a | ||
|
|
d7b4b2fd49 | ||
|
|
27807f3a61 | ||
|
|
fcf7751008 | ||
|
|
1cda2977bb | ||
|
|
6221fecf3b | ||
|
|
80dc122742 | ||
|
|
929f518ef3 | ||
|
|
6fae5863cf | ||
|
|
56704888b5 | ||
|
|
266504a0ac | ||
|
|
08d05e245d | ||
|
|
6f584049a2 | ||
|
|
52129a3d71 | ||
|
|
27ad98ee98 | ||
|
|
d90850e697 | ||
|
|
717d99795c | ||
|
|
8e4ad3dfcb | ||
|
|
be1c9100cc | ||
|
|
65750aea12 | ||
|
|
0e27b68ba7 | ||
|
|
6c01658d37 | ||
|
|
8e451126ac | ||
|
|
7ae1b51753 | ||
|
|
0d6297fef0 | ||
|
|
d01235ce2d | ||
|
|
38709058a3 | ||
|
|
efe430733b | ||
|
|
3465106456 | ||
|
|
24128ba450 | ||
|
|
298eb46a31 | ||
|
|
f245799479 | ||
|
|
82cb8fe5bd | ||
|
|
b18e337781 | ||
|
|
f3311bb5e5 | ||
|
|
8a1ce6ba64 | ||
|
|
ca6783ba9a | ||
|
|
78bfd54ad4 | ||
|
|
52be47ca89 | ||
|
|
19cf749944 | ||
|
|
178bcfc8df | ||
|
|
83cb137721 | ||
|
|
8edf35a9e3 | ||
|
|
6930cbc064 | ||
|
|
450c8245ed | ||
|
|
88d7feda5c | ||
|
|
c9c436e6fc | ||
|
|
f4091b1027 | ||
|
|
174fb97172 | ||
|
|
ed3ac91263 | ||
|
|
377bdae6a9 | ||
|
|
3d2386f903 | ||
|
|
a21c9f9861 | ||
|
|
cdcef4c8ee | ||
|
|
1e9d1c1dd9 | ||
|
|
399478c2cd | ||
|
|
c86cfef58e | ||
|
|
7a996648bb | ||
|
|
f438554fc1 | ||
|
|
8d5d545f3f | ||
|
|
d511fd6529 | ||
|
|
a19a9b5585 | ||
|
|
f3dd9596cf | ||
|
|
115255c162 | ||
|
|
984f5c6914 | ||
|
|
fa845fa5c0 | ||
|
|
579096c6a8 | ||
|
|
7e938b2363 | ||
|
|
0d2c4c24b4 | ||
|
|
d0338cddf7 | ||
|
|
d15300a549 | ||
|
|
b9d8d9383a | ||
|
|
85cf918aeb | ||
|
|
b5add0f027 | ||
|
|
b238107a99 | ||
|
|
68608ef894 | ||
|
|
5447521ce5 | ||
|
|
247af0ebbf | ||
|
|
3e5f0e5c37 | ||
|
|
9fdc458d69 | ||
|
|
4a669fd86e | ||
|
|
8edef32c76 | ||
|
|
307015382d | ||
|
|
471e807ea2 | ||
|
|
bb4b12f253 | ||
|
|
432bca26ae | ||
|
|
5f6caf33f0 | ||
|
|
60dc4abc2b | ||
|
|
e2d0a63b98 | ||
|
|
0fc55de769 | ||
|
|
570ca1c87f | ||
|
|
6e666b63fa | ||
|
|
2ac47548b0 | ||
|
|
a79ffdb485 | ||
|
|
daf2d3a02e | ||
|
|
e9d9bad643 | ||
|
|
f34bd724e3 | ||
|
|
fd13a495de | ||
|
|
7dfe9415c4 | ||
|
|
080e503954 | ||
|
|
a4db58f5f2 | ||
|
|
009aa3dcb9 | ||
|
|
b46c66b4c7 | ||
|
|
039e729881 | ||
|
|
c152c20d70 | ||
|
|
917f08c534 | ||
|
|
ae5d95d462 | ||
|
|
925d6889a6 | ||
|
|
231f322b60 | ||
|
|
2a5f5c0dc2 | ||
|
|
5d5a4f804b | ||
|
|
9c2f48cd1d | ||
|
|
fac9d74344 | ||
|
|
5dfc22a604 | ||
|
|
660bc34157 | ||
|
|
70b9271cd8 | ||
|
|
8da7361794 | ||
|
|
896562238c | ||
|
|
0cc4b555d1 | ||
|
|
e76abf875f | ||
|
|
adcb9864df | ||
|
|
2a9895b7f0 | ||
|
|
2ad7051746 | ||
|
|
02ce78482c | ||
|
|
61755ed017 | ||
|
|
ae38ae9aff | ||
|
|
b5cf7fba2e | ||
|
|
449c41aca2 | ||
|
|
2043181501 | ||
|
|
a2f7f371dc | ||
|
|
29cde1a618 | ||
|
|
c570d60f45 | ||
|
|
893175f511 | ||
|
|
c197b54774 | ||
|
|
124d0de325 | ||
|
|
fdae12c52e | ||
|
|
59c549ac86 | ||
|
|
1ec18bdf64 | ||
|
|
42467ba40f | ||
|
|
9f51bce2aa | ||
|
|
8f84fca0f2 | ||
|
|
0e3ab35e32 | ||
|
|
119126c60c | ||
|
|
5c42a3cbc4 | ||
|
|
6133590903 | ||
|
|
eec64ef1c0 | ||
|
|
8afa6e59b2 | ||
|
|
9f49232cac | ||
|
|
bc7e30517b | ||
|
|
fe902cbb13 | ||
|
|
42f3296791 | ||
|
|
08b03db5fa | ||
|
|
f842c206f3 | ||
|
|
c0255208cc | ||
|
|
77c2ca6862 | ||
|
|
e8ebb005fd | ||
|
|
c64bbcf87a | ||
|
|
89f14ec5ac | ||
|
|
1673ba217c | ||
|
|
a273768c4d | ||
|
|
bc8b71cbc1 | ||
|
|
9d6df238d5 | ||
|
|
fd628d8345 | ||
|
|
d4e0da3f80 | ||
|
|
8cfabf0ead | ||
|
|
b3b07c8248 | ||
|
|
6f8544281a | ||
|
|
d1b5dcfdad | ||
|
|
a462b4518c | ||
|
|
77bf86eaa5 | ||
|
|
b3db9255e4 | ||
|
|
f5bd044096 | ||
|
|
a2997a1109 | ||
|
|
b0f8611f49 | ||
|
|
de97d3a7aa | ||
|
|
0e98da2306 | ||
|
|
5a064be490 | ||
|
|
ec0005195d | ||
|
|
a974ee009e | ||
|
|
cc02a147d3 | ||
|
|
9ee9efeb76 | ||
|
|
decd2b4f5a | ||
|
|
9f3b42bd71 | ||
|
|
4dcb63436c | ||
|
|
a443682aaf | ||
|
|
4a55ba3067 | ||
|
|
3f6b826ab0 | ||
|
|
37a3800597 | ||
|
|
6d99516489 | ||
|
|
74daf9145a | ||
|
|
92e90101e2 | ||
|
|
d8d09b5472 | ||
|
|
5de1ea3fd4 | ||
|
|
9136cbfcf2 | ||
|
|
07b3897499 | ||
|
|
737080274a | ||
|
|
e4f6eb04e8 | ||
|
|
bbfca3fc0d | ||
|
|
ff01e26c5c | ||
|
|
2b60de32f9 | ||
|
|
3449bd3842 | ||
|
|
fc40b0ed6b | ||
|
|
426c69710c | ||
|
|
a63fdf6c45 | ||
|
|
4154a1026f | ||
|
|
b5127e68de | ||
|
|
dd000caad7 | ||
|
|
86fff9800f | ||
|
|
2679e4f526 | ||
|
|
1e431edf09 | ||
|
|
67f1f0fea3 | ||
|
|
beabc88f79 | ||
|
|
e086b7a522 | ||
|
|
dd1afe85ae | ||
|
|
60bccf0f10 | ||
|
|
73535e0c04 | ||
|
|
16311b36b0 | ||
|
|
537187687d | ||
|
|
403f585a19 | ||
|
|
8dd19d1446 | ||
|
|
71552f7ffe | ||
|
|
b2a7f0fd11 | ||
|
|
529efd6ac8 | ||
|
|
ed61023dd3 | ||
|
|
28cdfa9feb | ||
|
|
bf474f0cdb | ||
|
|
d27f6c8fa7 | ||
|
|
6f71d04aa4 | ||
|
|
3de47c201c | ||
|
|
e3e5b46cbf | ||
|
|
4cd9e5754e | ||
|
|
ceab44b9ab | ||
|
|
0138a95567 | ||
|
|
d86469c2f5 | ||
|
|
97a67746f1 | ||
|
|
fd6295c2f5 | ||
|
|
f483c3b9ca | ||
|
|
98943fc9e8 | ||
|
|
2bd6265a17 | ||
|
|
5feba39ff7 | ||
|
|
e11e67df28 | ||
|
|
c15027b95e | ||
|
|
6cb036d35f | ||
|
|
cc0c3fc98d | ||
|
|
86720f90cd | ||
|
|
3721941ffb | ||
|
|
4fdeeace66 | ||
|
|
1c890f85c5 | ||
|
|
6cd62a9fd0 | ||
|
|
1e7ded2163 | ||
|
|
a7262d34f0 | ||
|
|
ebf28f8da0 | ||
|
|
d511153836 | ||
|
|
2f211e4e5a | ||
|
|
a5ecbd0b2b | ||
|
|
8d986e77d1 | ||
|
|
3d643fbc0b | ||
|
|
cd71125277 | ||
|
|
55ca625371 | ||
|
|
81546d357c | ||
|
|
3acc900363 | ||
|
|
6b0d29a72d | ||
|
|
442abcc6f1 | ||
|
|
c7b7d1f71f | ||
|
|
62d7bf2159 | ||
|
|
07e13b8613 | ||
|
|
f1f31e22f9 | ||
|
|
9a0232bc87 | ||
|
|
8e83ad7b65 | ||
|
|
703b1636c8 | ||
|
|
f898ebff3f | ||
|
|
455d07e05b | ||
|
|
fd9977d3bd | ||
|
|
f6777825d5 | ||
|
|
893a4e34a1 | ||
|
|
4ac6c23ced | ||
|
|
f27e77c7e0 | ||
|
|
286d2962c6 | ||
|
|
37721d6b8a | ||
|
|
8ba74a7f7d | ||
|
|
506fdec6df | ||
|
|
de5a3451cd | ||
|
|
23bd197bd4 | ||
|
|
f10c812301 | ||
|
|
ae51ce2349 | ||
|
|
fa6e2bfe02 | ||
|
|
faf0a0d851 | ||
|
|
8ae3401ffa | ||
|
|
9d68c16c62 | ||
|
|
59f1077a36 | ||
|
|
4e62ec7458 | ||
|
|
12f36cf31f | ||
|
|
093ecc0a02 | ||
|
|
da4bf43fb2 | ||
|
|
11eeab0a1a | ||
|
|
3208a7713f | ||
|
|
97f62571ff | ||
|
|
c31c0c40a4 | ||
|
|
12f00a5e16 | ||
|
|
0da893695e | ||
|
|
5f08cca849 | ||
|
|
72e5578595 | ||
|
|
bf04758285 | ||
|
|
7d15cc0dfd | ||
|
|
05c5058dfd | ||
|
|
91c98a9533 | ||
|
|
e86e72804b | ||
|
|
34622933f3 | ||
|
|
c407c786cc | ||
|
|
ecb3d93918 | ||
|
|
667cb64c29 | ||
|
|
359258c3d3 | ||
|
|
9d18bba1df | ||
|
|
8204737efa | ||
|
|
4622914610 | ||
|
|
ea376e7751 | ||
|
|
cd7fbae583 | ||
|
|
f9731de777 | ||
|
|
cbe83ad8dd | ||
|
|
4666f190db | ||
|
|
de97c8e20f | ||
|
|
09673c928c | ||
|
|
c923cb54d3 | ||
|
|
218e823fdc | ||
|
|
5a7327492a | ||
|
|
c9f3871c68 | ||
|
|
ff3bfa1ca2 | ||
|
|
7e01c81154 | ||
|
|
ab1c05aa71 | ||
|
|
817fec9684 | ||
|
|
58181c5c17 | ||
|
|
60d5dd40f7 | ||
|
|
02a1bffc12 | ||
|
|
f2c8db75bf | ||
|
|
665f316a3b | ||
|
|
de7bbb5661 | ||
|
|
4456d9fcf1 | ||
|
|
d1f31d6fda | ||
|
|
5fe3ea6440 | ||
|
|
942f26509b | ||
|
|
241dedef4e | ||
|
|
eb90e509f9 | ||
|
|
b2ca9edde2 | ||
|
|
f81192373f | ||
|
|
99a9fd8505 | ||
|
|
e0aa74d380 | ||
|
|
095c8fa19b | ||
|
|
9c24bb9d75 | ||
|
|
3468a7ebcf | ||
|
|
8ea7da56ec | ||
|
|
4bf0deecb6 | ||
|
|
e551e2bc5d | ||
|
|
5e14310071 | ||
|
|
168cd9bb7a | ||
|
|
6b6cd11fbe | ||
|
|
fcd6b64f8f | ||
|
|
9c8773252a | ||
|
|
ce494f8847 | ||
|
|
15057ffc5e | ||
|
|
73b108765e | ||
|
|
c2897cddd6 | ||
|
|
d9403c2ed2 | ||
|
|
be9a599beb | ||
|
|
eb63558c6d | ||
|
|
e18db20630 | ||
|
|
db88c539fb | ||
|
|
c6bdedf3b0 | ||
|
|
94d1488259 | ||
|
|
8b3c250702 | ||
|
|
07b9379a7c | ||
|
|
8d758b9088 | ||
|
|
544fe531a3 | ||
|
|
6f3c50eba2 | ||
|
|
f8afee3325 | ||
|
|
9923f96431 | ||
|
|
dd665e7363 | ||
|
|
da8883d5d3 | ||
|
|
2113fce2fb | ||
|
|
9e5daa1737 | ||
|
|
c7ee8cadde | ||
|
|
c0b90d01bd | ||
|
|
6ae7f450f1 | ||
|
|
3c27bf0a6a | ||
|
|
b01583f54b | ||
|
|
8140ab459f | ||
|
|
6c4f968373 | ||
|
|
d0283265cc | ||
|
|
009370f73c | ||
|
|
e8088d1216 | ||
|
|
1ee749a9a8 | ||
|
|
6124783180 | ||
|
|
592543c47f | ||
|
|
be1511bd7a | ||
|
|
fcd579a7b5 | ||
|
|
0e733b20de | ||
|
|
80c25b8ced | ||
|
|
a93a81997f | ||
|
|
a852d5caca | ||
|
|
06532e3263 | ||
|
|
63a54dd70d | ||
|
|
c2430d3af1 | ||
|
|
b54adebfc7 | ||
|
|
491d5528ed | ||
|
|
7460d215fd | ||
|
|
5bf6c25652 | ||
|
|
0fb8ad8c5a | ||
|
|
aeee0758c2 | ||
|
|
83b77ced9e | ||
|
|
405d7cb70c | ||
|
|
0ce4930c0f | ||
|
|
a3dc623270 | ||
|
|
3b0afe92e3 | ||
|
|
09cc127dd9 | ||
|
|
9cb88b3a8d | ||
|
|
f3d7c5da9d | ||
|
|
bc13128afe | ||
|
|
befe93784f | ||
|
|
732eef6c02 | ||
|
|
4185fcb6cd | ||
|
|
850416d530 | ||
|
|
abee3539b8 | ||
|
|
07f33a3809 | ||
|
|
1d09408e38 | ||
|
|
99156c61e4 | ||
|
|
c63db8842c | ||
|
|
9cb7339067 | ||
|
|
5e9eb9c3bb | ||
|
|
a775b428f4 | ||
|
|
cf1c86bb2f | ||
|
|
7843b23ee1 | ||
|
|
f0a5641cf0 | ||
|
|
3fe90d9e8d | ||
|
|
3d486a8ba9 | ||
|
|
11980346c9 | ||
|
|
6a408301d7 | ||
|
|
9b10895c38 | ||
|
|
6fcd0e0421 | ||
|
|
37cc5e5c11 | ||
|
|
38a809b483 | ||
|
|
d2edeafffe | ||
|
|
b839b86895 | ||
|
|
af181395fc | ||
|
|
265331117e | ||
|
|
725b0c606d | ||
|
|
0e6cd8cd0e | ||
|
|
ff219c6035 | ||
|
|
612d169b78 | ||
|
|
8801abb93a | ||
|
|
1f3fbe91e2 | ||
|
|
91809c09d4 | ||
|
|
bf394d4f56 | ||
|
|
6f0c74cf76 | ||
|
|
428d66598d | ||
|
|
2cd035d530 | ||
|
|
cb0ebad210 | ||
|
|
3cc3974466 | ||
|
|
45b7da6666 | ||
|
|
6cb00e681b | ||
|
|
40a3b5c918 | ||
|
|
a519aa8350 | ||
|
|
8cf6255d5d | ||
|
|
fc65f181a7 | ||
|
|
16fa3697db | ||
|
|
de55d64781 | ||
|
|
fd269f3adc | ||
|
|
3472f75ae0 | ||
|
|
d4b83bcf6f | ||
|
|
1c7bff4d36 | ||
|
|
5e33d5535d | ||
|
|
141c7ef340 | ||
|
|
73aeda1507 | ||
|
|
2c802735bd | ||
|
|
865445e29b | ||
|
|
8f31211557 | ||
|
|
d88d078f4a | ||
|
|
5102241ac2 | ||
|
|
4ee66a2680 | ||
|
|
294d649012 | ||
|
|
d29b82566e | ||
|
|
c6a5e905bc | ||
|
|
8cc9642b96 | ||
|
|
03a84cb208 | ||
|
|
3f495689c0 | ||
|
|
ad3e50f90f | ||
|
|
628acbf0b4 | ||
|
|
dbcddcf5e2 | ||
|
|
eda3c9084e | ||
|
|
178d0e0e85 | ||
|
|
d23cf861f1 | ||
|
|
dca9ae6ab5 | ||
|
|
aa66ddcd86 | ||
|
|
f2d39d0e82 | ||
|
|
f59bc86ac5 | ||
|
|
09ccd7e436 | ||
|
|
2310ba137f | ||
|
|
9fdb6f0dad | ||
|
|
281f8be76f | ||
|
|
224bae383c | ||
|
|
f55bb7165c | ||
|
|
006d989304 | ||
|
|
00c975b469 | ||
|
|
e36c4f75e0 | ||
|
|
41577b5018 | ||
|
|
17e169e652 | ||
|
|
75a52219e0 | ||
|
|
c53828787a | ||
|
|
d2c13bc4c1 | ||
|
|
2f54482592 | ||
|
|
482a371bb0 | ||
|
|
da923f8a3d | ||
|
|
cf27d4c2ca | ||
|
|
24c23dc5f6 | ||
|
|
cfde5698c7 | ||
|
|
70b537c8c2 | ||
|
|
dc1a57e71c | ||
|
|
724159c8b4 | ||
|
|
a86e44deb4 | ||
|
|
93e20c0853 | ||
|
|
8b631d486c | ||
|
|
48e6db3a2f | ||
|
|
224503d2dc | ||
|
|
ad55cced13 | ||
|
|
e55949dbfa | ||
|
|
8669dac5e7 | ||
|
|
2d0dbf4949 | ||
|
|
10b92d45d1 | ||
|
|
4966ab565a | ||
|
|
1837f40ed4 | ||
|
|
e38bf8d51f | ||
|
|
ff9f348ec2 | ||
|
|
c2d3c857b6 | ||
|
|
b8ba902657 | ||
|
|
33daa81e6f | ||
|
|
68d3f6f536 | ||
|
|
4ef66e6901 | ||
|
|
e72d098ea1 | ||
|
|
8474cd8064 | ||
|
|
27e56b6199 | ||
|
|
bdeb08e045 | ||
|
|
acb8f82f84 | ||
|
|
b465992178 | ||
|
|
c73d19161b | ||
|
|
d564c25241 | ||
|
|
b2ad49bac8 | ||
|
|
5f46b32616 | ||
|
|
64a555caca | ||
|
|
02f15810ee | ||
|
|
e3b73f9ea0 | ||
|
|
381260a493 | ||
|
|
e4435a9308 | ||
|
|
22e67db0f2 | ||
|
|
c3e19f34fa | ||
|
|
ca90c05b0a | ||
|
|
744b56b12d | ||
|
|
694d4e01a0 | ||
|
|
459ab17d74 | ||
|
|
cfe058dc82 | ||
|
|
ce857ab1da | ||
|
|
caf863be4d | ||
|
|
5882f9defb | ||
|
|
f31282623a | ||
|
|
25c09c5088 | ||
|
|
a2b8d3a885 | ||
|
|
76d52b4bb3 | ||
|
|
593b9a494d | ||
|
|
d886fd55d3 | ||
|
|
a751a06d01 | ||
|
|
a5fb8c95f4 | ||
|
|
ac352cd083 | ||
|
|
b63c77ca7d | ||
|
|
9e2dfcaba3 | ||
|
|
7db3599648 | ||
|
|
461bf12c4f | ||
|
|
51d287d9b0 | ||
|
|
878a116c4a | ||
|
|
3a6abe1656 | ||
|
|
9748007cd3 | ||
|
|
6bb5dd2125 | ||
|
|
f721f2cbaa | ||
|
|
59aca7566e | ||
|
|
e0cff6b0b4 | ||
|
|
c1abf80b40 | ||
|
|
5ca02a5053 | ||
|
|
d8d72c4327 | ||
|
|
25b10c5e3e | ||
|
|
6d9e542cde | ||
|
|
043adab2ce | ||
|
|
1c803e725b | ||
|
|
0b435afd1d | ||
|
|
3aafb60629 | ||
|
|
0be60890e7 | ||
|
|
fdf24545af | ||
|
|
e454f59f97 | ||
|
|
aac93b9063 | ||
|
|
001dc7cf57 | ||
|
|
5a57564b0c | ||
|
|
01ac9f02d2 | ||
|
|
2636fb457e | ||
|
|
28c125618a | ||
|
|
046e522851 | ||
|
|
6877e5e3ba | ||
|
|
90fb4396fe | ||
|
|
d8f76f5aee | ||
|
|
f382ba0319 | ||
|
|
8e9cdc5fea | ||
|
|
da328c078a | ||
|
|
cef58da879 | ||
|
|
595392428d | ||
|
|
3e11598941 | ||
|
|
262d3d0755 | ||
|
|
906146d8f6 | ||
|
|
f12cb9b519 | ||
|
|
53ac34db35 | ||
|
|
74dab18174 | ||
|
|
af69803ee0 | ||
|
|
3a029efbd3 | ||
|
|
68a62f897d | ||
|
|
7b571aab70 | ||
|
|
b5a7637b49 | ||
|
|
52a68875fc | ||
|
|
88d05a08cf | ||
|
|
79420e52a2 | ||
|
|
f77e2acfbe | ||
|
|
c167a1228e | ||
|
|
b81fd13232 | ||
|
|
7a431e85f6 | ||
|
|
f618247937 | ||
|
|
b50ab149d6 | ||
|
|
56853de0ef | ||
|
|
1228787355 | ||
|
|
b72d435ce8 | ||
|
|
bc25f4d6ad | ||
|
|
9c193e0282 | ||
|
|
c5a1f8930f | ||
|
|
233450a7ca | ||
|
|
8bd678afc0 | ||
|
|
8ad1bc1970 | ||
|
|
10cc2c080c | ||
|
|
2709a3e49a | ||
|
|
90e0a89e9b | ||
|
|
8b8385b0a4 | ||
|
|
a6770813b1 | ||
|
|
e9fab57a0e | ||
|
|
82545a7b56 | ||
|
|
22f413be3a | ||
|
|
9814a92a25 | ||
|
|
cd951af664 | ||
|
|
2df1220144 | ||
|
|
b8073b4e75 | ||
|
|
232c97cc82 | ||
|
|
5ce0261265 | ||
|
|
bd68d382bd | ||
|
|
12fc6e6145 | ||
|
|
6d61e36f5d | ||
|
|
824b9aa628 | ||
|
|
487fd4dc2a | ||
|
|
e88d45b1bf | ||
|
|
cb14697aa0 | ||
|
|
6e8b94a7e1 | ||
|
|
18e3e74070 | ||
|
|
c08ac779f4 | ||
|
|
2031944792 | ||
|
|
fafcce6d5f | ||
|
|
986a39fcfb | ||
|
|
75202ac55b | ||
|
|
1076727c75 | ||
|
|
740354d2c9 | ||
|
|
e6146e4ecb | ||
|
|
4a89432d39 | ||
|
|
312ff7e8f5 | ||
|
|
727f54dd32 | ||
|
|
71b9caf65a | ||
|
|
5872144165 | ||
|
|
abbd244376 | ||
|
|
1471afcfe6 | ||
|
|
b5f91a6e75 | ||
|
|
b2577833f9 | ||
|
|
31ea9068de | ||
|
|
9fc50fcce5 | ||
|
|
a9425fcf2a | ||
|
|
eb1b8b748a | ||
|
|
f2985f12c1 | ||
|
|
2aedd0633f | ||
|
|
7b25483b67 | ||
|
|
3f31976080 | ||
|
|
422a9f1fdc | ||
|
|
d2beafca4d | ||
|
|
5681781ab0 | ||
|
|
05d6c8df60 | ||
|
|
07449abfc6 | ||
|
|
72c84cb8aa | ||
|
|
bf8a48e3bd | ||
|
|
c465b6699a | ||
|
|
edb9a97c17 | ||
|
|
445c7dd884 | ||
|
|
2985f2d6e3 | ||
|
|
a279aebf31 | ||
|
|
cbd7d3d614 | ||
|
|
5640e81eb5 | ||
|
|
4114df50c2 | ||
|
|
1f9c8f757a | ||
|
|
3a75e6a357 | ||
|
|
782a11b47f | ||
|
|
39039514d1 | ||
|
|
263294d263 | ||
|
|
43f4ed49b4 | ||
|
|
16e8d6349e | ||
|
|
f1ab5abe2e | ||
|
|
c3e162b442 | ||
|
|
7b6ad026c6 | ||
|
|
9d1993cdee | ||
|
|
ba66992ee3 | ||
|
|
a58974eac8 | ||
|
|
2ac3c66c80 | ||
|
|
d1ebc47867 | ||
|
|
5cb0fe63b8 | ||
|
|
789ed767e2 | ||
|
|
f446501339 | ||
|
|
98a924874f | ||
|
|
b6cc7af8cd | ||
|
|
88aea70100 | ||
|
|
c96bc6231c | ||
|
|
a276391e87 | ||
|
|
ee3e5cfe1f | ||
|
|
9cb87552b8 | ||
|
|
bb643070bd | ||
|
|
5da166b26b | ||
|
|
caab6cbc60 | ||
|
|
16f40fb69c | ||
|
|
3960555e45 | ||
|
|
96c4e87bf5 | ||
|
|
5a1b756c14 | ||
|
|
3853dffce2 | ||
|
|
87d51665dc | ||
|
|
d93e95b614 | ||
|
|
75219be066 | ||
|
|
da5b047c58 | ||
|
|
b016fbc9e4 | ||
|
|
07ea311b3a | ||
|
|
40e19e0c95 | ||
|
|
411265d83a | ||
|
|
d627f9cb83 | ||
|
|
1c2849a736 | ||
|
|
28b964aeb0 | ||
|
|
65fbc57221 | ||
|
|
6f487f910c | ||
|
|
646c908a93 | ||
|
|
9abaf80099 | ||
|
|
8ec9f84c1b | ||
|
|
14e9323154 | ||
|
|
fedd35989c | ||
|
|
722e6b8ac5 | ||
|
|
d2889786a2 | ||
|
|
c6e2f070ee | ||
|
|
34bf82d81c | ||
|
|
2734c98716 | ||
|
|
e58292bb11 | ||
|
|
0ebc221011 | ||
|
|
c29616b341 | ||
|
|
3f24da47a0 | ||
|
|
d5b4a31c37 | ||
|
|
728736ccdd | ||
|
|
2f5a6eb993 | ||
|
|
b1c3e09155 | ||
|
|
7773631401 | ||
|
|
5e7531b9bf | ||
|
|
4f708ab9ee | ||
|
|
0b5816d6d6 | ||
|
|
976d707596 | ||
|
|
d10c44ed3a | ||
|
|
e459d01927 | ||
|
|
1e9c266457 | ||
|
|
6e8a5f3a5f | ||
|
|
53769ae1bd | ||
|
|
6e84db45f2 | ||
|
|
1af7e32c93 | ||
|
|
6e70258d82 | ||
|
|
570e41f8e0 | ||
|
|
fd5fbab115 | ||
|
|
e06b33162d | ||
|
|
ddff65d288 | ||
|
|
e91589cab5 | ||
|
|
36648805b8 | ||
|
|
fafdc213ed | ||
|
|
cc83a9df3b | ||
|
|
8fd52666b7 | ||
|
|
48def8fa5b | ||
|
|
480996b140 | ||
|
|
1012a3e312 | ||
|
|
c69dfff16e | ||
|
|
c12af57bdd | ||
|
|
91f67b683b | ||
|
|
a3c22eb836 | ||
|
|
98a3cbdf84 | ||
|
|
09347ba92a | ||
|
|
fc3314ea96 | ||
|
|
c0f1913e44 | ||
|
|
f35a2c8a04 | ||
|
|
0f28879f8d | ||
|
|
17a4222c31 | ||
|
|
9a8fa12718 | ||
|
|
0541371a0e | ||
|
|
7aa86c50c6 | ||
|
|
2a096effa7 | ||
|
|
8a6171caa5 | ||
|
|
6da5138683 | ||
|
|
eac63f7265 | ||
|
|
8f00342612 | ||
|
|
8f490e8ecd | ||
|
|
8fcaac5f1d | ||
|
|
0b1e45b6b5 | ||
|
|
ce9cd13e42 | ||
|
|
b391e93466 | ||
|
|
a2646f9871 | ||
|
|
eb5974322f | ||
|
|
137a38b3c6 | ||
|
|
08b6428d5c | ||
|
|
2eaf5cdc01 | ||
|
|
7361b4e079 | ||
|
|
c364c6a787 | ||
|
|
16ad4936ee | ||
|
|
776eafa0ce | ||
|
|
9b928ee835 | ||
|
|
ae73330314 | ||
|
|
5a9896c78c | ||
|
|
13a5a96117 | ||
|
|
06ef95fbea | ||
|
|
badeb29901 | ||
|
|
02c0b69adb | ||
|
|
3cc0383db7 | ||
|
|
a12220d234 | ||
|
|
25056f49c4 | ||
|
|
5815d90eb4 | ||
|
|
16b7d204d2 | ||
|
|
8e1991c1e1 | ||
|
|
71a378a3fb | ||
|
|
ff1f6d3d4f | ||
|
|
3d665148ca | ||
|
|
be2f993155 | ||
|
|
31774b7262 | ||
|
|
ffc11bfda3 | ||
|
|
804ee1183b | ||
|
|
2f8a41d810 | ||
|
|
6e6170ae1c | ||
|
|
caa6db8617 | ||
|
|
9a37acee3e | ||
|
|
e0d5cdd5e1 | ||
|
|
582329ffc6 | ||
|
|
5ae6586803 | ||
|
|
e810eabd32 | ||
|
|
6849192b39 | ||
|
|
6832910187 | ||
|
|
a239eaf630 | ||
|
|
14897b23b7 | ||
|
|
6ef4cecf57 | ||
|
|
7b0b0440ef | ||
|
|
45dda65ce9 | ||
|
|
9ecedfdf3c | ||
|
|
e47493e81b | ||
|
|
4624377942 | ||
|
|
10c5d87f18 | ||
|
|
831858ce7e | ||
|
|
af90f03323 | ||
|
|
26f6b89530 | ||
|
|
501c14fc65 | ||
|
|
4adb9a2683 | ||
|
|
abd61538ea | ||
|
|
7592b87a90 | ||
|
|
b3dfa4f5a2 | ||
|
|
ecf78dbafe | ||
|
|
cfa0079c3d | ||
|
|
b7d5d70a92 | ||
|
|
cdf38d15d2 | ||
|
|
6462201aac | ||
|
|
023d385af8 | ||
|
|
0aefaec46e | ||
|
|
6019e02457 | ||
|
|
6255f3b07d | ||
|
|
bc91ad0f4d | ||
|
|
2f7fe35f5c | ||
|
|
8175630619 | ||
|
|
43d3ccce95 | ||
|
|
9913c9059c | ||
|
|
5bd83516ba | ||
|
|
1519a2b468 | ||
|
|
a7668ff57f | ||
|
|
1e021cdbba | ||
|
|
a8fcf71f9c | ||
|
|
3bc6c53eb3 | ||
|
|
b8a27d8a4c | ||
|
|
48c75105e2 | ||
|
|
aad97aaea1 | ||
|
|
8f7e70d959 | ||
|
|
5f43360711 | ||
|
|
67e647a2ca | ||
|
|
746be46f1e | ||
|
|
6305d4edf9 | ||
|
|
6beec80b60 | ||
|
|
82733e1943 | ||
|
|
93e850404e | ||
|
|
2e3113b5f2 | ||
|
|
80b544aa78 | ||
|
|
ddcaf4972f | ||
|
|
66cf864ee0 | ||
|
|
3896c39ceb | ||
|
|
916967a7d7 | ||
|
|
aad293df1a | ||
|
|
b08c3186be | ||
|
|
7795305c9f | ||
|
|
06dacf04b5 | ||
|
|
b7c7148937 | ||
|
|
2d37c6b5e2 | ||
|
|
39629c5c7a | ||
|
|
4bacfcf847 | ||
|
|
daa93a7226 | ||
|
|
096fc86f17 | ||
|
|
82781e620a | ||
|
|
c0f13f7084 | ||
|
|
eafddd9e33 | ||
|
|
83321c5be7 | ||
|
|
22e1da5e76 | ||
|
|
3064cf8101 | ||
|
|
8f9e1100c8 | ||
|
|
721ad404d2 | ||
|
|
8c00dcd02d | ||
|
|
32d3d1fbe5 | ||
|
|
6f1e76198a | ||
|
|
3aefa2b4e1 | ||
|
|
b7a320fbbd | ||
|
|
ec68e012f9 | ||
|
|
c598fe7aa9 | ||
|
|
39f836b495 | ||
|
|
ef6f9f6ded | ||
|
|
a800d21a31 | ||
|
|
fe67504ffc | ||
|
|
dc92a79fcc | ||
|
|
714da1aa7c | ||
|
|
46e4f2d48c | ||
|
|
5b7f701878 | ||
|
|
c0fdef7a12 | ||
|
|
317417d541 | ||
|
|
e896da8064 | ||
|
|
a7f77c27f7 | ||
|
|
6c4148a949 | ||
|
|
bc9481db1b | ||
|
|
8229c0ed3d | ||
|
|
edb9595721 | ||
|
|
7eacfe19f6 | ||
|
|
63c5b2ab32 | ||
|
|
e338c3938b | ||
|
|
8483b17995 | ||
|
|
6ce793d582 | ||
|
|
ee2940c159 | ||
|
|
f272171099 | ||
|
|
909b512493 | ||
|
|
0acd37a328 | ||
|
|
61cd591ad5 | ||
|
|
30c25cb722 | ||
|
|
a27a51124f | ||
|
|
a114dbcd76 | ||
|
|
1e30077a65 | ||
|
|
f4efeabcf3 | ||
|
|
972515938c | ||
|
|
7d576117f9 | ||
|
|
4a7f6af8d9 | ||
|
|
3a0894aaea | ||
|
|
5abeec85cc | ||
|
|
4485e6b869 | ||
|
|
288581cb43 | ||
|
|
c47082f725 | ||
|
|
1b5f2579a5 | ||
|
|
01bb63b1a6 | ||
|
|
5804ce5f84 | ||
|
|
bf74c0c749 | ||
|
|
0993ee08e6 | ||
|
|
b25eb39fba | ||
|
|
9a91b188df | ||
|
|
596546df5a | ||
|
|
712a514c6d | ||
|
|
b353cd4ecb | ||
|
|
e7b459573e | ||
|
|
cf7e5028a4 | ||
|
|
629c290faa | ||
|
|
4b0d8557b4 | ||
|
|
de9a2fd556 | ||
|
|
c51ce40d8d | ||
|
|
9c1c3bffbe | ||
|
|
d8b1c3118a | ||
|
|
e833904b02 | ||
|
|
d7cb5a6e9e | ||
|
|
b7d967361d | ||
|
|
93dcd704c5 | ||
|
|
3064560027 | ||
|
|
8c62a893a9 | ||
|
|
a77a75660b | ||
|
|
4d9add5e7c | ||
|
|
1256d648c1 | ||
|
|
5ae2349f36 | ||
|
|
1dc2f6a164 | ||
|
|
d86c33c09e | ||
|
|
f935c789bd | ||
|
|
02594c8239 | ||
|
|
ee715d9d36 | ||
|
|
3b8c34e47c | ||
|
|
f2c5dc2b5c | ||
|
|
e6df1ddcc0 | ||
|
|
8f9db92bf0 | ||
|
|
39e679806b | ||
|
|
b84d831d8f | ||
|
|
a70d305806 | ||
|
|
0724a9efa2 | ||
|
|
74e13a4ef6 | ||
|
|
18fa6ca961 | ||
|
|
78fdcf75e7 | ||
|
|
f83306b0bf | ||
|
|
fba8e84370 | ||
|
|
26e5a07905 | ||
|
|
7037da80cb | ||
|
|
f14b712f07 | ||
|
|
2823953489 | ||
|
|
22b78fec71 | ||
|
|
cdf70e0b77 | ||
|
|
98aee31c5a | ||
|
|
24278e0eca | ||
|
|
2dbac65613 | ||
|
|
dcad0e286a | ||
|
|
4c87c9a545 | ||
|
|
2d6dd873cd | ||
|
|
f98b03b61f | ||
|
|
eac5147a45 | ||
|
|
bebd437a7e | ||
|
|
669a54d071 | ||
|
|
79cb025d25 | ||
|
|
67e8e0a367 | ||
|
|
f961a2e3b4 | ||
|
|
df794b88b0 | ||
|
|
2416d49dba | ||
|
|
2a6f11b390 | ||
|
|
7a5c8dd586 | ||
|
|
d5bdf78a29 | ||
|
|
5a6869fc5e | ||
|
|
d5ead0d315 | ||
|
|
e2748c319e | ||
|
|
d0c2addf91 | ||
|
|
0b0c8723eb | ||
|
|
d58188d7ba | ||
|
|
2a7c65c019 | ||
|
|
145f411324 | ||
|
|
46302084e7 | ||
|
|
45e9e9c938 | ||
|
|
2b48443b95 | ||
|
|
3ae43edc3e | ||
|
|
fe1b0e70b9 | ||
|
|
8cf62e560e | ||
|
|
f92c10ef71 | ||
|
|
bb63ec0c83 | ||
|
|
e676d0bdcf | ||
|
|
ff359ed118 | ||
|
|
9cfdce91a1 | ||
|
|
31a41b795e | ||
|
|
442cf3e937 | ||
|
|
3cab629a67 | ||
|
|
dcf3e0776e | ||
|
|
02ca97804e | ||
|
|
d18d19870f | ||
|
|
c5737d01c6 | ||
|
|
5d6d058965 | ||
|
|
74b3580b69 | ||
|
|
b449545ae0 | ||
|
|
ed6fb7cc43 | ||
|
|
2f4d6fc2a1 | ||
|
|
fbc268e993 | ||
|
|
743421881e | ||
|
|
f4540c2793 | ||
|
|
5aa6daf58f | ||
|
|
8b0c772423 | ||
|
|
978d578f4e | ||
|
|
d05597ccdb | ||
|
|
56c64c8045 | ||
|
|
8c1aa3ee15 | ||
|
|
935302b620 | ||
|
|
3b26031692 | ||
|
|
339021ac15 | ||
|
|
73b00b844b | ||
|
|
3c872ab611 | ||
|
|
93ebce4162 | ||
|
|
ab405901ee | ||
|
|
fd34d11eec | ||
|
|
2cafa84b75 | ||
|
|
f2276bb70c | ||
|
|
b1f7543436 | ||
|
|
b7fd09740b | ||
|
|
8bd7823b70 | ||
|
|
747d53790c | ||
|
|
8c9ef2eef4 | ||
|
|
ad02c8d510 | ||
|
|
0f1bb8545d | ||
|
|
048cb7993d | ||
|
|
d9b53b476f | ||
|
|
9bedf0d13e | ||
|
|
be48a330b4 | ||
|
|
4874a81dc5 | ||
|
|
94cbfd6a5c | ||
|
|
b2111b3c3d | ||
|
|
37b22ec99d | ||
|
|
00205bfa58 | ||
|
|
588d364efe | ||
|
|
cfb41c4dab | ||
|
|
d032bc5691 | ||
|
|
2798827066 | ||
|
|
d8cc6b4c39 | ||
|
|
b54a33efce | ||
|
|
d2ad84453d | ||
|
|
92acfcf454 | ||
|
|
39524318aa | ||
|
|
7e8e288ba2 | ||
|
|
f8c64b1fb4 | ||
|
|
f8ad9d13f8 | ||
|
|
a465c1aa0a | ||
|
|
4d85a49666 | ||
|
|
7b276e38f4 | ||
|
|
16fe7919a0 | ||
|
|
94b3cdf9e7 | ||
|
|
85b63de631 | ||
|
|
fea6fd1a70 | ||
|
|
0233fbff51 | ||
|
|
4f21cef3af | ||
|
|
ea5110cec3 | ||
|
|
54b6616ec9 | ||
|
|
18b8a7d473 | ||
|
|
721a0c8bcb | ||
|
|
02c263fc19 | ||
|
|
94441d7df3 | ||
|
|
147c50e7ca | ||
|
|
ea17e08ae6 | ||
|
|
64ab14b237 | ||
|
|
a3d6919431 | ||
|
|
5f6afca18a | ||
|
|
e4a2a60f55 | ||
|
|
900389d857 | ||
|
|
cd23a2ecaf | ||
|
|
d072eba687 | ||
|
|
f6392baab3 | ||
|
|
30acfb89c3 | ||
|
|
ef7166057a | ||
|
|
a2ab685ba9 | ||
|
|
da85fba015 | ||
|
|
080e42ec9f | ||
|
|
d140cffc08 | ||
|
|
d1fbccc9ce | ||
|
|
d2883fc554 | ||
|
|
952098c00f | ||
|
|
9479bcf77b | ||
|
|
26b5eebc17 | ||
|
|
1c82e8b1d5 | ||
|
|
abdfcf9d0b | ||
|
|
55c317c1cf | ||
|
|
59effb3412 | ||
|
|
6b9a6c50fe | ||
|
|
72fdcf120c | ||
|
|
0b4105915a | ||
|
|
3c3e3baa14 | ||
|
|
10983338d8 | ||
|
|
3247152ff7 | ||
|
|
55b83af845 | ||
|
|
d640aba903 | ||
|
|
75fa95c7ff | ||
|
|
c4ec38f358 | ||
|
|
ec8519b969 | ||
|
|
f095dec43d | ||
|
|
dc6c21833d | ||
|
|
08dd95e52b | ||
|
|
a86317ce5a | ||
|
|
e477a0b8fc | ||
|
|
ff1708a899 | ||
|
|
ef563f038d | ||
|
|
c8bb83b824 | ||
|
|
63276a3f84 | ||
|
|
a342de6143 | ||
|
|
9954b36ec7 | ||
|
|
903cb8d7e5 | ||
|
|
9b41f846d6 | ||
|
|
620e937473 | ||
|
|
573f112b37 | ||
|
|
0ca4c189a5 | ||
|
|
a71cb5f521 | ||
|
|
6a0ce1850a | ||
|
|
b5a4e21c81 | ||
|
|
bee6b84733 | ||
|
|
7ce45a3bae | ||
|
|
63b97d6817 | ||
|
|
c125f5376c | ||
|
|
3e412a2a1f | ||
|
|
ff90ddbd2f | ||
|
|
fae7ddc611 | ||
|
|
1f05275ac4 | ||
|
|
469926c5e1 | ||
|
|
614cb88116 | ||
|
|
5cb1a2f26d | ||
|
|
ea8473943b | ||
|
|
9bc5ce300e | ||
|
|
139173caa0 | ||
|
|
0fc6ec2df9 | ||
|
|
d209cc5671 | ||
|
|
aa4b74c194 | ||
|
|
fc81d79807 | ||
|
|
6c36013e2a | ||
|
|
3e34bd64bf | ||
|
|
c88e0a0eb9 | ||
|
|
5c31037c04 | ||
|
|
5764ee7a2a | ||
|
|
bcad7afcc9 | ||
|
|
583b6d92ec | ||
|
|
0cf7bb056e | ||
|
|
bd517cf915 | ||
|
|
a3d400b5cc | ||
|
|
db7bde0a6f | ||
|
|
daad7d71f9 | ||
|
|
6de3a6090a | ||
|
|
629206c0dc | ||
|
|
6e3e2cf0f3 | ||
|
|
03219a9a4e | ||
|
|
a19a13136c | ||
|
|
0a4820f4f8 | ||
|
|
116638f352 | ||
|
|
fe4ab0abbb | ||
|
|
a62eeaaecc | ||
|
|
11b409907e | ||
|
|
befc0f62b8 | ||
|
|
3cf80b0831 | ||
|
|
2709dc2e36 | ||
|
|
1653991b9d | ||
|
|
8155ef5e67 | ||
|
|
507798c541 | ||
|
|
9883e1e8b8 | ||
|
|
e5de176b16 | ||
|
|
0f233beff9 | ||
|
|
dba249554d | ||
|
|
1d2351bf85 | ||
|
|
cf335a5dc4 | ||
|
|
4a6ef91eb3 | ||
|
|
961fc27215 | ||
|
|
9d8e8028a6 | ||
|
|
476b9020ce | ||
|
|
d234493b4a | ||
|
|
428e51b619 | ||
|
|
ef65299dff | ||
|
|
48c1f0f03d | ||
|
|
e2a2709ad0 | ||
|
|
5d768bd3cf | ||
|
|
8c046429cc | ||
|
|
a2293d94f6 | ||
|
|
f22001d527 | ||
|
|
9e49a33b3c | ||
|
|
30fe3dc6f5 | ||
|
|
ad38e9f0fe | ||
|
|
78c37ff8b6 | ||
|
|
8587ae5883 | ||
|
|
5f8cf18a5a | ||
|
|
bc94d92cba | ||
|
|
31bf130b1c | ||
|
|
619b8e473f | ||
|
|
eaf3787ae6 | ||
|
|
72dcbefff4 | ||
|
|
c054d8e7dc | ||
|
|
d76e801c47 | ||
|
|
942d984dc5 | ||
|
|
316bd8d155 | ||
|
|
6cbdeb9411 | ||
|
|
e4bfe81712 | ||
|
|
d62e95d0f8 | ||
|
|
233f2e478a | ||
|
|
ae21783680 | ||
|
|
88476fe698 | ||
|
|
be4e85f0f2 | ||
|
|
9b2907dc64 | ||
|
|
99c5366f50 | ||
|
|
9afdb429fa | ||
|
|
0b21474b79 | ||
|
|
432f0c3630 | ||
|
|
0e33636aaf | ||
|
|
dc90ab3cee | ||
|
|
991fd015de | ||
|
|
a8688bff85 | ||
|
|
1e28611435 | ||
|
|
07cb56e1ea | ||
|
|
5416782392 | ||
|
|
e6a47bfa89 | ||
|
|
99ea666bf2 | ||
|
|
881dafcdff | ||
|
|
deebe3ca1f | ||
|
|
4d27198ad7 | ||
|
|
8d383ea15c | ||
|
|
ef3a011919 | ||
|
|
31b91c10ec | ||
|
|
46e7207e93 | ||
|
|
e84f356a29 | ||
|
|
3a9cc0ab63 | ||
|
|
c13ebc8692 | ||
|
|
e7d0aedfb4 | ||
|
|
f9497e35e4 | ||
|
|
bdad5ef745 | ||
|
|
55b348f4fc | ||
|
|
9ee9523680 | ||
|
|
a182743561 | ||
|
|
6b4b86434d | ||
|
|
faaef03604 | ||
|
|
18954ee5b8 | ||
|
|
e6b2be2bc9 | ||
|
|
303a9de045 | ||
|
|
cd2eb59da6 | ||
|
|
a4a25dc28d | ||
|
|
0bb15b2ff7 | ||
|
|
0c1bfefbc8 | ||
|
|
69a3db491c | ||
|
|
8d13aa3f2e | ||
|
|
8cd00287cd | ||
|
|
fdad4019e5 | ||
|
|
655acc746d | ||
|
|
e2d2c9d377 | ||
|
|
7ab1e64aab | ||
|
|
948758f758 | ||
|
|
67c02274cb | ||
|
|
d18b91e828 | ||
|
|
4b516273f6 | ||
|
|
26d3bfe9c2 | ||
|
|
f9eb3f8476 | ||
|
|
1356a17e84 | ||
|
|
68978a0109 | ||
|
|
796d96f06b | ||
|
|
152feb898e | ||
|
|
c1786df2a6 | ||
|
|
fe376abe6c | ||
|
|
4ad91a6fa8 | ||
|
|
39cf935929 | ||
|
|
872e41825e | ||
|
|
fed1418c0e | ||
|
|
2d1d996c50 | ||
|
|
e84fc6426c | ||
|
|
d177b1adea | ||
|
|
1003c42310 | ||
|
|
4272ec7a82 | ||
|
|
a404f2e6fa | ||
|
|
85648da706 | ||
|
|
681fb1eeaa | ||
|
|
ffb0454424 | ||
|
|
cae85c6247 | ||
|
|
91c9fd3c3c | ||
|
|
1589b72699 | ||
|
|
af986d8f4c | ||
|
|
73d9b58dfc | ||
|
|
518c028a3d | ||
|
|
714ff6c32e | ||
|
|
1f2eafc4f2 | ||
|
|
3f3873ceb5 | ||
|
|
bddad4d766 | ||
|
|
20dce26b1d | ||
|
|
1365c830b2 | ||
|
|
3a2b13c02b | ||
|
|
e7f278b5d2 | ||
|
|
e6c628caba | ||
|
|
1189503b4d | ||
|
|
6909a15400 | ||
|
|
2df18c91e9 | ||
|
|
bf1e29e227 | ||
|
|
f01059283a | ||
|
|
0d489518ab | ||
|
|
5fc77fe89e | ||
|
|
fcd300ad4d | ||
|
|
ba83767706 | ||
|
|
7b249790f5 | ||
|
|
8ce3943e09 | ||
|
|
267de68441 | ||
|
|
0eebfb0aaa | ||
|
|
4d5bdf1419 | ||
|
|
5986448d67 | ||
|
|
35e04bdbe3 | ||
|
|
5e73d68e4a | ||
|
|
cc6ba726eb | ||
|
|
42f961816c | ||
|
|
982e536ad2 | ||
|
|
5c08bd6a73 | ||
|
|
7624c89d12 | ||
|
|
250fb15592 | ||
|
|
3e26971044 | ||
|
|
4340899833 | ||
|
|
fdc5fa34be | ||
|
|
2032b15acf | ||
|
|
d675c67f79 | ||
|
|
853234f7d7 | ||
|
|
47af5c1b5c | ||
|
|
00e637645c | ||
|
|
068883a441 | ||
|
|
43a95d709d | ||
|
|
73d63c508a | ||
|
|
c0a1dab09d | ||
|
|
e642e39324 | ||
|
|
dfb2598e41 | ||
|
|
cd8bcd4c02 | ||
|
|
4e28a007c8 | ||
|
|
4ba915bbdd | ||
|
|
31bbf56ff1 | ||
|
|
19acaf3f86 | ||
|
|
3080fb2806 | ||
|
|
bddff3b70a | ||
|
|
9d9a7cf370 | ||
|
|
fcbbdc87fc | ||
|
|
71292a7617 | ||
|
|
90c021fc31 | ||
|
|
e70875ad5c | ||
|
|
6aef58318c | ||
|
|
c9f994d92d | ||
|
|
c71c5eb422 | ||
|
|
39db6bb461 | ||
|
|
1af4848324 | ||
|
|
c1c586a072 | ||
|
|
5983813d12 | ||
|
|
e93aaf3957 | ||
|
|
819c955cca | ||
|
|
daaa5059e9 | ||
|
|
e3f55a75a3 | ||
|
|
d5bbea097b | ||
|
|
d1a7c85e95 | ||
|
|
2494fcf8d8 | ||
|
|
0191955ab6 | ||
|
|
60f6566c78 | ||
|
|
32fd9223ff | ||
|
|
8ce1de036a | ||
|
|
5225ca8fc2 | ||
|
|
67342781b7 | ||
|
|
c267ca2584 | ||
|
|
fbee6d4017 | ||
|
|
4c52b65374 | ||
|
|
13d2f8fa59 | ||
|
|
bd65f81074 | ||
|
|
23c7028b2a | ||
|
|
c153215d6d | ||
|
|
2c70f5168a | ||
|
|
dab80497bb | ||
|
|
ba6ac5019e | ||
|
|
e5dd03dbcb | ||
|
|
899b06d6db | ||
|
|
8a945a1a52 | ||
|
|
61342946a4 | ||
|
|
61a5459ccb | ||
|
|
12d1f8202d | ||
|
|
384cb5e415 | ||
|
|
d8bed3b0ce | ||
|
|
29165af761 | ||
|
|
140a42fbcb | ||
|
|
289ef4c6d4 | ||
|
|
f7b7c234b7 | ||
|
|
4ea1b8cffc | ||
|
|
507638e6d8 | ||
|
|
2be045593a | ||
|
|
bdd458d2ae | ||
|
|
6cab4d7100 | ||
|
|
cd6f95c90d | ||
|
|
35898a6cdf | ||
|
|
74b6d5c2ed | ||
|
|
6c40dc0631 | ||
|
|
a671c43862 | ||
|
|
62c8f2ac34 | ||
|
|
62e2d8d9a7 | ||
|
|
1fa301b719 | ||
|
|
a7728c9067 | ||
|
|
e508d6db5d | ||
|
|
084106ced6 | ||
|
|
579a88b7c4 | ||
|
|
1c4db01e19 | ||
|
|
14efde9190 | ||
|
|
e12cfc89de | ||
|
|
3a51a6ded7 | ||
|
|
0e8ea4f27c | ||
|
|
d48617a3e8 | ||
|
|
f81b00d488 | ||
|
|
f15c679fea | ||
|
|
095608530f | ||
|
|
912e3fc213 | ||
|
|
3141cc9bc7 | ||
|
|
81340e9d5c | ||
|
|
78a92c7d43 | ||
|
|
31dcdea27b | ||
|
|
2e2f92f4f6 | ||
|
|
a7d85480a8 | ||
|
|
12c13e6193 | ||
|
|
9350476263 | ||
|
|
9d6dc46812 | ||
|
|
6d1c9f2764 | ||
|
|
94b0d9dfd5 | ||
|
|
23923af487 | ||
|
|
be50130c3f | ||
|
|
94c81c73c5 | ||
|
|
23a5cd5cff | ||
|
|
08c0c90a05 | ||
|
|
2647b77c01 | ||
|
|
55a2a5c8e5 | ||
|
|
430aa9af89 | ||
|
|
173fb060cb | ||
|
|
47e2e0bd58 | ||
|
|
f2e2786959 | ||
|
|
4f706ed69c | ||
|
|
bef2ee8f72 | ||
|
|
ca3e82341d | ||
|
|
b4c4c4cc89 | ||
|
|
8717bdffa9 | ||
|
|
cbd56fc4f5 | ||
|
|
e01528137e | ||
|
|
15e946053b | ||
|
|
a7e4e07a80 | ||
|
|
3e40f22d15 | ||
|
|
4246d83f2a | ||
|
|
07a2e0b55a | ||
|
|
ec3c899955 | ||
|
|
1a5d5c96ed | ||
|
|
79d03ece66 | ||
|
|
6069be7a93 | ||
|
|
ab501842c8 | ||
|
|
aead66ccbf | ||
|
|
8660b41833 | ||
|
|
509e09c2c5 | ||
|
|
506951a5a4 | ||
|
|
ab5dd3ae6f | ||
|
|
0cd03ca9e6 | ||
|
|
f3ee2ac9ef | ||
|
|
2d7bf06dea | ||
|
|
411dfd9a3f | ||
|
|
17f34f5127 | ||
|
|
5dd3437da9 | ||
|
|
6a2eefaf3f | ||
|
|
ec2e53dc6b | ||
|
|
36a134798b | ||
|
|
5195b2b1b4 | ||
|
|
c4558d2ca7 | ||
|
|
6ec6303933 | ||
|
|
1629feb15e | ||
|
|
8ecf3dcc80 | ||
|
|
f3c9143a81 | ||
|
|
3428499492 | ||
|
|
0d28f378a7 | ||
|
|
87f1a9d9dc | ||
|
|
e8d9ea116a | ||
|
|
2c98a37512 | ||
|
|
546619ee24 | ||
|
|
7880753099 | ||
|
|
d9dd3a7eda | ||
|
|
9709f7f821 | ||
|
|
e64f6a1db3 | ||
|
|
4375422c09 | ||
|
|
03b059c1d5 | ||
|
|
a87de1b565 | ||
|
|
561e7cd5a9 | ||
|
|
6545df2b15 | ||
|
|
3a87a40593 | ||
|
|
04902965fe | ||
|
|
6627cc9666 | ||
|
|
1bf9e41c26 | ||
|
|
482d470bf2 | ||
|
|
7da5714fd9 | ||
|
|
a792bae121 | ||
|
|
7c2b2620c1 | ||
|
|
26f1e2c9e3 | ||
|
|
10150957ff | ||
|
|
d557ba2d97 | ||
|
|
c9df9c93ed | ||
|
|
9a310c312e | ||
|
|
3eb3f66e96 | ||
|
|
10c706d9a5 | ||
|
|
2e2dbf6c33 | ||
|
|
0fa0946a46 | ||
|
|
14e0cbde9c | ||
|
|
43e74a9c61 | ||
|
|
fee20573d2 | ||
|
|
5fd88bf801 | ||
|
|
46fa645555 | ||
|
|
bbe12bf4b1 | ||
|
|
74cbf1877b | ||
|
|
d78fe3b4d4 | ||
|
|
b7761beee9 | ||
|
|
42b55c60e7 | ||
|
|
6cd3310171 | ||
|
|
ee508f85b4 | ||
|
|
e47d21024c | ||
|
|
54827f7267 | ||
|
|
ae4420e604 | ||
|
|
011362bf1c | ||
|
|
a6754e29a6 | ||
|
|
b897a5d20a | ||
|
|
4dae27c1d4 | ||
|
|
fd06f70387 | ||
|
|
692502b177 | ||
|
|
0a7b9c03e4 | ||
|
|
edd4359554 | ||
|
|
e61849c3c4 | ||
|
|
6db1ee634d | ||
|
|
1cf4791f95 | ||
|
|
57361e2943 | ||
|
|
e69f76de87 | ||
|
|
71225da135 | ||
|
|
d3c9aff2f4 | ||
|
|
79e8ed47d5 | ||
|
|
e5b59a6bad | ||
|
|
3da3eee15f | ||
|
|
42b748a881 | ||
|
|
a43e03b549 | ||
|
|
809ba66290 | ||
|
|
4237043f38 | ||
|
|
cdeac05e88 | ||
|
|
824b0f832a | ||
|
|
bf7cf0ee9d | ||
|
|
8df825abc5 | ||
|
|
f1f51521f4 | ||
|
|
88fd748dd5 | ||
|
|
1c4e89d2bf | ||
|
|
f4c712dafc | ||
|
|
fe86869f37 | ||
|
|
25672cdc47 | ||
|
|
7372583cab | ||
|
|
e40347dd53 | ||
|
|
b90540c1eb | ||
|
|
b6ec618f97 | ||
|
|
ad2b2c9c62 | ||
|
|
11fd944f53 | ||
|
|
0648f1d0a2 | ||
|
|
c89d2cf138 | ||
|
|
da09477be8 | ||
|
|
c36e692411 | ||
|
|
b5c33ec26b | ||
|
|
e6e60795b7 | ||
|
|
afe221c29d | ||
|
|
5928b85ec1 | ||
|
|
70ee62f43f | ||
|
|
056f93f3e4 | ||
|
|
1d0f2c16e0 | ||
|
|
bd71c1200e | ||
|
|
a1b1f6be63 | ||
|
|
5f27e9b6e7 | ||
|
|
3f44e07b7c | ||
|
|
5ffc6ffca5 | ||
|
|
b756b80786 | ||
|
|
b01c17d1a0 | ||
|
|
2d94db4945 | ||
|
|
181854fc35 | ||
|
|
92c9a0a9aa | ||
|
|
ba5e2e3f0f | ||
|
|
43ebd4450d | ||
|
|
63df801b03 | ||
|
|
6069071e4d | ||
|
|
12edfeb216 | ||
|
|
27cfdc897b | ||
|
|
22497757e9 | ||
|
|
896097da0d | ||
|
|
3d2aa622f1 | ||
|
|
ec7b351cf0 | ||
|
|
fc97e3d2b8 | ||
|
|
1d914d820b | ||
|
|
d2e6f6fef0 | ||
|
|
c1df79b713 | ||
|
|
3181c566c0 | ||
|
|
d8664c8da4 | ||
|
|
318d7276c0 | ||
|
|
658079af55 | ||
|
|
b61bcb6ad6 | ||
|
|
fffadb975b | ||
|
|
f3cd908d5c | ||
|
|
4a83d43a8f | ||
|
|
ac75b62f4d | ||
|
|
8616d340bb | ||
|
|
406eff5ef0 | ||
|
|
9873d909d0 | ||
|
|
2d46830ba8 | ||
|
|
a7ca705552 | ||
|
|
6664116042 | ||
|
|
944b9f3ae6 | ||
|
|
044dcb0790 | ||
|
|
29c1dc2c07 | ||
|
|
3e3665a13b | ||
|
|
99a9a1e38d | ||
|
|
d66825515d | ||
|
|
669ebc594c | ||
|
|
1b87f9312b | ||
|
|
325dd0308b | ||
|
|
85d23e2c32 | ||
|
|
19e1631697 | ||
|
|
24a19a0dd9 | ||
|
|
51c107656f | ||
|
|
06907cb942 | ||
|
|
b81e0f9e4c | ||
|
|
4907dedf69 | ||
|
|
af25d47dd9 | ||
|
|
f16ec62b4a | ||
|
|
1636531d4a | ||
|
|
6cd2665e12 | ||
|
|
4b8d617364 | ||
|
|
31ca42bf1a | ||
|
|
d11bdfedb6 | ||
|
|
653db28675 | ||
|
|
4701affbf9 | ||
|
|
63a559310c | ||
|
|
108e879266 | ||
|
|
b610155956 | ||
|
|
8e88e531de | ||
|
|
8690c02972 | ||
|
|
0388ba5032 | ||
|
|
2a6f4e19cc | ||
|
|
e79a7c2261 | ||
|
|
240c209360 | ||
|
|
411e21210c | ||
|
|
c8ba041a38 | ||
|
|
b9a8c6414d | ||
|
|
dabac03820 | ||
|
|
0cd3cd3e05 | ||
|
|
1bde52623b | ||
|
|
be2d606193 | ||
|
|
d6989c1847 | ||
|
|
cbffd14539 | ||
|
|
052692ac8c | ||
|
|
2c3e3b583a | ||
|
|
98404e12c5 | ||
|
|
97d50a0692 | ||
|
|
2c70cef453 | ||
|
|
1491dcdc92 | ||
|
|
3f7e6c990f | ||
|
|
bdbbde4d36 | ||
|
|
c305949435 | ||
|
|
00e87adcfd | ||
|
|
bc8fba9cc4 | ||
|
|
9a63754b43 | ||
|
|
efd729d0b8 | ||
|
|
e38dc93a66 | ||
|
|
efde3219bd | ||
|
|
a94a7d4495 | ||
|
|
7613d749ec | ||
|
|
31aef6460d | ||
|
|
cf1bd9b61b | ||
|
|
642e850dfe | ||
|
|
69388f032e | ||
|
|
cbdc32e95e | ||
|
|
d8239a39c9 | ||
|
|
b2de24db73 | ||
|
|
27c76960b4 | ||
|
|
4f031c11c6 | ||
|
|
0fb092f2a5 | ||
|
|
e1ea7a28c3 | ||
|
|
7464843e53 | ||
|
|
5f40f732a9 | ||
|
|
52467c54e3 | ||
|
|
969cf67ba8 | ||
|
|
688e5a3af6 | ||
|
|
52b342464b | ||
|
|
0011a50c0b | ||
|
|
b3be4d11e3 | ||
|
|
b2b31b0421 | ||
|
|
5f3b25b43a | ||
|
|
a9647152f7 | ||
|
|
e98d1c0cb7 | ||
|
|
1e6a533ac7 | ||
|
|
c6a00e157d | ||
|
|
0506bf0352 | ||
|
|
7a61fd3055 | ||
|
|
698f4fd450 | ||
|
|
7c9062fd3d | ||
|
|
612d11bd03 | ||
|
|
c63f370d8b | ||
|
|
c76dd371f3 | ||
|
|
5d6fb5a56b | ||
|
|
f231ebb0ad | ||
|
|
e0ff129dd1 | ||
|
|
980b9aaab3 | ||
|
|
29036504e6 | ||
|
|
d07328417f | ||
|
|
2545372a76 | ||
|
|
c1a6767187 | ||
|
|
c5ca199163 | ||
|
|
dd067847dd | ||
|
|
ce853bc252 | ||
|
|
e9653f1029 | ||
|
|
83208d8b89 | ||
|
|
37838a49ec | ||
|
|
52bf72787f | ||
|
|
621864be18 | ||
|
|
114550b0f7 | ||
|
|
fb16583964 | ||
|
|
3fc471eb32 | ||
|
|
d2964c1fa4 | ||
|
|
369bef5e1e | ||
|
|
8fa301ec05 | ||
|
|
1dbc0b448a | ||
|
|
e27a1f98aa | ||
|
|
5a60160035 | ||
|
|
9ca6bb9296 | ||
|
|
8ec5b1cd84 | ||
|
|
181d593cee | ||
|
|
eb9e6434f1 | ||
|
|
2b719b6dc0 | ||
|
|
fc25abdbfd | ||
|
|
89d8c34cae | ||
|
|
b8d2343765 | ||
|
|
c0b4bf2f94 | ||
|
|
96a992fadb | ||
|
|
32aa5ad415 | ||
|
|
24c5e7d6cd | ||
|
|
e5718ed264 | ||
|
|
7a4d851201 | ||
|
|
cb52ca220e | ||
|
|
6c571b30d2 | ||
|
|
ebe2a5e2cc | ||
|
|
8b4de95919 | ||
|
|
7e2fa38519 | ||
|
|
47fc7f22b0 | ||
|
|
012af73844 | ||
|
|
68cc9b2059 | ||
|
|
53e0979f29 | ||
|
|
5d745a60dc | ||
|
|
ff64f908be | ||
|
|
40f5f73658 | ||
|
|
68ec7ac095 | ||
|
|
4ca8cb05fa | ||
|
|
6bd041f800 | ||
|
|
982f7cba59 | ||
|
|
1b6bd42201 | ||
|
|
4967771df5 | ||
|
|
a5705d3308 | ||
|
|
0e81313477 | ||
|
|
5dd15b3c47 | ||
|
|
7a05ad7023 | ||
|
|
52eb61736d | ||
|
|
b48159b104 | ||
|
|
154433b2e9 | ||
|
|
058eb9e709 | ||
|
|
8557614322 | ||
|
|
937214bc59 | ||
|
|
447580a6b7 | ||
|
|
418a12dd03 | ||
|
|
5db254f3a5 | ||
|
|
530c17f4f7 | ||
|
|
a254507be1 | ||
|
|
2b4f858caf | ||
|
|
cb694f944c | ||
|
|
1ba5b27f45 | ||
|
|
f2d4453b04 | ||
|
|
5d37b42576 | ||
|
|
1ad53bc889 | ||
|
|
f241a63e86 | ||
|
|
796c1b46c2 | ||
|
|
270bfad96f | ||
|
|
6e1e537b5f | ||
|
|
eb7cd7ccce | ||
|
|
473af155fc | ||
|
|
16d31bc5e6 | ||
|
|
8cb8298c03 | ||
|
|
b942da3f68 | ||
|
|
ceee6049dc | ||
|
|
d82f0b62a5 | ||
|
|
a725676346 | ||
|
|
d593e47554 | ||
|
|
b2c113e5b1 | ||
|
|
c3696f7897 | ||
|
|
1f60d6374c | ||
|
|
7ba0bda244 | ||
|
|
b736b8616b | ||
|
|
e4d5e7c78b | ||
|
|
54d6aee028 | ||
|
|
c61fe621b0 | ||
|
|
697b699873 | ||
|
|
6cc6ca9f3c | ||
|
|
1568930da6 | ||
|
|
8f5d9b2c0e | ||
|
|
d648957864 | ||
|
|
fd7a0950a7 | ||
|
|
a58c5f5a4c | ||
|
|
58787f80a1 | ||
|
|
1eb9460f2b | ||
|
|
ebae8dad0a | ||
|
|
12d8e0ef38 | ||
|
|
ce0f713f03 | ||
|
|
9fc7197c4f | ||
|
|
6aff1545c2 | ||
|
|
bfff7ff5f9 | ||
|
|
d9b0b56e3e | ||
|
|
6d3c4e6efc | ||
|
|
47df9eb156 | ||
|
|
2b7f984de8 | ||
|
|
95ce623da4 | ||
|
|
a59cf50f03 | ||
|
|
6ea50567b6 | ||
|
|
a7e659abd1 | ||
|
|
936aeed0a5 | ||
|
|
205e1d88b3 | ||
|
|
631675fdd6 | ||
|
|
a8c9898253 | ||
|
|
ad01829b23 | ||
|
|
a9645eda73 | ||
|
|
ea1bad8724 | ||
|
|
bb1e08a6be | ||
|
|
795729a0b7 | ||
|
|
d92344f383 | ||
|
|
5934132b55 | ||
|
|
921ee1464b | ||
|
|
8df2c3d707 | ||
|
|
c846e33a10 | ||
|
|
16b4b9bf40 | ||
|
|
cdfef3bf9e | ||
|
|
5addbcbbb0 | ||
|
|
6661018691 | ||
|
|
13acb06d1a | ||
|
|
e8582c8655 | ||
|
|
28aaa94022 | ||
|
|
06f3df0ff4 | ||
|
|
598d929aba | ||
|
|
1d61484992 | ||
|
|
b019ee09c6 | ||
|
|
f99353f649 | ||
|
|
11d9642639 | ||
|
|
cd347fa110 | ||
|
|
427fd58ef2 | ||
|
|
e9ab9f51fc | ||
|
|
00e0e85793 | ||
|
|
1ef01be4b5 | ||
|
|
25ba18e8a7 | ||
|
|
05f91dc293 | ||
|
|
0e094f6618 | ||
|
|
f507724b5c | ||
|
|
4fe4e589fb | ||
|
|
19d1a6babc | ||
|
|
2e40123557 | ||
|
|
3b31a9233d | ||
|
|
3af57957d5 | ||
|
|
4f30e014a4 | ||
|
|
6906d146bb | ||
|
|
7904d87ddd | ||
|
|
4185c1e422 | ||
|
|
220384997f | ||
|
|
831ff350f2 | ||
|
|
9ee7471bd5 | ||
|
|
1568d2d602 | ||
|
|
87accc624f | ||
|
|
18251b784f | ||
|
|
c8d4193f08 | ||
|
|
ea7ec448dd | ||
|
|
06a4c301cd | ||
|
|
c12a98510c | ||
|
|
71c12360c7 | ||
|
|
5c468d7591 | ||
|
|
80294e1034 | ||
|
|
ac20cf0060 | ||
|
|
34e34910fd | ||
|
|
27c35174bc | ||
|
|
ee6a239679 | ||
|
|
2fb0911e2a | ||
|
|
0503f08f67 | ||
|
|
5ba772df93 | ||
|
|
8ad141de6f | ||
|
|
af0ab4e8ad | ||
|
|
7172154da7 | ||
|
|
1749b95b57 | ||
|
|
5d63c6b526 | ||
|
|
7a2cd15173 | ||
|
|
7c3c5ae08e | ||
|
|
a4e5751cff | ||
|
|
e14fbda502 | ||
|
|
5a27a84f5a | ||
|
|
321c29fe1c | ||
|
|
c5858de567 | ||
|
|
43382a0ac6 | ||
|
|
af78355570 | ||
|
|
c2743e6dad | ||
|
|
df72f5e37c | ||
|
|
31c71b4a48 | ||
|
|
ddbd590bef | ||
|
|
61e6d8af96 | ||
|
|
3bdfc6b499 | ||
|
|
8ff9b44abb | ||
|
|
536c5a900a | ||
|
|
7846fa5829 | ||
|
|
3895c083cb | ||
|
|
de156c59e4 | ||
|
|
633078004a | ||
|
|
7aeda3b0c7 | ||
|
|
94213bb398 | ||
|
|
bf6415accd | ||
|
|
0f602e0e13 | ||
|
|
65ddf980e0 | ||
|
|
09a4d14f8f | ||
|
|
1af2f5b214 | ||
|
|
7258ddc318 | ||
|
|
f54a5c6591 | ||
|
|
d26f7f696d | ||
|
|
160b58cf61 | ||
|
|
6bc0ce8046 | ||
|
|
a180e90a6d | ||
|
|
ffda60996d | ||
|
|
6df5ddb973 | ||
|
|
4eb4186b5c | ||
|
|
973e3f8f7e | ||
|
|
2c99aa4ea9 | ||
|
|
7777be6fc1 | ||
|
|
5d1cafdebc | ||
|
|
ce21a9d250 | ||
|
|
dfd3425e65 | ||
|
|
8cfc9c7493 | ||
|
|
00486d39e2 | ||
|
|
20a5bf424f | ||
|
|
1446e5bb50 | ||
|
|
4514fc12bd | ||
|
|
ab0a907c7a | ||
|
|
7e1413badf | ||
|
|
024c15d4d3 | ||
|
|
6a163b8cc5 | ||
|
|
8a7ba5a709 | ||
|
|
ce4d04290e | ||
|
|
59c8def566 | ||
|
|
f1168f7c59 | ||
|
|
7fd3dd9ebf | ||
|
|
220e4ad8a6 | ||
|
|
81474be103 | ||
|
|
318d06efda | ||
|
|
18930a43f2 | ||
|
|
9c8666573b | ||
|
|
b96037f160 | ||
|
|
d58beb8f4c | ||
|
|
3d415d653b | ||
|
|
d5a8675d1e | ||
|
|
5de059789d | ||
|
|
f839713a94 | ||
|
|
18b69cac99 | ||
|
|
817947e373 | ||
|
|
35a0e0c625 | ||
|
|
b95cddb0c7 | ||
|
|
cd154ad357 | ||
|
|
143f542bd6 | ||
|
|
9c99fc7bb1 | ||
|
|
3e7d42b023 | ||
|
|
1bd235616f | ||
|
|
d5e86f7190 | ||
|
|
f210180aa6 | ||
|
|
e687a91243 | ||
|
|
ccc37b5dc5 | ||
|
|
a029e70863 | ||
|
|
2ff8b9fb20 | ||
|
|
d35d00f301 | ||
|
|
170439f91c | ||
|
|
c72d97c64a | ||
|
|
e485047a10 | ||
|
|
d69de9c332 | ||
|
|
840ae2f86b | ||
|
|
1f3a117744 | ||
|
|
f5188cdb32 | ||
|
|
1be5222e66 | ||
|
|
a4bb9eaa55 | ||
|
|
791f8e3b9a | ||
|
|
02d1c9f6d2 | ||
|
|
6135b450c2 | ||
|
|
aa614e83f2 | ||
|
|
878926f57c | ||
|
|
ac86ee8fa9 | ||
|
|
eaa644dc20 | ||
|
|
d8d0c0d2fe | ||
|
|
659a3d88c6 | ||
|
|
66d0b25448 | ||
|
|
2ea881301a | ||
|
|
2bb63ad051 | ||
|
|
9e5403aeb3 | ||
|
|
48eb66383b | ||
|
|
3c2e0fff07 | ||
|
|
446993eaa6 | ||
|
|
09fbda603c | ||
|
|
d92b44e93f | ||
|
|
9bcaa1e498 | ||
|
|
b0da8319b7 | ||
|
|
b7d0bfa972 | ||
|
|
1dac13be16 | ||
|
|
266c3d4753 | ||
|
|
9a02add930 | ||
|
|
d9a95aae09 | ||
|
|
fd7da9d61a | ||
|
|
94c30924dd | ||
|
|
237ab974dd | ||
|
|
67bc9acbe0 | ||
|
|
b13a8ab4e3 | ||
|
|
9c3981bc8e | ||
|
|
ed0918d097 | ||
|
|
5e954f4f76 | ||
|
|
4273c52efc | ||
|
|
4a2d61bc84 | ||
|
|
5f46534b72 | ||
|
|
f38fb61c62 | ||
|
|
6c8d6aaf71 | ||
|
|
74007d5e5d | ||
|
|
ad4b0f092b | ||
|
|
b02225dd80 | ||
|
|
70e5068e37 | ||
|
|
aed76b2a0a | ||
|
|
18d40102f7 | ||
|
|
5b467ff82a | ||
|
|
e4eecd247c | ||
|
|
f11c6c3cf4 | ||
|
|
6b0857dcff | ||
|
|
752449bbc0 | ||
|
|
77076191c7 | ||
|
|
faeedf1355 | ||
|
|
4978af50e4 | ||
|
|
6d6c1a9672 | ||
|
|
4a6779469c | ||
|
|
eada1fe12c | ||
|
|
1ded37d253 | ||
|
|
64158b1b10 | ||
|
|
ce97a7e7a6 | ||
|
|
c0b53d6b48 | ||
|
|
68cdc95da5 | ||
|
|
6b53479ac3 | ||
|
|
7d95311a01 | ||
|
|
c53a822c4e | ||
|
|
5b18e90cac | ||
|
|
2e29348b9c | ||
|
|
b9e7e46198 | ||
|
|
879e2d920c | ||
|
|
ae17ef4d68 | ||
|
|
e40776ba79 | ||
|
|
13b7df5d39 | ||
|
|
1f870af5cf | ||
|
|
9bef0a8683 | ||
|
|
c87c75a45b | ||
|
|
b5fa247eb3 | ||
|
|
d17322948d | ||
|
|
05a7466a5a | ||
|
|
a4a4e572a0 | ||
|
|
e5a485e50b | ||
|
|
c329942482 | ||
|
|
790a8bf814 | ||
|
|
449e7c1049 | ||
|
|
f1e2446f17 | ||
|
|
4a998e5374 | ||
|
|
c9ad88b3ff | ||
|
|
3ab08e0d7a | ||
|
|
169c8c47c0 | ||
|
|
2234d0fe0a | ||
|
|
6360ef1790 | ||
|
|
89da242cd2 | ||
|
|
66000240ac | ||
|
|
0baf295c1b | ||
|
|
b6f8700b8b | ||
|
|
dbd49a55c6 | ||
|
|
5ad68cfe30 | ||
|
|
bb77249ac8 | ||
|
|
df84e89d46 | ||
|
|
fcfdd1551b | ||
|
|
9d1a2dd376 | ||
|
|
279ec3d8a3 | ||
|
|
0044141631 | ||
|
|
626133c0eb | ||
|
|
8cc09d1c91 | ||
|
|
b7a6c93e96 | ||
|
|
ef1c5af608 | ||
|
|
b600cba180 | ||
|
|
667da92934 | ||
|
|
3730c53c9e | ||
|
|
96c86580f0 | ||
|
|
b0569639a9 | ||
|
|
76418fe1b4 | ||
|
|
29c2e84fa1 | ||
|
|
5f1253598c | ||
|
|
c9132a4bdb | ||
|
|
201f0f3a9f | ||
|
|
4243558319 | ||
|
|
38746a5ef9 | ||
|
|
dfaa668b31 | ||
|
|
597d07bf24 | ||
|
|
8f1a8450be | ||
|
|
bd1f413481 | ||
|
|
2b7a00d42d | ||
|
|
dc7e143de5 | ||
|
|
3caff5a107 | ||
|
|
7dafb164e8 | ||
|
|
9834fc7f70 | ||
|
|
3775d28d24 | ||
|
|
860d7bd3f1 | ||
|
|
0df3e955c8 | ||
|
|
10e9d383d4 | ||
|
|
c1da446653 | ||
|
|
20186b5049 | ||
|
|
1098edea98 | ||
|
|
3d910a9a42 | ||
|
|
c74c592dd3 | ||
|
|
5a4aa9096b | ||
|
|
6d0fae09c5 | ||
|
|
85f2009175 | ||
|
|
3e1c04b356 | ||
|
|
8cde1c18c4 | ||
|
|
ed55011ede | ||
|
|
fe53f6f2d7 | ||
|
|
cd39256361 | ||
|
|
98c67389b0 | ||
|
|
88cc03b9e2 | ||
|
|
ff29320a34 | ||
|
|
145e0aa827 | ||
|
|
b881e095e9 | ||
|
|
218399afcb | ||
|
|
dc51630803 | ||
|
|
089a6ee07d | ||
|
|
6029cc40f2 | ||
|
|
3b71721a33 | ||
|
|
a99c8e3c7c | ||
|
|
c79b52b334 | ||
|
|
5d951451c5 | ||
|
|
c2563da820 | ||
|
|
311a3b3e47 | ||
|
|
470afd78d5 | ||
|
|
16727a9c5e | ||
|
|
54106f6f9b | ||
|
|
402199d70f | ||
|
|
339e40d423 | ||
|
|
e65676ffa9 | ||
|
|
1e60319be2 | ||
|
|
ec9740e747 | ||
|
|
58f436e749 | ||
|
|
6c01854fec | ||
|
|
82433d946e | ||
|
|
43a61d0ab9 | ||
|
|
1b499a6fd5 | ||
|
|
b5e7724e76 | ||
|
|
95734b8b9a | ||
|
|
7e758970cf | ||
|
|
b0d9fba418 | ||
|
|
12becc6120 | ||
|
|
db9cbe6cdd | ||
|
|
feec20ac3e | ||
|
|
225dba754d | ||
|
|
f298d0451e | ||
|
|
964c1bfd6c | ||
|
|
3ffc0edac9 | ||
|
|
27b24132a0 | ||
|
|
cef2c59ae2 | ||
|
|
4346514b9d | ||
|
|
9f2afffca1 | ||
|
|
2084665cc1 | ||
|
|
e6ab29346e | ||
|
|
05cebd1017 | ||
|
|
4b49d57f97 | ||
|
|
1337cf4f04 | ||
|
|
c51e52614e | ||
|
|
383f6aff2b | ||
|
|
d0e532e7ce | ||
|
|
82f31b6436 | ||
|
|
e6595f05bc | ||
|
|
505dacf152 | ||
|
|
fa43e80206 | ||
|
|
47ee010b64 | ||
|
|
30d7fcd288 | ||
|
|
5a20d41fb2 | ||
|
|
1626df7e46 | ||
|
|
b952017a3a | ||
|
|
bd9775e0eb | ||
|
|
6e02477fc6 | ||
|
|
9c94a6943d | ||
|
|
37da5589e4 | ||
|
|
51ea1e3bed | ||
|
|
73555c1df1 | ||
|
|
294d94a2d9 | ||
|
|
4f6a407393 | ||
|
|
09022b1000 | ||
|
|
9ef074c7ef | ||
|
|
3b764d45f2 | ||
|
|
774b5be7d7 | ||
|
|
f31ed4e9f2 | ||
|
|
9501869aa1 | ||
|
|
0b5ef1d8f9 | ||
|
|
0d94c78e63 | ||
|
|
6fa75cf993 | ||
|
|
82840282fb | ||
|
|
49b295e332 | ||
|
|
06486b6537 | ||
|
|
96d7034c96 | ||
|
|
f6f58b7615 | ||
|
|
8e5980b307 | ||
|
|
a8cfefac07 | ||
|
|
ebc4fa3e81 | ||
|
|
571bd63644 | ||
|
|
26e03fa794 | ||
|
|
140d40b5bc | ||
|
|
ff3df64a26 | ||
|
|
367b8e7129 | ||
|
|
9e2bb9e9d2 | ||
|
|
5a043ddacb | ||
|
|
fb1d7d3982 | ||
|
|
3269c88d02 | ||
|
|
8dfe7138df | ||
|
|
d99ae7b21c | ||
|
|
d14f22d059 | ||
|
|
6cb2518a81 | ||
|
|
120c3261b4 | ||
|
|
56ba26ab24 | ||
|
|
21e254d05f | ||
|
|
2c8b485ba0 | ||
|
|
851ae920b9 | ||
|
|
12f4f35cfa | ||
|
|
0be2728e19 | ||
|
|
028ce2dd9f | ||
|
|
693e7a38fa | ||
|
|
b37f3e1b93 | ||
|
|
f6bb62a76c | ||
|
|
d5aa7aae43 | ||
|
|
1065eb17de | ||
|
|
6a996fcd0a | ||
|
|
0fb45cccbc | ||
|
|
bbf7508d41 | ||
|
|
36e691c2db | ||
|
|
0d6386f391 | ||
|
|
0b52abeaf8 | ||
|
|
d7fd8e3ca6 | ||
|
|
5d3a612003 | ||
|
|
9eda0aa245 | ||
|
|
08f192ee0e | ||
|
|
78cbb90ef6 | ||
|
|
5bd85bd4eb | ||
|
|
13fec1cd9a | ||
|
|
455bdc3819 | ||
|
|
472a71fb8f | ||
|
|
6397640df8 | ||
|
|
04c67c3f4b | ||
|
|
a74e07dc40 | ||
|
|
f6ba1eaebd | ||
|
|
61c4a88ab4 | ||
|
|
3c562afd49 | ||
|
|
bed3260e45 | ||
|
|
a324b58145 | ||
|
|
84c5899faf | ||
|
|
50b5d72bb2 | ||
|
|
6f0531b3f7 | ||
|
|
11f618fdef | ||
|
|
7c7782cd4c | ||
|
|
23fb4734ea | ||
|
|
e353c39522 | ||
|
|
4ffd03fe3e | ||
|
|
31131c17ef | ||
|
|
b005ee3cda | ||
|
|
c71ed13f1a | ||
|
|
9d2fd7a27f | ||
|
|
889e7807cb | ||
|
|
0d4c10b56c | ||
|
|
7a7264db33 | ||
|
|
ae47cdaad8 | ||
|
|
efa538f9d7 | ||
|
|
0d15fc35d7 | ||
|
|
861ce9e733 | ||
|
|
9c6b935770 | ||
|
|
102f8cf993 | ||
|
|
652c5901f8 | ||
|
|
a8b5912340 | ||
|
|
52cf911c60 | ||
|
|
7a466b7fb7 | ||
|
|
5abd3fabfa | ||
|
|
a169c5bcac | ||
|
|
184007e1e0 | ||
|
|
4760ec63e2 | ||
|
|
f153143c9d | ||
|
|
1f3f6f4664 | ||
|
|
1941f3d916 | ||
|
|
126b636edf | ||
|
|
9eb280c367 | ||
|
|
dd9df4f36f | ||
|
|
ffa258d334 | ||
|
|
0a0ccb54bf | ||
|
|
89b944c397 | ||
|
|
0d43c822cd | ||
|
|
46a472acf9 | ||
|
|
29a7a619bc | ||
|
|
a010f802ca | ||
|
|
c273c0e42b | ||
|
|
d3e9e1296c | ||
|
|
d53327f8bb | ||
|
|
475fb0d8c8 | ||
|
|
6cd67be087 | ||
|
|
4446aa5d17 | ||
|
|
2e6ce1c94a | ||
|
|
538498f21f | ||
|
|
529d0dbbbe | ||
|
|
afe984ca29 | ||
|
|
293f276f87 | ||
|
|
cf9769fe65 | ||
|
|
9ba553643c | ||
|
|
b23a5f2312 | ||
|
|
f71780609d | ||
|
|
7bbf4bbaeb | ||
|
|
07a5720c17 | ||
|
|
8a785fefc2 | ||
|
|
55ee7065be | ||
|
|
64935ccee6 | ||
|
|
f691746771 | ||
|
|
cf5dbdbdb5 | ||
|
|
db676256d7 | ||
|
|
e1ac43e1b8 | ||
|
|
bb1749d3da | ||
|
|
8236b3d034 | ||
|
|
9b1a2e50f2 | ||
|
|
d9b5cafdee | ||
|
|
0489f9c342 | ||
|
|
b7be8b19ef | ||
|
|
50fb51dd0d | ||
|
|
2b4f44c0b2 | ||
|
|
95a66afbe6 | ||
|
|
b82d2caa6b | ||
|
|
1e4f95dee3 | ||
|
|
e360746265 | ||
|
|
152c2b87a4 | ||
|
|
bf8b066d97 | ||
|
|
b78d0a8e5b | ||
|
|
d36580f1dc | ||
|
|
d949ef1b8a | ||
|
|
9e59ccd9af | ||
|
|
cb58a773c9 | ||
|
|
5531a615e6 | ||
|
|
98cdbb759b | ||
|
|
4d88cfed95 | ||
|
|
b9b9eb7fb2 | ||
|
|
d1e74044f9 | ||
|
|
004df937ed | ||
|
|
069aa9fb2a | ||
|
|
9f0c5899d6 | ||
|
|
c9cd80c089 | ||
|
|
369c667faa | ||
|
|
8ec47b7e27 | ||
|
|
27403162ad | ||
|
|
91b4596c0b | ||
|
|
d7a4f3ed20 | ||
|
|
4b72ecda0d | ||
|
|
63088515b4 | ||
|
|
2d29023931 | ||
|
|
618d2c85ab | ||
|
|
351d6eabb8 | ||
|
|
b005d2fbd7 | ||
|
|
1b41cb0e80 | ||
|
|
60cb52bd23 | ||
|
|
134ee1eff0 | ||
|
|
ea00c3a07f | ||
|
|
8f4d8f82ed | ||
|
|
03747e3106 | ||
|
|
36ab30d3e9 | ||
|
|
ae1fc37eeb | ||
|
|
1a92526ba0 | ||
|
|
3095d01144 | ||
|
|
1570bee4b8 | ||
|
|
22d018c4cd | ||
|
|
980dfc8f4b | ||
|
|
72f1206585 | ||
|
|
5b89d137fc | ||
|
|
7dc48425c1 | ||
|
|
8095c34e49 | ||
|
|
ce0a7fda5c | ||
|
|
8002295397 | ||
|
|
fb80c1419c | ||
|
|
24019fa7b2 | ||
|
|
6383288311 | ||
|
|
7645f9a3dd | ||
|
|
99b4b36935 | ||
|
|
fcab9b2f8e | ||
|
|
e9ee084231 | ||
|
|
641efa9b34 | ||
|
|
aed250d3b0 | ||
|
|
bbb7435041 | ||
|
|
54839b293b | ||
|
|
2fbd9453dd | ||
|
|
0aed6d8c19 | ||
|
|
51dd8cb5c3 | ||
|
|
b8c0b3af73 | ||
|
|
e948842faa | ||
|
|
c7e77730fe | ||
|
|
6bd45f9697 | ||
|
|
dadd93bb84 | ||
|
|
4c29c93283 | ||
|
|
c3bba76d32 | ||
|
|
b09412a79a | ||
|
|
18e1799980 | ||
|
|
b4615f2452 | ||
|
|
e9835d4a2c | ||
|
|
e69744c7ca | ||
|
|
228c33d44d | ||
|
|
b7ea1f4d44 | ||
|
|
6f8fb71d15 | ||
|
|
e49fcd4b21 | ||
|
|
b9ae34cc3b | ||
|
|
15fa50f24e | ||
|
|
3f65b54a1e | ||
|
|
6a0ad1b001 | ||
|
|
1521eea324 | ||
|
|
ae96537b8d | ||
|
|
3d47c8ab9f | ||
|
|
c3d84c8f05 | ||
|
|
f0eadc783d | ||
|
|
231de946a0 | ||
|
|
7f5ae1cdc2 | ||
|
|
dfd5fd388e | ||
|
|
b00e0fcf69 | ||
|
|
b89c4fec3e | ||
|
|
9b24db3a76 | ||
|
|
9b24ca7a28 | ||
|
|
8169a8e4bb | ||
|
|
6568a94b0e | ||
|
|
fb448461df | ||
|
|
270c851645 | ||
|
|
36f76bf288 | ||
|
|
facb412e62 | ||
|
|
5621258b9d | ||
|
|
9f268065de | ||
|
|
e7ae71bd73 | ||
|
|
cb22cbca62 | ||
|
|
6864a3ebcd | ||
|
|
83948a298c | ||
|
|
d2bb2c71b4 | ||
|
|
021656d821 | ||
|
|
e1b7380bc6 | ||
|
|
bdc263bc34 | ||
|
|
8f04ab07ed | ||
|
|
48514b0e93 | ||
|
|
424d5e22d2 | ||
|
|
f5b3c38c27 | ||
|
|
2fb95556a5 | ||
|
|
d48de0afb0 | ||
|
|
9223174c0c | ||
|
|
90d0e69a56 | ||
|
|
f07c35d9ae | ||
|
|
48a339fd17 | ||
|
|
e3d38f704f | ||
|
|
7f5cc96842 | ||
|
|
fa2fa5b4bf | ||
|
|
35b00bf8bc | ||
|
|
fc122630d4 | ||
|
|
18918db012 | ||
|
|
f405395f97 | ||
|
|
7411012db9 | ||
|
|
e8525a6f14 | ||
|
|
cd33be1491 | ||
|
|
6cb083be1a | ||
|
|
f52c644af7 | ||
|
|
e56c6914d2 | ||
|
|
33559ca0ea | ||
|
|
ebec856a36 | ||
|
|
03627a62eb | ||
|
|
90dd215b8c | ||
|
|
08d22a8033 | ||
|
|
8c6622dd82 | ||
|
|
b98b3241e7 | ||
|
|
9d2d5102f6 | ||
|
|
143a75616c | ||
|
|
9ccc36382b | ||
|
|
329520168b | ||
|
|
d1343f5415 | ||
|
|
dbc8f76b52 | ||
|
|
b22ba86183 | ||
|
|
b2b8cb17cd | ||
|
|
0aae7a5168 | ||
|
|
caf5a57875 | ||
|
|
726760a38e | ||
|
|
bacc193638 | ||
|
|
a7bc421137 | ||
|
|
c41be3a964 | ||
|
|
76fb1d9db0 | ||
|
|
c6cac4b205 | ||
|
|
1d0071302a | ||
|
|
665aaa0ef5 | ||
|
|
2a16f50f7f | ||
|
|
1ac0ae8172 | ||
|
|
9d0bd55ec0 | ||
|
|
c497de1963 | ||
|
|
74e18dc8c9 | ||
|
|
f8d9242743 | ||
|
|
c28747aef6 | ||
|
|
3d184b3a59 | ||
|
|
65ecaab2c4 | ||
|
|
58421029c4 | ||
|
|
3689560617 | ||
|
|
afe493f187 | ||
|
|
602c436e1c | ||
|
|
abbd3ae239 | ||
|
|
713bff01e1 | ||
|
|
f55afc27a9 | ||
|
|
fe46a45915 | ||
|
|
1c32a284e1 | ||
|
|
356904d198 | ||
|
|
2a5506dae6 | ||
|
|
fa5311718e | ||
|
|
e3fbfc4bda | ||
|
|
5c84ad30a1 | ||
|
|
0865fca90a | ||
|
|
640de81571 | ||
|
|
da8194d659 | ||
|
|
6651795f6d | ||
|
|
9c2fe3b25d | ||
|
|
fe49046a96 | ||
|
|
1f64087a3b | ||
|
|
bba74b9056 | ||
|
|
1a2da9d608 | ||
|
|
883885dc0b | ||
|
|
3d74112aa3 | ||
|
|
25aeb2e086 | ||
|
|
41495e5d2a | ||
|
|
1f46098b23 | ||
|
|
5f3ea1005a | ||
|
|
8b9a46bb39 | ||
|
|
0fe32fa0d3 | ||
|
|
68078427aa | ||
|
|
7433a021db | ||
|
|
bd04990af3 | ||
|
|
a7f3b6fd57 | ||
|
|
222750b846 | ||
|
|
1a36a2d759 | ||
|
|
9989988cb7 | ||
|
|
4e55be9762 | ||
|
|
c7e4c90cb5 | ||
|
|
f151ba7c53 | ||
|
|
e7ad52ee9f | ||
|
|
b97ce7732b | ||
|
|
d058ef769c | ||
|
|
5f55afda0f | ||
|
|
f69337be65 | ||
|
|
2eb73e5b4b | ||
|
|
74914c5916 | ||
|
|
1cfd2c4475 | ||
|
|
4856066a81 | ||
|
|
f729f21e6c | ||
|
|
a7971b55ee | ||
|
|
e6a660a200 | ||
|
|
7816843dfb | ||
|
|
c37c90613f | ||
|
|
c3e0669435 | ||
|
|
ecbc9d1b08 | ||
|
|
694a2b774e | ||
|
|
3d0983e7d0 | ||
|
|
3d9c76a80d | ||
|
|
d94ce7094e | ||
|
|
e1a9f08a91 | ||
|
|
b487dcee27 | ||
|
|
8e19af530b | ||
|
|
78aef474a5 | ||
|
|
dbfd07f11e | ||
|
|
75e81bc969 | ||
|
|
51f64049ab | ||
|
|
51b54a4d6b | ||
|
|
38333f01e3 | ||
|
|
26e1418897 | ||
|
|
01aa74e4a8 | ||
|
|
73491d4ffa | ||
|
|
82536b298c | ||
|
|
62d3dcaf64 | ||
|
|
09d0d81a43 | ||
|
|
17d400f72a | ||
|
|
b930b874fe | ||
|
|
a71053ae15 | ||
|
|
ebf713c5a6 | ||
|
|
6bd044f9be | ||
|
|
3c04f2fef9 | ||
|
|
dab3d6c6d6 | ||
|
|
1dbbbc55f6 | ||
|
|
2eafb235ba | ||
|
|
10647890ef | ||
|
|
7370c49ff3 | ||
|
|
3c8084b2c7 | ||
|
|
582825934c | ||
|
|
2c7de61027 | ||
|
|
21aedb518c | ||
|
|
fc962de3dd | ||
|
|
f240690ff5 | ||
|
|
b7b3761c09 | ||
|
|
a4f73bc705 | ||
|
|
634a1f3162 | ||
|
|
b523c2810e | ||
|
|
2331c5991a | ||
|
|
5835669dd9 | ||
|
|
a94d0771fe | ||
|
|
9b5a3fd2b6 | ||
|
|
1908842255 | ||
|
|
64754a08b4 | ||
|
|
f75a3c8f60 | ||
|
|
2267c84d6a | ||
|
|
a1158c9515 | ||
|
|
9816ec3aa0 | ||
|
|
c09b0f511e | ||
|
|
6e06fdf638 | ||
|
|
14050c7302 | ||
|
|
3642b267a0 | ||
|
|
c16daed87d | ||
|
|
2203cb1dcf | ||
|
|
2fe52451e1 | ||
|
|
ad524798fa | ||
|
|
125359e30e | ||
|
|
259b57c64a | ||
|
|
cb9c1030a9 | ||
|
|
ca3f621b3b | ||
|
|
51bb9dced4 | ||
|
|
8793d75811 | ||
|
|
1a1fb622fa | ||
|
|
3737993bb2 | ||
|
|
313af89d36 | ||
|
|
f256153a2b | ||
|
|
2bd8db5f7a | ||
|
|
8cacbe3567 | ||
|
|
d1533b606b | ||
|
|
c03677bd96 | ||
|
|
a8480f66e0 | ||
|
|
6b148d1d4c | ||
|
|
0dfbb5de73 | ||
|
|
ab7a45aede | ||
|
|
22b9afdb60 | ||
|
|
b5f376f834 | ||
|
|
59d0b1da4e | ||
|
|
96fb8b968f | ||
|
|
470ffaf167 | ||
|
|
2e06e8152e | ||
|
|
80dbe1a67f | ||
|
|
3fdeb72999 | ||
|
|
bb0695e76c | ||
|
|
711f9eadc5 | ||
|
|
10d9c3e412 | ||
|
|
dd382b2afc | ||
|
|
123c4ba1a8 | ||
|
|
0299ab7660 | ||
|
|
f232351720 | ||
|
|
6e77f80d5f | ||
|
|
34590bc884 | ||
|
|
2ba5ada9f8 | ||
|
|
ba3838f54c | ||
|
|
3c7d48933f | ||
|
|
52112006d4 | ||
|
|
50b42f8593 | ||
|
|
d1fff053c2 | ||
|
|
cd8f286791 | ||
|
|
38e41e0ea8 | ||
|
|
bbf3c80d04 | ||
|
|
bf8e6dbc8e | ||
|
|
8a305b19af | ||
|
|
faab4ed6db | ||
|
|
19db12e090 | ||
|
|
a26bc227d8 | ||
|
|
d751e350c6 | ||
|
|
e55c8410b4 | ||
|
|
ad83fb325c | ||
|
|
d0b7c9a9af | ||
|
|
230ba0d360 | ||
|
|
0002cc0af3 | ||
|
|
08d61163ea | ||
|
|
7218ccfe66 | ||
|
|
98787ddb3b | ||
|
|
b0ce69f1e1 | ||
|
|
60f3ed3543 | ||
|
|
d16953d392 | ||
|
|
9ede2d6753 | ||
|
|
c4360ee834 | ||
|
|
1fc3654ca4 | ||
|
|
6a6fbea5ee | ||
|
|
061fe50835 | ||
|
|
c5e780ffb2 | ||
|
|
ba29a19e82 | ||
|
|
d84c619882 | ||
|
|
69c9d95f10 | ||
|
|
072dfc600c | ||
|
|
f3cbdcd59d | ||
|
|
e22e9993d7 | ||
|
|
abbbaa222b | ||
|
|
feb241439e | ||
|
|
4d57af9ed2 | ||
|
|
8b9a454e2f | ||
|
|
e29a1ddef7 | ||
|
|
b7be0dc633 | ||
|
|
cb61112490 | ||
|
|
82a28d3365 | ||
|
|
6d870cb558 | ||
|
|
3d4be9aee3 | ||
|
|
3019122685 | ||
|
|
1eb66198c0 | ||
|
|
fd56797b77 | ||
|
|
77458e5795 | ||
|
|
fdc8479635 | ||
|
|
7f5f67163b | ||
|
|
8736a14599 | ||
|
|
97e31c8873 | ||
|
|
7aefdd3e1f | ||
|
|
5f6a236550 | ||
|
|
2eeab1feb0 | ||
|
|
f3b61f58ef | ||
|
|
2d1409c706 | ||
|
|
f0468a145f | ||
|
|
a7bac1f084 | ||
|
|
2037068428 | ||
|
|
8d1d227dac | ||
|
|
017e44cf4d | ||
|
|
06868cb694 | ||
|
|
0a4cffd759 | ||
|
|
0f1606fbd3 | ||
|
|
347f6f20b7 | ||
|
|
cf98ddf979 | ||
|
|
42424618af | ||
|
|
26c77fbaa0 | ||
|
|
6f1efc851f | ||
|
|
8987350b5b | ||
|
|
0c53c00325 | ||
|
|
fb8ced95b0 | ||
|
|
57a288a242 | ||
|
|
382af8437c | ||
|
|
b11e086589 | ||
|
|
a4308b96f6 | ||
|
|
e6a4ef9eb8 | ||
|
|
5ef3b80596 | ||
|
|
458322e548 | ||
|
|
268e2eee4c | ||
|
|
49295f8eff | ||
|
|
b6ac09aa1a |
+26
-5
@@ -30,24 +30,34 @@
|
||||
*.dump
|
||||
*.wav
|
||||
|
||||
/libs
|
||||
/build
|
||||
/bin
|
||||
/lib
|
||||
/tmp
|
||||
/ipch
|
||||
/rpcs3/Debug
|
||||
/rpcs3/Release
|
||||
/llvm_build
|
||||
/Vulkan/Vulkan-build
|
||||
/Vulkan/glslang-build
|
||||
|
||||
/wxWidgets/lib
|
||||
/bin/rpcs3.ini
|
||||
/bin/rpcs3.ipdb
|
||||
/bin/rpcs3.iobj
|
||||
/bin/FragmentProgram.txt
|
||||
/bin/VertexProgram.txt
|
||||
/bin/*.hlsl
|
||||
/bin/BreakPoints.dat
|
||||
/bin/textures
|
||||
/bin/*.lib
|
||||
/bin/*.exp
|
||||
rpcs3/git-version.h
|
||||
|
||||
# Visual Studio Profiler Files
|
||||
# Visual Studio Files
|
||||
*.vspx
|
||||
*.psess
|
||||
*.VC.*
|
||||
|
||||
# Copyrighted files
|
||||
/bin/data/
|
||||
@@ -61,6 +71,17 @@ rpcs3/git-version.h
|
||||
!/bin/dev_hdd0/game/TEST12345/
|
||||
|
||||
# Ignore other system generated files
|
||||
bin/dev_hdd0/log.txt
|
||||
x64/Debug/emucore.lib
|
||||
x64/Release/emucore.lib
|
||||
bin/dev_hdd0/*.txt
|
||||
x64/*
|
||||
rpcs3/x64/*
|
||||
rpcs3-tests/x64/*
|
||||
|
||||
# cmake
|
||||
Makefile
|
||||
*CMakeFiles*
|
||||
CMakeCache.txt
|
||||
*cmake_install.cmake*
|
||||
|
||||
# cotire
|
||||
rpcs3/cotire/*
|
||||
rpcs3/rpcs3_*_cotire.cmake
|
||||
|
||||
+30
-3
@@ -1,10 +1,37 @@
|
||||
[submodule "wxWidgets"]
|
||||
path = wxWidgets
|
||||
url = https://github.com/DHrpcs3/wxWidgets.git
|
||||
url = https://github.com/wxWidgets/wxWidgets
|
||||
ignore = dirty
|
||||
[submodule "rpcs3-ffmpeg"]
|
||||
path = ffmpeg
|
||||
path = 3rdparty/ffmpeg
|
||||
url = https://github.com/hrydgard/ppsspp-ffmpeg
|
||||
[submodule "asmjit"]
|
||||
path = asmjit
|
||||
url = https://github.com/kobalicekp/asmjit
|
||||
url = https://github.com/kobalicek/asmjit
|
||||
ignore = dirty
|
||||
[submodule "llvm"]
|
||||
path = llvm
|
||||
url = https://github.com/llvm-mirror/llvm
|
||||
branch = release_36
|
||||
[submodule "rsx_program_decompiler"]
|
||||
path = rsx_program_decompiler
|
||||
url = https://github.com/RPCS3/rsx_program_decompiler
|
||||
[submodule "GSL"]
|
||||
path = 3rdparty/GSL
|
||||
url = https://github.com/Microsoft/GSL.git
|
||||
[submodule "libpng"]
|
||||
path = 3rdparty/libpng
|
||||
url = https://github.com/RPCS3/libpng
|
||||
ignore = dirty
|
||||
[submodule "Vulkan/glslang"]
|
||||
path = Vulkan/glslang
|
||||
url = https://github.com/KhronosGroup/glslang.git
|
||||
[submodule "Vulkan/Vulkan-LoaderAndValidationLayers"]
|
||||
path = Vulkan/Vulkan-LoaderAndValidationLayers
|
||||
url = https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers
|
||||
[submodule "Utilities/yaml-cpp"]
|
||||
path = Utilities/yaml-cpp
|
||||
url = https://github.com/RPCS3/yaml-cpp
|
||||
[submodule "3rdparty/pugixml"]
|
||||
path = 3rdparty/pugixml
|
||||
url = https://github.com/RPCS3/pugixml
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"userBlacklist": ["AlexAltea", "tambry"]
|
||||
}
|
||||
+75
-20
@@ -1,35 +1,90 @@
|
||||
language: cpp
|
||||
sudo: required
|
||||
dist: trusty
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
osx_image: xcode6.4
|
||||
|
||||
compiler:
|
||||
- clang
|
||||
- gcc
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
env:
|
||||
global:
|
||||
- secure: "Vf+FY48nip9JppMnq11105NealdErSWsoUhHo63/V3V+LKfA9guenxCp93/qoSIdSGC/sJwb0yIIMGvkTT/rxDJNh6Z+BWUTb2E0WEIIQbvTJNOSUzoq7dfF1LT61XjVjByFzcbC2xjtaBowmcAYEs1jGUUuEjYVCMmD5lY8hUg="
|
||||
# Which Travis environment to run Coverity on
|
||||
- coverity_scan_run_condition='"$TRAVIS_OS_NAME" = linux -a "$CC" = gcc'
|
||||
# Test mode is for testing if it's working with Coverity. Change to true if testing, to avoid reaching the quota.
|
||||
- coverity_scan_script_test_mode=false
|
||||
|
||||
matrix:
|
||||
exclude:
|
||||
- os: osx
|
||||
compiler: gcc
|
||||
|
||||
git:
|
||||
submodules: false
|
||||
|
||||
before_install:
|
||||
- echo "yes" | sudo apt-key adv --fetch-keys http://repos.codelite.org/CodeLite.asc
|
||||
- echo "yes" | sudo apt-add-repository 'deb http://repos.codelite.org/wx3.0/ubuntu/ precise universe'
|
||||
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
||||
- sudo apt-get update
|
||||
- sudo apt-get install libwxgtk3.0-dev libopenal-dev freeglut3-dev libglew-dev
|
||||
- sudo apt-get install aria2 -qq
|
||||
- download_extract() { aria2c -x 16 $1 -o $2 && tar -xf $2; }
|
||||
# Travis uses CMake 2.8.7. We require 2.8.8. Grab latest
|
||||
- sudo apt-get install -qq g++-4.8
|
||||
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
|
||||
- sudo apt-get install lib32stdc++6 -qq &&
|
||||
aria2c -x 16 http://www.cmake.org/files/v2.8/cmake-2.8.12.1-Linux-i386.sh &&
|
||||
chmod a+x cmake-2.8.12.1-Linux-i386.sh &&
|
||||
sudo ./cmake-2.8.12.1-Linux-i386.sh --skip-license --prefix=/usr;
|
||||
# shutdown services on Travis, which may have a memory impact
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||
sudo apt-get install -y libwxgtk3.0-dev;
|
||||
fi;
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ] && [ "$CXX" = "g++" ]; then
|
||||
export CXX="g++-5" CC="gcc-5" CXXFLAGS="-Wno-format-security";
|
||||
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01';
|
||||
fi;
|
||||
# Add coverall for C++ so coverall.io could be triggered. Even it should be --coverage and gcov.
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||
sudo pip install cpp-coveralls requests[security];
|
||||
else
|
||||
brew update; brew update;
|
||||
brew install glew wxwidgets llvm36;
|
||||
fi;
|
||||
|
||||
before_script:
|
||||
- git submodule update --init --recursive
|
||||
- git submodule update --init rsx_program_decompiler asmjit 3rdparty/ffmpeg 3rdparty/pugixml 3rdparty/GSL 3rdparty/libpng Vulkan/glslang Vulkan/Vulkan-LoaderAndValidationLayers Utilities/yaml-cpp
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake ..
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then cmake ..; else cmake .. -DLLVM_DIR=/usr/local/opt/llvm36/lib/llvm-3.6/share/llvm/cmake; fi
|
||||
|
||||
script:
|
||||
- make
|
||||
# Add a command to show all the variables. May be useful for debugging Travis.
|
||||
# - echo "--Shell Export Lists START--" ; export -p; echo "--Shell Export Lists STOP--";
|
||||
# And to ensure the versions of toolchain
|
||||
- echo "--CXX version?"; "$CXX" --version; echo "--CXX version confirmed";
|
||||
- if [ "$COVERITY_SCAN_BRANCH" != 1 ]; then make -j 4; fi
|
||||
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
# - llvm-toolchain-trusty-3.6 temporarily disabled
|
||||
packages:
|
||||
- cmake
|
||||
- libopenal-dev
|
||||
- freeglut3-dev
|
||||
- libglew-dev
|
||||
- libc6-dev
|
||||
# - llvm-3.6
|
||||
# - llvm-3.6-dev
|
||||
- libedit-dev
|
||||
- g++-5
|
||||
- gcc-5
|
||||
# - clang-3.6
|
||||
- libstdc++-5-dev
|
||||
- lib32stdc++6
|
||||
- zlib1g-dev
|
||||
coverity_scan:
|
||||
project:
|
||||
name: $TRAVIS_REPO_SLUG
|
||||
description: "PS3 emulator/debugger"
|
||||
notification_email: [email protected]
|
||||
build_command: "make -j 4"
|
||||
branch_pattern: coverity_scan
|
||||
|
||||
after_success:
|
||||
- if [ "$COVERITY_SCAN_BRANCH" != 1 ] && [ "$TRAVIS_OS_NAME" = linux ]; then coveralls --extension .c --extension .cpp --extension .h; fi
|
||||
|
||||
Vendored
+9973
-11256
File diff suppressed because it is too large
Load Diff
+1
Submodule 3rdparty/GSL added at fc5fce4f4f
@@ -348,6 +348,51 @@ AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ALC_EXT_DEFAULT_FILTER_ORDER
|
||||
#define ALC_EXT_DEFAULT_FILTER_ORDER 1
|
||||
#define ALC_DEFAULT_FILTER_ORDER 0x1100
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_deferred_updates
|
||||
#define AL_SOFT_deferred_updates 1
|
||||
#define AL_DEFERRED_UPDATES_SOFT 0xC002
|
||||
typedef ALvoid (AL_APIENTRY*LPALDEFERUPDATESSOFT)(void);
|
||||
typedef ALvoid (AL_APIENTRY*LPALPROCESSUPDATESSOFT)(void);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void);
|
||||
AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_block_alignment
|
||||
#define AL_SOFT_block_alignment 1
|
||||
#define AL_UNPACK_BLOCK_ALIGNMENT_SOFT 0x200C
|
||||
#define AL_PACK_BLOCK_ALIGNMENT_SOFT 0x200D
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_MSADPCM
|
||||
#define AL_SOFT_MSADPCM 1
|
||||
#define AL_FORMAT_MONO_MSADPCM_SOFT 0x1302
|
||||
#define AL_FORMAT_STEREO_MSADPCM_SOFT 0x1303
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_source_length
|
||||
#define AL_SOFT_source_length 1
|
||||
/*#define AL_BYTE_LENGTH_SOFT 0x2009*/
|
||||
/*#define AL_SAMPLE_LENGTH_SOFT 0x200A*/
|
||||
/*#define AL_SEC_LENGTH_SOFT 0x200B*/
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_pause_device
|
||||
#define ALC_SOFT_pause_device 1
|
||||
typedef void (ALC_APIENTRY*LPALCDEVICEPAUSESOFT)(ALCdevice *device);
|
||||
typedef void (ALC_APIENTRY*LPALCDEVICERESUMESOFT)(ALCdevice *device);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device);
|
||||
ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
+187
@@ -0,0 +1,187 @@
|
||||
EXPORTS
|
||||
alAuxiliaryEffectSlotf
|
||||
alAuxiliaryEffectSlotfv
|
||||
alAuxiliaryEffectSloti
|
||||
alAuxiliaryEffectSlotiv
|
||||
alBuffer3f
|
||||
alBuffer3i
|
||||
alBufferData
|
||||
alBufferSamplesSOFT
|
||||
alBufferSubDataSOFT
|
||||
alBufferSubSamplesSOFT
|
||||
alBufferf
|
||||
alBufferfv
|
||||
alBufferi
|
||||
alBufferiv
|
||||
alDeferUpdatesSOFT
|
||||
alDeleteAuxiliaryEffectSlots
|
||||
alDeleteBuffers
|
||||
alDeleteEffects
|
||||
alDeleteFilters
|
||||
alDeleteFontsoundsSOFT
|
||||
alDeletePresetsSOFT
|
||||
alDeleteSoundfontsSOFT
|
||||
alDeleteSources
|
||||
alDisable
|
||||
alDistanceModel
|
||||
alDopplerFactor
|
||||
alDopplerVelocity
|
||||
alEffectf
|
||||
alEffectfv
|
||||
alEffecti
|
||||
alEffectiv
|
||||
alEnable
|
||||
alFilterf
|
||||
alFilterfv
|
||||
alFilteri
|
||||
alFilteriv
|
||||
alFontsound2iSOFT
|
||||
alFontsoundModulatoriSOFT
|
||||
alFontsoundiSOFT
|
||||
alFontsoundivSOFT
|
||||
alGenAuxiliaryEffectSlots
|
||||
alGenBuffers
|
||||
alGenEffects
|
||||
alGenFilters
|
||||
alGenFontsoundsSOFT
|
||||
alGenPresetsSOFT
|
||||
alGenSoundfontsSOFT
|
||||
alGenSources
|
||||
alGetAuxiliaryEffectSlotf
|
||||
alGetAuxiliaryEffectSlotfv
|
||||
alGetAuxiliaryEffectSloti
|
||||
alGetAuxiliaryEffectSlotiv
|
||||
alGetBoolean
|
||||
alGetBooleanv
|
||||
alGetBuffer3f
|
||||
alGetBuffer3i
|
||||
alGetBufferSamplesSOFT
|
||||
alGetBufferf
|
||||
alGetBufferfv
|
||||
alGetBufferi
|
||||
alGetBufferiv
|
||||
alGetDouble
|
||||
alGetDoublev
|
||||
alGetEffectf
|
||||
alGetEffectfv
|
||||
alGetEffecti
|
||||
alGetEffectiv
|
||||
alGetEnumValue
|
||||
alGetError
|
||||
alGetFilterf
|
||||
alGetFilterfv
|
||||
alGetFilteri
|
||||
alGetFilteriv
|
||||
alGetFloat
|
||||
alGetFloatv
|
||||
alGetFontsoundModulatorivSOFT
|
||||
alGetFontsoundivSOFT
|
||||
alGetInteger
|
||||
alGetInteger64SOFT
|
||||
alGetInteger64vSOFT
|
||||
alGetIntegerv
|
||||
alGetListener3f
|
||||
alGetListener3i
|
||||
alGetListenerf
|
||||
alGetListenerfv
|
||||
alGetListeneri
|
||||
alGetListeneriv
|
||||
alGetPresetivSOFT
|
||||
alGetProcAddress
|
||||
alGetSoundfontivSOFT
|
||||
alGetSource3dSOFT
|
||||
alGetSource3f
|
||||
alGetSource3i
|
||||
alGetSource3i64SOFT
|
||||
alGetSourcedSOFT
|
||||
alGetSourcedvSOFT
|
||||
alGetSourcef
|
||||
alGetSourcefv
|
||||
alGetSourcei
|
||||
alGetSourcei64SOFT
|
||||
alGetSourcei64vSOFT
|
||||
alGetSourceiv
|
||||
alGetString
|
||||
alIsAuxiliaryEffectSlot
|
||||
alIsBuffer
|
||||
alIsBufferFormatSupportedSOFT
|
||||
alIsEffect
|
||||
alIsEnabled
|
||||
alIsExtensionPresent
|
||||
alIsFilter
|
||||
alIsFontsoundSOFT
|
||||
alIsPresetSOFT
|
||||
alIsSoundfontSOFT
|
||||
alIsSource
|
||||
alListener3f
|
||||
alListener3i
|
||||
alListenerf
|
||||
alListenerfv
|
||||
alListeneri
|
||||
alListeneriv
|
||||
alLoadSoundfontSOFT
|
||||
alMidiEventSOFT
|
||||
alMidiGainSOFT
|
||||
alMidiPauseSOFT
|
||||
alMidiPlaySOFT
|
||||
alMidiResetSOFT
|
||||
alMidiSoundfontSOFT
|
||||
alMidiSoundfontvSOFT
|
||||
alMidiStopSOFT
|
||||
alMidiSysExSOFT
|
||||
alPresetFontsoundsSOFT
|
||||
alPresetiSOFT
|
||||
alPresetivSOFT
|
||||
alProcessUpdatesSOFT
|
||||
alSoundfontPresetsSOFT
|
||||
alSource3dSOFT
|
||||
alSource3f
|
||||
alSource3i
|
||||
alSource3i64SOFT
|
||||
alSourcePause
|
||||
alSourcePausev
|
||||
alSourcePlay
|
||||
alSourcePlayv
|
||||
alSourceQueueBuffers
|
||||
alSourceRewind
|
||||
alSourceRewindv
|
||||
alSourceStop
|
||||
alSourceStopv
|
||||
alSourceUnqueueBuffers
|
||||
alSourcedSOFT
|
||||
alSourcedvSOFT
|
||||
alSourcef
|
||||
alSourcefv
|
||||
alSourcei
|
||||
alSourcei64SOFT
|
||||
alSourcei64vSOFT
|
||||
alSourceiv
|
||||
alSpeedOfSound
|
||||
alcCaptureCloseDevice
|
||||
alcCaptureOpenDevice
|
||||
alcCaptureSamples
|
||||
alcCaptureStart
|
||||
alcCaptureStop
|
||||
alcCloseDevice
|
||||
alcCreateContext
|
||||
alcDestroyContext
|
||||
alcDevicePauseSOFT
|
||||
alcDeviceResumeSOFT
|
||||
alcGetContextsDevice
|
||||
alcGetCurrentContext
|
||||
alcGetEnumValue
|
||||
alcGetError
|
||||
alcGetInteger64vSOFT
|
||||
alcGetIntegerv
|
||||
alcGetProcAddress
|
||||
alcGetString
|
||||
alcGetThreadContext
|
||||
alcIsExtensionPresent
|
||||
alcIsRenderFormatSupportedSOFT
|
||||
alcLoopbackOpenDeviceSOFT
|
||||
alcMakeContextCurrent
|
||||
alcOpenDevice
|
||||
alcProcessContext
|
||||
alcRenderSamplesSOFT
|
||||
alcSetThreadContext
|
||||
alcSuspendContext
|
||||
BIN
Binary file not shown.
Vendored
+1295
File diff suppressed because it is too large
Load Diff
Vendored
+263
@@ -0,0 +1,263 @@
|
||||
/***************************************************************************
|
||||
*
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
*
|
||||
* File: audiodefs.h
|
||||
* Content: Basic constants and data types for audio work.
|
||||
*
|
||||
* Remarks: This header file defines all of the audio format constants and
|
||||
* structures required for XAudio2 and XACT work. Providing these
|
||||
* in a single location avoids certain dependency problems in the
|
||||
* legacy audio headers (mmreg.h, mmsystem.h, ksmedia.h).
|
||||
*
|
||||
* NOTE: Including the legacy headers after this one may cause a
|
||||
* compilation error, because they define some of the same types
|
||||
* defined here without preprocessor guards to avoid multiple
|
||||
* definitions. If a source file needs one of the old headers,
|
||||
* it must include it before including audiodefs.h.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __AUDIODEFS_INCLUDED__
|
||||
#define __AUDIODEFS_INCLUDED__
|
||||
|
||||
#include <windef.h> // For WORD, DWORD, etc.
|
||||
|
||||
#pragma pack(push, 1) // Pack structures to 1-byte boundaries
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* WAVEFORMATEX: Base structure for many audio formats. Format-specific
|
||||
* extensions can be defined for particular formats by using a non-zero
|
||||
* cbSize value and adding extra fields to the end of this structure.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _WAVEFORMATEX_
|
||||
|
||||
#define _WAVEFORMATEX_
|
||||
typedef struct tWAVEFORMATEX
|
||||
{
|
||||
WORD wFormatTag; // Integer identifier of the format
|
||||
WORD nChannels; // Number of audio channels
|
||||
DWORD nSamplesPerSec; // Audio sample rate
|
||||
DWORD nAvgBytesPerSec; // Bytes per second (possibly approximate)
|
||||
WORD nBlockAlign; // Size in bytes of a sample block (all channels)
|
||||
WORD wBitsPerSample; // Size in bits of a single per-channel sample
|
||||
WORD cbSize; // Bytes of extra data appended to this struct
|
||||
} WAVEFORMATEX;
|
||||
|
||||
#endif
|
||||
|
||||
// Defining pointer types outside of the #if block to make sure they are
|
||||
// defined even if mmreg.h or mmsystem.h is #included before this file
|
||||
|
||||
typedef WAVEFORMATEX *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
|
||||
typedef const WAVEFORMATEX *PCWAVEFORMATEX, *LPCWAVEFORMATEX;
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* WAVEFORMATEXTENSIBLE: Extended version of WAVEFORMATEX that should be
|
||||
* used as a basis for all new audio formats. The format tag is replaced
|
||||
* with a GUID, allowing new formats to be defined without registering a
|
||||
* format tag with Microsoft. There are also new fields that can be used
|
||||
* to specify the spatial positions for each channel and the bit packing
|
||||
* used for wide samples (e.g. 24-bit PCM samples in 32-bit containers).
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _WAVEFORMATEXTENSIBLE_
|
||||
|
||||
#define _WAVEFORMATEXTENSIBLE_
|
||||
typedef struct
|
||||
{
|
||||
WAVEFORMATEX Format; // Base WAVEFORMATEX data
|
||||
union
|
||||
{
|
||||
WORD wValidBitsPerSample; // Valid bits in each sample container
|
||||
WORD wSamplesPerBlock; // Samples per block of audio data; valid
|
||||
// if wBitsPerSample=0 (but rarely used).
|
||||
WORD wReserved; // Zero if neither case above applies.
|
||||
} Samples;
|
||||
DWORD dwChannelMask; // Positions of the audio channels
|
||||
GUID SubFormat; // Format identifier GUID
|
||||
} WAVEFORMATEXTENSIBLE;
|
||||
|
||||
#endif
|
||||
|
||||
typedef WAVEFORMATEXTENSIBLE *PWAVEFORMATEXTENSIBLE, *LPWAVEFORMATEXTENSIBLE;
|
||||
typedef const WAVEFORMATEXTENSIBLE *PCWAVEFORMATEXTENSIBLE, *LPCWAVEFORMATEXTENSIBLE;
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Define the most common wave format tags used in WAVEFORMATEX formats.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef WAVE_FORMAT_PCM // Pulse Code Modulation
|
||||
|
||||
// If WAVE_FORMAT_PCM is not defined, we need to define some legacy types
|
||||
// for compatibility with the Windows mmreg.h / mmsystem.h header files.
|
||||
|
||||
// Old general format structure (information common to all formats)
|
||||
typedef struct waveformat_tag
|
||||
{
|
||||
WORD wFormatTag;
|
||||
WORD nChannels;
|
||||
DWORD nSamplesPerSec;
|
||||
DWORD nAvgBytesPerSec;
|
||||
WORD nBlockAlign;
|
||||
} WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;
|
||||
|
||||
// Specific format structure for PCM data
|
||||
typedef struct pcmwaveformat_tag
|
||||
{
|
||||
WAVEFORMAT wf;
|
||||
WORD wBitsPerSample;
|
||||
} PCMWAVEFORMAT, *PPCMWAVEFORMAT, NEAR *NPPCMWAVEFORMAT, FAR *LPPCMWAVEFORMAT;
|
||||
|
||||
#define WAVE_FORMAT_PCM 0x0001
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_ADPCM // Microsoft Adaptive Differental PCM
|
||||
|
||||
// Replicate the Microsoft ADPCM type definitions from mmreg.h.
|
||||
|
||||
typedef struct adpcmcoef_tag
|
||||
{
|
||||
short iCoef1;
|
||||
short iCoef2;
|
||||
} ADPCMCOEFSET;
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4200) // Disable zero-sized array warnings
|
||||
|
||||
typedef struct adpcmwaveformat_tag {
|
||||
WAVEFORMATEX wfx;
|
||||
WORD wSamplesPerBlock;
|
||||
WORD wNumCoef;
|
||||
ADPCMCOEFSET aCoef[]; // Always 7 coefficient pairs for MS ADPCM
|
||||
} ADPCMWAVEFORMAT;
|
||||
|
||||
#pragma warning(pop)
|
||||
|
||||
#define WAVE_FORMAT_ADPCM 0x0002
|
||||
|
||||
#endif
|
||||
|
||||
// Other frequently used format tags
|
||||
|
||||
#ifndef WAVE_FORMAT_UNKNOWN
|
||||
#define WAVE_FORMAT_UNKNOWN 0x0000 // Unknown or invalid format tag
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_IEEE_FLOAT
|
||||
#define WAVE_FORMAT_IEEE_FLOAT 0x0003 // 32-bit floating-point
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_MPEGLAYER3
|
||||
#define WAVE_FORMAT_MPEGLAYER3 0x0055 // ISO/MPEG Layer3
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF
|
||||
#define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 // Dolby Audio Codec 3 over S/PDIF
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_WMAUDIO2
|
||||
#define WAVE_FORMAT_WMAUDIO2 0x0161 // Windows Media Audio
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_WMAUDIO3
|
||||
#define WAVE_FORMAT_WMAUDIO3 0x0162 // Windows Media Audio Pro
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_WMASPDIF
|
||||
#define WAVE_FORMAT_WMASPDIF 0x0164 // Windows Media Audio over S/PDIF
|
||||
#endif
|
||||
|
||||
#ifndef WAVE_FORMAT_EXTENSIBLE
|
||||
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE // All WAVEFORMATEXTENSIBLE formats
|
||||
#endif
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Define the most common wave format GUIDs used in WAVEFORMATEXTENSIBLE
|
||||
* formats. Note that including the Windows ksmedia.h header after this
|
||||
* one will cause build problems; this cannot be avoided, since ksmedia.h
|
||||
* defines these macros without preprocessor guards.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifdef __cplusplus // uuid() and __uuidof() are only available in C++
|
||||
|
||||
#ifndef KSDATAFORMAT_SUBTYPE_PCM
|
||||
struct __declspec(uuid("00000001-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_PCM_STRUCT;
|
||||
#define KSDATAFORMAT_SUBTYPE_PCM __uuidof(KSDATAFORMAT_SUBTYPE_PCM_STRUCT)
|
||||
#endif
|
||||
|
||||
#ifndef KSDATAFORMAT_SUBTYPE_ADPCM
|
||||
struct __declspec(uuid("00000002-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT;
|
||||
#define KSDATAFORMAT_SUBTYPE_ADPCM __uuidof(KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT)
|
||||
#endif
|
||||
|
||||
#ifndef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
|
||||
struct __declspec(uuid("00000003-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT;
|
||||
#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT __uuidof(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Speaker positions used in the WAVEFORMATEXTENSIBLE dwChannelMask field.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef SPEAKER_FRONT_LEFT
|
||||
#define SPEAKER_FRONT_LEFT 0x00000001
|
||||
#define SPEAKER_FRONT_RIGHT 0x00000002
|
||||
#define SPEAKER_FRONT_CENTER 0x00000004
|
||||
#define SPEAKER_LOW_FREQUENCY 0x00000008
|
||||
#define SPEAKER_BACK_LEFT 0x00000010
|
||||
#define SPEAKER_BACK_RIGHT 0x00000020
|
||||
#define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040
|
||||
#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080
|
||||
#define SPEAKER_BACK_CENTER 0x00000100
|
||||
#define SPEAKER_SIDE_LEFT 0x00000200
|
||||
#define SPEAKER_SIDE_RIGHT 0x00000400
|
||||
#define SPEAKER_TOP_CENTER 0x00000800
|
||||
#define SPEAKER_TOP_FRONT_LEFT 0x00001000
|
||||
#define SPEAKER_TOP_FRONT_CENTER 0x00002000
|
||||
#define SPEAKER_TOP_FRONT_RIGHT 0x00004000
|
||||
#define SPEAKER_TOP_BACK_LEFT 0x00008000
|
||||
#define SPEAKER_TOP_BACK_CENTER 0x00010000
|
||||
#define SPEAKER_TOP_BACK_RIGHT 0x00020000
|
||||
#define SPEAKER_RESERVED 0x7FFC0000
|
||||
#define SPEAKER_ALL 0x80000000
|
||||
#define _SPEAKER_POSITIONS_
|
||||
#endif
|
||||
|
||||
#ifndef SPEAKER_STEREO
|
||||
#define SPEAKER_MONO (SPEAKER_FRONT_CENTER)
|
||||
#define SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
|
||||
#define SPEAKER_2POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY)
|
||||
#define SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)
|
||||
#define SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
|
||||
#define SPEAKER_4POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
|
||||
#define SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
|
||||
#define SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER)
|
||||
#define SPEAKER_5POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
|
||||
#define SPEAKER_7POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
|
||||
#endif
|
||||
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#endif // #ifndef __AUDIODEFS_INCLUDED__
|
||||
Vendored
+65
@@ -0,0 +1,65 @@
|
||||
// comdecl.h: Macros to facilitate COM interface and GUID declarations.
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
#ifndef _COMDECL_H_
|
||||
#define _COMDECL_H_
|
||||
|
||||
#ifndef _XBOX
|
||||
#include <basetyps.h> // For standard COM interface macros
|
||||
#else
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4061)
|
||||
#include <xtl.h> // Required by xobjbase.h
|
||||
#include <xobjbase.h> // Special definitions for Xbox build
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
// The DEFINE_CLSID() and DEFINE_IID() macros defined below allow COM GUIDs to
|
||||
// be declared and defined in such a way that clients can obtain the GUIDs using
|
||||
// either the __uuidof() extension or the old-style CLSID_Foo / IID_IFoo names.
|
||||
// If using the latter approach, the client can also choose whether to get the
|
||||
// GUID definitions by defining the INITGUID preprocessor constant or by linking
|
||||
// to a GUID library. This works in either C or C++.
|
||||
|
||||
#ifndef _MSC_VER
|
||||
|
||||
#define DEFINE_UUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) __CRT_UUID_DECL(name, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
|
||||
#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) class className; DEFINE_UUID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
|
||||
#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) struct interfaceName; DEFINE_UUID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
|
||||
|
||||
#elif __cplusplus
|
||||
|
||||
#define DECLSPEC_UUID_WRAPPER(x) __declspec(uuid(#x))
|
||||
#ifdef INITGUID
|
||||
|
||||
#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
class DECLSPEC_UUID_WRAPPER(l##-##w1##-##w2##-##b1##b2##-##b3##b4##b5##b6##b7##b8) className; \
|
||||
EXTERN_C const GUID DECLSPEC_SELECTANY CLSID_##className = __uuidof(className)
|
||||
|
||||
#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
interface DECLSPEC_UUID_WRAPPER(l##-##w1##-##w2##-##b1##b2##-##b3##b4##b5##b6##b7##b8) interfaceName; \
|
||||
EXTERN_C const GUID DECLSPEC_SELECTANY IID_##interfaceName = __uuidof(interfaceName)
|
||||
|
||||
#else // INITGUID
|
||||
|
||||
#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
class DECLSPEC_UUID_WRAPPER(l##-##w1##-##w2##-##b1##b2##-##b3##b4##b5##b6##b7##b8) className; \
|
||||
EXTERN_C const GUID CLSID_##className
|
||||
|
||||
#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
interface DECLSPEC_UUID_WRAPPER(l##-##w1##-##w2##-##b1##b2##-##b3##b4##b5##b6##b7##b8) interfaceName; \
|
||||
EXTERN_C const GUID IID_##interfaceName
|
||||
|
||||
#endif // INITGUID
|
||||
|
||||
#else // __cplusplus
|
||||
|
||||
#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
DEFINE_GUID(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
|
||||
|
||||
#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
DEFINE_GUID(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // #ifndef _COMDECL_H_
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
*
|
||||
* File: dxsdkver.h
|
||||
* Content: DirectX SDK Version Include File
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef _DXSDKVER_H_
|
||||
#define _DXSDKVER_H_
|
||||
|
||||
#define _DXSDK_PRODUCT_MAJOR 9
|
||||
#define _DXSDK_PRODUCT_MINOR 29
|
||||
#define _DXSDK_BUILD_MAJOR 1962
|
||||
#define _DXSDK_BUILD_MINOR 0
|
||||
|
||||
#endif // _DXSDKVER_H_
|
||||
|
||||
Vendored
+718
@@ -0,0 +1,718 @@
|
||||
/***************************************************************************
|
||||
*
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
*
|
||||
* File: xma2defs.h
|
||||
* Content: Constants, data types and functions for XMA2 compressed audio.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __XMA2DEFS_INCLUDED__
|
||||
#define __XMA2DEFS_INCLUDED__
|
||||
|
||||
#include <sal.h> // Markers for documenting API semantics
|
||||
#include <winerror.h> // For S_OK, E_FAIL
|
||||
#include <audiodefs.h> // Basic data types and constants for audio work
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Overview
|
||||
***************************************************************************/
|
||||
|
||||
// A typical XMA2 file contains these RIFF chunks:
|
||||
//
|
||||
// 'fmt' or 'XMA2' chunk (or both): A description of the XMA data's structure
|
||||
// and characteristics (length, channels, sample rate, loops, block size, etc).
|
||||
//
|
||||
// 'seek' chunk: A seek table to help navigate the XMA data.
|
||||
//
|
||||
// 'data' chunk: The encoded XMA2 data.
|
||||
//
|
||||
// The encoded XMA2 data is structured as a set of BLOCKS, which contain PACKETS,
|
||||
// which contain FRAMES, which contain SUBFRAMES (roughly speaking). The frames
|
||||
// in a file may also be divided into several subsets, called STREAMS.
|
||||
//
|
||||
// FRAME: A variable-sized segment of XMA data that decodes to exactly 512 mono
|
||||
// or stereo PCM samples. This is the smallest unit of XMA data that can
|
||||
// be decoded in isolation. Frames are an arbitrary number of bits in
|
||||
// length, and need not be byte-aligned. See "XMA frame structure" below.
|
||||
//
|
||||
// SUBFRAME: A region of bits in an XMA frame that decodes to 128 mono or stereo
|
||||
// samples. The XMA decoder cannot decode a subframe in isolation; it needs
|
||||
// a whole frame to work with. However, it can begin emitting the frame's
|
||||
// decoded samples at any one of the four subframe boundaries. Subframes
|
||||
// can be addressed for seeking and looping purposes.
|
||||
//
|
||||
// PACKET: A 2Kb region containing a 32-bit header and some XMA frames. Frames
|
||||
// can (and usually do) span packets. A packet's header includes the offset
|
||||
// in bits of the first frame that begins within that packet. All of the
|
||||
// frames that begin in a given packet belong to the same "stream" (see the
|
||||
// Multichannel Audio section below).
|
||||
//
|
||||
// STREAM: A set of packets within an XMA file that all contain data for the
|
||||
// same mono or stereo component of a PCM file with more than two channels.
|
||||
// The packets comprising a given stream may be interleaved with each other
|
||||
// more or less arbitrarily; see Multichannel Audio.
|
||||
//
|
||||
// BLOCK: An array of XMA packets; or, to break it down differently, a series of
|
||||
// consecutive XMA frames, padded at the end with reserved data. A block
|
||||
// must contain at least one 2Kb packet per stream, and it can hold up to
|
||||
// 4095 packets (8190Kb), but its size is typically in the 32Kb-128Kb range.
|
||||
// (The size chosen involves a trade-off between memory use and efficiency
|
||||
// of reading from permanent storage.)
|
||||
//
|
||||
// XMA frames do not span blocks, so a block is guaranteed to begin with a
|
||||
// set of complete frames, one per stream. Also, a block in a multi-stream
|
||||
// XMA2 file always contains the same number of samples for each stream;
|
||||
// see Multichannel Audio.
|
||||
//
|
||||
// The 'data' chunk in an XMA2 file is an array of XMA2WAVEFORMAT.BlockCount XMA
|
||||
// blocks, all the same size (as specified in XMA2WAVEFORMAT.BlockSizeInBytes)
|
||||
// except for the last one, which may be shorter.
|
||||
|
||||
|
||||
// MULTICHANNEL AUDIO: the XMA decoder can only decode raw XMA data into either
|
||||
// mono or stereo PCM data. In order to encode a 6-channel file (say), the file
|
||||
// must be deinterleaved into 3 stereo streams that are encoded independently,
|
||||
// producing 3 encoded XMA data streams. Then the packets in these 3 streams
|
||||
// are interleaved to produce a single XMA2 file, and some information is added
|
||||
// to the file so that the original 6-channel audio can be reconstructed at
|
||||
// decode time. This works using the concept of an XMA stream (see above).
|
||||
//
|
||||
// The frames for all the streams in an XMA file are interleaved in an arbitrary
|
||||
// order. To locate a frame that belongs to a given stream in a given XMA block,
|
||||
// you must examine the first few packets in the block. Here (and only here) the
|
||||
// packets are guaranteed to be presented in stream order, so that all frames
|
||||
// beginning in packet 0 belong to stream 0 (the first stereo pair), etc.
|
||||
//
|
||||
// (This means that when decoding multi-stream XMA files, only entire XMA blocks
|
||||
// should be submitted to the decoder; otherwise it cannot know which frames
|
||||
// belong to which stream.)
|
||||
//
|
||||
// Once you have one frame that belongs to a given stream, you can find the next
|
||||
// one by looking at the frame's 'NextFrameOffsetBits' value (which is stored in
|
||||
// its first 15 bits; see XMAFRAME below). The GetXmaFrameBitPosition function
|
||||
// uses this technique.
|
||||
|
||||
|
||||
// SEEKING IN XMA2 FILES: Here is some pseudocode to find the byte position and
|
||||
// subframe in an XMA2 file which will contain sample S when decoded.
|
||||
//
|
||||
// 1. Traverse the seek table to find the XMA2 block containing sample S. The
|
||||
// seek table is an array of big-endian DWORDs, one per block in the file.
|
||||
// The Nth DWORD is the total number of PCM samples that would be obtained
|
||||
// by decoding the entire XMA file up to the end of block N. Hence, the
|
||||
// block we want is the first one whose seek table entry is greater than S.
|
||||
// (See the GetXmaBlockContainingSample helper function.)
|
||||
//
|
||||
// 2. Calculate which frame F within the block found above contains sample S.
|
||||
// Since each frame decodes to 512 samples, this is straightforward. The
|
||||
// first frame in the block produces samples X to X + 512, where X is the
|
||||
// seek table entry for the prior block. So F is (S - X) / 512.
|
||||
//
|
||||
// 3. Find the bit offset within the block where frame F starts. Since frames
|
||||
// are variable-sized, this can only be done by traversing all the frames in
|
||||
// the block until we reach frame F. (See GetXmaFrameBitPosition.)
|
||||
//
|
||||
// 4. Frame F has four 128-sample subframes. To find the subframe containing S,
|
||||
// we can use the formula (S % 512) / 128.
|
||||
//
|
||||
// In the case of multi-stream XMA files, sample S is a multichannel sample with
|
||||
// parts coming from several frames, one per stream. To find all these frames,
|
||||
// steps 2-4 need to be repeated for each stream N, using the knowledge that the
|
||||
// first packets in a block are presented in stream order. The frame traversal
|
||||
// in step 3 must be started at the first frame in the Nth packet of the block,
|
||||
// which will be the first frame for stream N. (And the packet header will tell
|
||||
// you the first frame's start position within the packet.)
|
||||
//
|
||||
// Step 1 can be performed using the GetXmaBlockContainingSample function below,
|
||||
// and steps 2-4 by calling GetXmaDecodePositionForSample once for each stream.
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* XMA constants
|
||||
***************************************************************************/
|
||||
|
||||
// Size of the PCM samples produced by the XMA decoder
|
||||
#define XMA_OUTPUT_SAMPLE_BYTES 2u
|
||||
#define XMA_OUTPUT_SAMPLE_BITS (XMA_OUTPUT_SAMPLE_BYTES * 8u)
|
||||
|
||||
// Size of an XMA packet
|
||||
#define XMA_BYTES_PER_PACKET 2048u
|
||||
#define XMA_BITS_PER_PACKET (XMA_BYTES_PER_PACKET * 8u)
|
||||
|
||||
// Size of an XMA packet header
|
||||
#define XMA_PACKET_HEADER_BYTES 4u
|
||||
#define XMA_PACKET_HEADER_BITS (XMA_PACKET_HEADER_BYTES * 8u)
|
||||
|
||||
// Sample blocks in a decoded XMA frame
|
||||
#define XMA_SAMPLES_PER_FRAME 512u
|
||||
|
||||
// Sample blocks in a decoded XMA subframe
|
||||
#define XMA_SAMPLES_PER_SUBFRAME 128u
|
||||
|
||||
// Maximum encoded data that can be submitted to the XMA decoder at a time
|
||||
#define XMA_READBUFFER_MAX_PACKETS 4095u
|
||||
#define XMA_READBUFFER_MAX_BYTES (XMA_READBUFFER_MAX_PACKETS * XMA_BYTES_PER_PACKET)
|
||||
|
||||
// Maximum size allowed for the XMA decoder's output buffers
|
||||
#define XMA_WRITEBUFFER_MAX_BYTES (31u * 256u)
|
||||
|
||||
// Required byte alignment of the XMA decoder's output buffers
|
||||
#define XMA_WRITEBUFFER_BYTE_ALIGNMENT 256u
|
||||
|
||||
// Decode chunk sizes for the XMA_PLAYBACK_INIT.subframesToDecode field
|
||||
#define XMA_MIN_SUBFRAMES_TO_DECODE 1u
|
||||
#define XMA_MAX_SUBFRAMES_TO_DECODE 8u
|
||||
#define XMA_OPTIMAL_SUBFRAMES_TO_DECODE 4u
|
||||
|
||||
// LoopCount<255 means finite repetitions; LoopCount=255 means infinite looping
|
||||
#define XMA_MAX_LOOPCOUNT 254u
|
||||
#define XMA_INFINITE_LOOP 255u
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* XMA format structures
|
||||
***************************************************************************/
|
||||
|
||||
// The currently recommended way to express format information for XMA2 files
|
||||
// is the XMA2WAVEFORMATEX structure. This structure is fully compliant with
|
||||
// the WAVEFORMATEX standard and contains all the information needed to parse
|
||||
// and manage XMA2 files in a compact way.
|
||||
|
||||
#define WAVE_FORMAT_XMA2 0x166
|
||||
|
||||
typedef struct XMA2WAVEFORMATEX
|
||||
{
|
||||
WAVEFORMATEX wfx;
|
||||
// Meaning of the WAVEFORMATEX fields here:
|
||||
// wFormatTag; // Audio format type; always WAVE_FORMAT_XMA2
|
||||
// nChannels; // Channel count of the decoded audio
|
||||
// nSamplesPerSec; // Sample rate of the decoded audio
|
||||
// nAvgBytesPerSec; // Used internally by the XMA encoder
|
||||
// nBlockAlign; // Decoded sample size; channels * wBitsPerSample / 8
|
||||
// wBitsPerSample; // Bits per decoded mono sample; always 16 for XMA
|
||||
// cbSize; // Size in bytes of the rest of this structure (34)
|
||||
|
||||
WORD NumStreams; // Number of audio streams (1 or 2 channels each)
|
||||
DWORD ChannelMask; // Spatial positions of the channels in this file,
|
||||
// stored as SPEAKER_xxx values (see audiodefs.h)
|
||||
DWORD SamplesEncoded; // Total number of PCM samples the file decodes to
|
||||
DWORD BytesPerBlock; // XMA block size (but the last one may be shorter)
|
||||
DWORD PlayBegin; // First valid sample in the decoded audio
|
||||
DWORD PlayLength; // Length of the valid part of the decoded audio
|
||||
DWORD LoopBegin; // Beginning of the loop region in decoded sample terms
|
||||
DWORD LoopLength; // Length of the loop region in decoded sample terms
|
||||
BYTE LoopCount; // Number of loop repetitions; 255 = infinite
|
||||
BYTE EncoderVersion; // Version of XMA encoder that generated the file
|
||||
WORD BlockCount; // XMA blocks in file (and entries in its seek table)
|
||||
} XMA2WAVEFORMATEX, *PXMA2WAVEFORMATEX;
|
||||
|
||||
|
||||
// The legacy XMA format structures are described here for reference, but they
|
||||
// should not be used in new content. XMAWAVEFORMAT was the structure used in
|
||||
// XMA version 1 files. XMA2WAVEFORMAT was used in early XMA2 files; it is not
|
||||
// placed in the usual 'fmt' RIFF chunk but in its own 'XMA2' chunk.
|
||||
|
||||
#ifndef WAVE_FORMAT_XMA
|
||||
#define WAVE_FORMAT_XMA 0x0165
|
||||
|
||||
// Values used in the ChannelMask fields below. Similar to the SPEAKER_xxx
|
||||
// values defined in audiodefs.h, but modified to fit in a single byte.
|
||||
#ifndef XMA_SPEAKER_LEFT
|
||||
#define XMA_SPEAKER_LEFT 0x01
|
||||
#define XMA_SPEAKER_RIGHT 0x02
|
||||
#define XMA_SPEAKER_CENTER 0x04
|
||||
#define XMA_SPEAKER_LFE 0x08
|
||||
#define XMA_SPEAKER_LEFT_SURROUND 0x10
|
||||
#define XMA_SPEAKER_RIGHT_SURROUND 0x20
|
||||
#define XMA_SPEAKER_LEFT_BACK 0x40
|
||||
#define XMA_SPEAKER_RIGHT_BACK 0x80
|
||||
#endif
|
||||
|
||||
|
||||
// Used in XMAWAVEFORMAT for per-stream data
|
||||
typedef struct XMASTREAMFORMAT
|
||||
{
|
||||
DWORD PsuedoBytesPerSec; // Used by the XMA encoder (typo preserved for legacy reasons)
|
||||
DWORD SampleRate; // The stream's decoded sample rate (in XMA2 files,
|
||||
// this is the same for all streams in the file).
|
||||
DWORD LoopStart; // Bit offset of the frame containing the loop start
|
||||
// point, relative to the beginning of the stream.
|
||||
DWORD LoopEnd; // Bit offset of the frame containing the loop end.
|
||||
BYTE SubframeData; // Two 4-bit numbers specifying the exact location of
|
||||
// the loop points within the frames that contain them.
|
||||
// SubframeEnd: Subframe of the loop end frame where
|
||||
// the loop ends. Ranges from 0 to 3.
|
||||
// SubframeSkip: Subframes to skip in the start frame to
|
||||
// reach the loop. Ranges from 0 to 4.
|
||||
BYTE Channels; // Number of channels in the stream (1 or 2)
|
||||
WORD ChannelMask; // Spatial positions of the channels in the stream
|
||||
} XMASTREAMFORMAT;
|
||||
|
||||
// Legacy XMA1 format structure
|
||||
typedef struct XMAWAVEFORMAT
|
||||
{
|
||||
WORD FormatTag; // Audio format type (always WAVE_FORMAT_XMA)
|
||||
WORD BitsPerSample; // Bit depth (currently required to be 16)
|
||||
WORD EncodeOptions; // Options for XMA encoder/decoder
|
||||
WORD LargestSkip; // Largest skip used in interleaving streams
|
||||
WORD NumStreams; // Number of interleaved audio streams
|
||||
BYTE LoopCount; // Number of loop repetitions; 255 = infinite
|
||||
BYTE Version; // XMA encoder version that generated the file.
|
||||
// Always 3 or higher for XMA2 files.
|
||||
XMASTREAMFORMAT XmaStreams[1]; // Per-stream format information; the actual
|
||||
// array length is in the NumStreams field.
|
||||
} XMAWAVEFORMAT;
|
||||
|
||||
|
||||
// Used in XMA2WAVEFORMAT for per-stream data
|
||||
typedef struct XMA2STREAMFORMAT
|
||||
{
|
||||
BYTE Channels; // Number of channels in the stream (1 or 2)
|
||||
BYTE RESERVED; // Reserved for future use
|
||||
WORD ChannelMask; // Spatial positions of the channels in the stream
|
||||
} XMA2STREAMFORMAT;
|
||||
|
||||
// Legacy XMA2 format structure (big-endian byte ordering)
|
||||
typedef struct XMA2WAVEFORMAT
|
||||
{
|
||||
BYTE Version; // XMA encoder version that generated the file.
|
||||
// Always 3 or higher for XMA2 files.
|
||||
BYTE NumStreams; // Number of interleaved audio streams
|
||||
BYTE RESERVED; // Reserved for future use
|
||||
BYTE LoopCount; // Number of loop repetitions; 255 = infinite
|
||||
DWORD LoopBegin; // Loop begin point, in samples
|
||||
DWORD LoopEnd; // Loop end point, in samples
|
||||
DWORD SampleRate; // The file's decoded sample rate
|
||||
DWORD EncodeOptions; // Options for the XMA encoder/decoder
|
||||
DWORD PsuedoBytesPerSec; // Used internally by the XMA encoder
|
||||
DWORD BlockSizeInBytes; // Size in bytes of this file's XMA blocks (except
|
||||
// possibly the last one). Always a multiple of
|
||||
// 2Kb, since XMA blocks are arrays of 2Kb packets.
|
||||
DWORD SamplesEncoded; // Total number of PCM samples encoded in this file
|
||||
DWORD SamplesInSource; // Actual number of PCM samples in the source
|
||||
// material used to generate this file
|
||||
DWORD BlockCount; // Number of XMA blocks in this file (and hence
|
||||
// also the number of entries in its seek table)
|
||||
XMA2STREAMFORMAT Streams[1]; // Per-stream format information; the actual
|
||||
// array length is in the NumStreams field.
|
||||
} XMA2WAVEFORMAT;
|
||||
|
||||
#endif // #ifndef WAVE_FORMAT_XMA
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* XMA packet structure (in big-endian form)
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct XMA2PACKET
|
||||
{
|
||||
int FrameCount : 6; // Number of XMA frames that begin in this packet
|
||||
int FrameOffsetInBits : 15; // Bit of XmaData where the first complete frame begins
|
||||
int PacketMetaData : 3; // Metadata stored in the packet (always 1 for XMA2)
|
||||
int PacketSkipCount : 8; // How many packets belonging to other streams must be
|
||||
// skipped to find the next packet belonging to this one
|
||||
BYTE XmaData[XMA_BYTES_PER_PACKET - sizeof(DWORD)]; // XMA encoded data
|
||||
} XMA2PACKET;
|
||||
|
||||
// E.g. if the first DWORD of a packet is 0x30107902:
|
||||
//
|
||||
// 001100 000001000001111 001 00000010
|
||||
// | | | |____ Skip 2 packets to find the next one for this stream
|
||||
// | | |___________ XMA2 signature (always 001)
|
||||
// | |_____________________ First frame starts 527 bits into packet
|
||||
// |________________________________ Packet contains 12 frames
|
||||
|
||||
|
||||
// Helper functions to extract the fields above from an XMA packet. (Note that
|
||||
// the bitfields cannot be read directly on little-endian architectures such as
|
||||
// the Intel x86, as they are laid out in big-endian form.)
|
||||
|
||||
__inline DWORD GetXmaPacketFrameCount(__in_bcount(1) const BYTE* pPacket)
|
||||
{
|
||||
return (DWORD)(pPacket[0] >> 2);
|
||||
}
|
||||
|
||||
__inline DWORD GetXmaPacketFirstFrameOffsetInBits(__in_bcount(3) const BYTE* pPacket)
|
||||
{
|
||||
return ((DWORD)(pPacket[0] & 0x3) << 13) |
|
||||
((DWORD)(pPacket[1]) << 5) |
|
||||
((DWORD)(pPacket[2]) >> 3);
|
||||
}
|
||||
|
||||
__inline DWORD GetXmaPacketMetadata(__in_bcount(3) const BYTE* pPacket)
|
||||
{
|
||||
return (DWORD)(pPacket[2] & 0x7);
|
||||
}
|
||||
|
||||
__inline DWORD GetXmaPacketSkipCount(__in_bcount(4) const BYTE* pPacket)
|
||||
{
|
||||
return (DWORD)(pPacket[3]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* XMA frame structure
|
||||
***************************************************************************/
|
||||
|
||||
// There is no way to represent the XMA frame as a C struct, since it is a
|
||||
// variable-sized string of bits that need not be stored at a byte-aligned
|
||||
// position in memory. This is the layout:
|
||||
//
|
||||
// XMAFRAME
|
||||
// {
|
||||
// LengthInBits: A 15-bit number representing the length of this frame.
|
||||
// XmaData: Encoded XMA data; its size in bits is (LengthInBits - 15).
|
||||
// }
|
||||
|
||||
// Size in bits of the frame's initial LengthInBits field
|
||||
#define XMA_BITS_IN_FRAME_LENGTH_FIELD 15
|
||||
|
||||
// Special LengthInBits value that marks an invalid final frame
|
||||
#define XMA_FINAL_FRAME_MARKER 0x7FFF
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* XMA helper functions
|
||||
***************************************************************************/
|
||||
|
||||
// We define a local ASSERT macro to equal the global one if it exists.
|
||||
// You can define XMA2DEFS_ASSERT in advance to override this default.
|
||||
#ifndef XMA2DEFS_ASSERT
|
||||
#ifdef ASSERT
|
||||
#define XMA2DEFS_ASSERT ASSERT
|
||||
#else
|
||||
#define XMA2DEFS_ASSERT(a) /* No-op by default */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// GetXmaBlockContainingSample: Use a given seek table to find the XMA block
|
||||
// containing a given decoded sample. Note that the seek table entries in an
|
||||
// XMA file are stored in big-endian form and may need to be converted prior
|
||||
// to calling this function.
|
||||
|
||||
__inline HRESULT GetXmaBlockContainingSample
|
||||
(
|
||||
DWORD nBlockCount, // Blocks in the file (= seek table entries)
|
||||
__in_ecount(nBlockCount) const DWORD* pSeekTable, // Pointer to the seek table data
|
||||
DWORD nDesiredSample, // Decoded sample to locate
|
||||
__out DWORD* pnBlockContainingSample, // Index of the block containing the sample
|
||||
__out DWORD* pnSampleOffsetWithinBlock // Position of the sample in this block
|
||||
)
|
||||
{
|
||||
DWORD nPreviousTotalSamples = 0;
|
||||
DWORD nBlock;
|
||||
DWORD nTotalSamplesSoFar;
|
||||
|
||||
XMA2DEFS_ASSERT(pSeekTable);
|
||||
XMA2DEFS_ASSERT(pnBlockContainingSample);
|
||||
XMA2DEFS_ASSERT(pnSampleOffsetWithinBlock);
|
||||
|
||||
for (nBlock = 0; nBlock < nBlockCount; ++nBlock)
|
||||
{
|
||||
nTotalSamplesSoFar = pSeekTable[nBlock];
|
||||
if (nTotalSamplesSoFar > nDesiredSample)
|
||||
{
|
||||
*pnBlockContainingSample = nBlock;
|
||||
*pnSampleOffsetWithinBlock = nDesiredSample - nPreviousTotalSamples;
|
||||
return S_OK;
|
||||
}
|
||||
nPreviousTotalSamples = nTotalSamplesSoFar;
|
||||
}
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
|
||||
// GetXmaFrameLengthInBits: Reads a given frame's LengthInBits field.
|
||||
|
||||
__inline DWORD GetXmaFrameLengthInBits
|
||||
(
|
||||
__in_bcount(nBitPosition / 8 + 3)
|
||||
__in const BYTE* pPacket, // Pointer to XMA packet[s] containing the frame
|
||||
DWORD nBitPosition // Bit offset of the frame within this packet
|
||||
)
|
||||
{
|
||||
DWORD nRegion;
|
||||
DWORD nBytePosition = nBitPosition / 8;
|
||||
DWORD nBitOffset = nBitPosition % 8;
|
||||
|
||||
if (nBitOffset < 2) // Only need to read 2 bytes (and might not be safe to read more)
|
||||
{
|
||||
nRegion = (DWORD)(pPacket[nBytePosition+0]) << 8 |
|
||||
(DWORD)(pPacket[nBytePosition+1]);
|
||||
return (nRegion >> (1 - nBitOffset)) & 0x7FFF; // Last 15 bits
|
||||
}
|
||||
else // Need to read 3 bytes
|
||||
{
|
||||
nRegion = (DWORD)(pPacket[nBytePosition+0]) << 16 |
|
||||
(DWORD)(pPacket[nBytePosition+1]) << 8 |
|
||||
(DWORD)(pPacket[nBytePosition+2]);
|
||||
return (nRegion >> (9 - nBitOffset)) & 0x7FFF; // Last 15 bits
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// GetXmaFrameBitPosition: Calculates the bit offset of a given frame within
|
||||
// an XMA block or set of blocks. Returns 0 on failure.
|
||||
|
||||
__inline DWORD GetXmaFrameBitPosition
|
||||
(
|
||||
__in_bcount(nXmaDataBytes) const BYTE* pXmaData, // Pointer to XMA block[s]
|
||||
DWORD nXmaDataBytes, // Size of pXmaData in bytes
|
||||
DWORD nStreamIndex, // Stream within which to seek
|
||||
DWORD nDesiredFrame // Frame sought
|
||||
)
|
||||
{
|
||||
const BYTE* pCurrentPacket;
|
||||
DWORD nPacketsExamined = 0;
|
||||
DWORD nFrameCountSoFar = 0;
|
||||
DWORD nFramesToSkip;
|
||||
DWORD nFrameBitOffset;
|
||||
|
||||
XMA2DEFS_ASSERT(pXmaData);
|
||||
XMA2DEFS_ASSERT(nXmaDataBytes % XMA_BYTES_PER_PACKET == 0);
|
||||
|
||||
// Get the first XMA packet belonging to the desired stream, relying on the
|
||||
// fact that the first packets for each stream are in consecutive order at
|
||||
// the beginning of an XMA block.
|
||||
|
||||
pCurrentPacket = pXmaData + nStreamIndex * XMA_BYTES_PER_PACKET;
|
||||
for (;;)
|
||||
{
|
||||
// If we have exceeded the size of the XMA data, return failure
|
||||
if (pCurrentPacket + XMA_BYTES_PER_PACKET > pXmaData + nXmaDataBytes)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If the current packet contains the frame we are looking for...
|
||||
if (nFrameCountSoFar + GetXmaPacketFrameCount(pCurrentPacket) > nDesiredFrame)
|
||||
{
|
||||
// See how many frames in this packet we need to skip to get to it
|
||||
XMA2DEFS_ASSERT(nDesiredFrame >= nFrameCountSoFar);
|
||||
nFramesToSkip = nDesiredFrame - nFrameCountSoFar;
|
||||
|
||||
// Get the bit offset of the first frame in this packet
|
||||
nFrameBitOffset = XMA_PACKET_HEADER_BITS + GetXmaPacketFirstFrameOffsetInBits(pCurrentPacket);
|
||||
|
||||
// Advance nFrameBitOffset to the frame of interest
|
||||
while (nFramesToSkip--)
|
||||
{
|
||||
nFrameBitOffset += GetXmaFrameLengthInBits(pCurrentPacket, nFrameBitOffset);
|
||||
}
|
||||
|
||||
// The bit offset to return is the number of bits from pXmaData to
|
||||
// pCurrentPacket plus the bit offset of the frame of interest
|
||||
return (DWORD)(pCurrentPacket - pXmaData) * 8 + nFrameBitOffset;
|
||||
}
|
||||
|
||||
// If we haven't found the right packet yet, advance our counters
|
||||
++nPacketsExamined;
|
||||
nFrameCountSoFar += GetXmaPacketFrameCount(pCurrentPacket);
|
||||
|
||||
// And skip to the next packet belonging to the same stream
|
||||
pCurrentPacket += XMA_BYTES_PER_PACKET * (GetXmaPacketSkipCount(pCurrentPacket) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// GetLastXmaFrameBitPosition: Calculates the bit offset of the last complete
|
||||
// frame in an XMA block or set of blocks.
|
||||
|
||||
__inline DWORD GetLastXmaFrameBitPosition
|
||||
(
|
||||
__in_bcount(nXmaDataBytes) const BYTE* pXmaData, // Pointer to XMA block[s]
|
||||
DWORD nXmaDataBytes, // Size of pXmaData in bytes
|
||||
DWORD nStreamIndex // Stream within which to seek
|
||||
)
|
||||
{
|
||||
const BYTE* pLastPacket;
|
||||
DWORD nBytesToNextPacket;
|
||||
DWORD nFrameBitOffset;
|
||||
DWORD nFramesInLastPacket;
|
||||
|
||||
XMA2DEFS_ASSERT(pXmaData);
|
||||
XMA2DEFS_ASSERT(nXmaDataBytes % XMA_BYTES_PER_PACKET == 0);
|
||||
XMA2DEFS_ASSERT(nXmaDataBytes >= XMA_BYTES_PER_PACKET * (nStreamIndex + 1));
|
||||
|
||||
// Get the first XMA packet belonging to the desired stream, relying on the
|
||||
// fact that the first packets for each stream are in consecutive order at
|
||||
// the beginning of an XMA block.
|
||||
pLastPacket = pXmaData + nStreamIndex * XMA_BYTES_PER_PACKET;
|
||||
|
||||
// Search for the last packet belonging to the desired stream
|
||||
for (;;)
|
||||
{
|
||||
nBytesToNextPacket = XMA_BYTES_PER_PACKET * (GetXmaPacketSkipCount(pLastPacket) + 1);
|
||||
XMA2DEFS_ASSERT(nBytesToNextPacket);
|
||||
if (pLastPacket + nBytesToNextPacket + XMA_BYTES_PER_PACKET > pXmaData + nXmaDataBytes)
|
||||
{
|
||||
break; // The next packet would extend beyond the end of pXmaData
|
||||
}
|
||||
pLastPacket += nBytesToNextPacket;
|
||||
}
|
||||
|
||||
// The last packet can sometimes have no seekable frames, in which case we
|
||||
// have to use the previous one
|
||||
if (GetXmaPacketFrameCount(pLastPacket) == 0)
|
||||
{
|
||||
pLastPacket -= nBytesToNextPacket;
|
||||
}
|
||||
|
||||
// Found the last packet. Get the bit offset of its first frame.
|
||||
nFrameBitOffset = XMA_PACKET_HEADER_BITS + GetXmaPacketFirstFrameOffsetInBits(pLastPacket);
|
||||
|
||||
// Traverse frames until we reach the last one
|
||||
nFramesInLastPacket = GetXmaPacketFrameCount(pLastPacket);
|
||||
while (--nFramesInLastPacket)
|
||||
{
|
||||
nFrameBitOffset += GetXmaFrameLengthInBits(pLastPacket, nFrameBitOffset);
|
||||
}
|
||||
|
||||
// The bit offset to return is the number of bits from pXmaData to
|
||||
// pLastPacket plus the offset of the last frame in this packet.
|
||||
return (DWORD)(pLastPacket - pXmaData) * 8 + nFrameBitOffset;
|
||||
}
|
||||
|
||||
|
||||
// GetXmaDecodePositionForSample: Obtains the information needed to make the
|
||||
// decoder generate audio starting at a given sample position relative to the
|
||||
// beginning of the given XMA block: the bit offset of the appropriate frame,
|
||||
// and the right subframe within that frame. This data can be passed directly
|
||||
// to the XMAPlaybackSetDecodePosition function.
|
||||
|
||||
__inline HRESULT GetXmaDecodePositionForSample
|
||||
(
|
||||
__in_bcount(nXmaDataBytes) const BYTE* pXmaData, // Pointer to XMA block[s]
|
||||
DWORD nXmaDataBytes, // Size of pXmaData in bytes
|
||||
DWORD nStreamIndex, // Stream within which to seek
|
||||
DWORD nDesiredSample, // Sample sought
|
||||
__out DWORD* pnBitOffset, // Returns the bit offset within pXmaData of
|
||||
// the frame containing the sample sought
|
||||
__out DWORD* pnSubFrame // Returns the subframe containing the sample
|
||||
)
|
||||
{
|
||||
DWORD nDesiredFrame = nDesiredSample / XMA_SAMPLES_PER_FRAME;
|
||||
DWORD nSubFrame = (nDesiredSample % XMA_SAMPLES_PER_FRAME) / XMA_SAMPLES_PER_SUBFRAME;
|
||||
DWORD nBitOffset = GetXmaFrameBitPosition(pXmaData, nXmaDataBytes, nStreamIndex, nDesiredFrame);
|
||||
|
||||
XMA2DEFS_ASSERT(pnBitOffset);
|
||||
XMA2DEFS_ASSERT(pnSubFrame);
|
||||
|
||||
if (nBitOffset)
|
||||
{
|
||||
*pnBitOffset = nBitOffset;
|
||||
*pnSubFrame = nSubFrame;
|
||||
return S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return E_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// GetXmaSampleRate: Obtains the legal XMA sample rate (24, 32, 44.1 or 48Khz)
|
||||
// corresponding to a generic sample rate.
|
||||
|
||||
__inline DWORD GetXmaSampleRate(DWORD dwGeneralRate)
|
||||
{
|
||||
DWORD dwXmaRate = 48000; // Default XMA rate for all rates above 44100Hz
|
||||
|
||||
if (dwGeneralRate <= 24000) dwXmaRate = 24000;
|
||||
else if (dwGeneralRate <= 32000) dwXmaRate = 32000;
|
||||
else if (dwGeneralRate <= 44100) dwXmaRate = 44100;
|
||||
|
||||
return dwXmaRate;
|
||||
}
|
||||
|
||||
|
||||
// Functions to convert between WAVEFORMATEXTENSIBLE channel masks (combinations
|
||||
// of the SPEAKER_xxx flags defined in audiodefs.h) and XMA channel masks (which
|
||||
// are limited to eight possible speaker positions: left, right, center, low
|
||||
// frequency, side left, side right, back left and back right).
|
||||
|
||||
__inline DWORD GetStandardChannelMaskFromXmaMask(BYTE bXmaMask)
|
||||
{
|
||||
DWORD dwStandardMask = 0;
|
||||
|
||||
if (bXmaMask & XMA_SPEAKER_LEFT) dwStandardMask |= SPEAKER_FRONT_LEFT;
|
||||
if (bXmaMask & XMA_SPEAKER_RIGHT) dwStandardMask |= SPEAKER_FRONT_RIGHT;
|
||||
if (bXmaMask & XMA_SPEAKER_CENTER) dwStandardMask |= SPEAKER_FRONT_CENTER;
|
||||
if (bXmaMask & XMA_SPEAKER_LFE) dwStandardMask |= SPEAKER_LOW_FREQUENCY;
|
||||
if (bXmaMask & XMA_SPEAKER_LEFT_SURROUND) dwStandardMask |= SPEAKER_SIDE_LEFT;
|
||||
if (bXmaMask & XMA_SPEAKER_RIGHT_SURROUND) dwStandardMask |= SPEAKER_SIDE_RIGHT;
|
||||
if (bXmaMask & XMA_SPEAKER_LEFT_BACK) dwStandardMask |= SPEAKER_BACK_LEFT;
|
||||
if (bXmaMask & XMA_SPEAKER_RIGHT_BACK) dwStandardMask |= SPEAKER_BACK_RIGHT;
|
||||
|
||||
return dwStandardMask;
|
||||
}
|
||||
|
||||
__inline BYTE GetXmaChannelMaskFromStandardMask(DWORD dwStandardMask)
|
||||
{
|
||||
BYTE bXmaMask = 0;
|
||||
|
||||
if (dwStandardMask & SPEAKER_FRONT_LEFT) bXmaMask |= XMA_SPEAKER_LEFT;
|
||||
if (dwStandardMask & SPEAKER_FRONT_RIGHT) bXmaMask |= XMA_SPEAKER_RIGHT;
|
||||
if (dwStandardMask & SPEAKER_FRONT_CENTER) bXmaMask |= XMA_SPEAKER_CENTER;
|
||||
if (dwStandardMask & SPEAKER_LOW_FREQUENCY) bXmaMask |= XMA_SPEAKER_LFE;
|
||||
if (dwStandardMask & SPEAKER_SIDE_LEFT) bXmaMask |= XMA_SPEAKER_LEFT_SURROUND;
|
||||
if (dwStandardMask & SPEAKER_SIDE_RIGHT) bXmaMask |= XMA_SPEAKER_RIGHT_SURROUND;
|
||||
if (dwStandardMask & SPEAKER_BACK_LEFT) bXmaMask |= XMA_SPEAKER_LEFT_BACK;
|
||||
if (dwStandardMask & SPEAKER_BACK_RIGHT) bXmaMask |= XMA_SPEAKER_RIGHT_BACK;
|
||||
|
||||
return bXmaMask;
|
||||
}
|
||||
|
||||
|
||||
// LocalizeXma2Format: Modifies a XMA2WAVEFORMATEX structure in place to comply
|
||||
// with the current platform's byte-ordering rules (little- or big-endian).
|
||||
|
||||
__inline HRESULT LocalizeXma2Format(__inout XMA2WAVEFORMATEX* pXma2Format)
|
||||
{
|
||||
#define XMASWAP2BYTES(n) ((WORD)(((n) >> 8) | (((n) & 0xff) << 8)))
|
||||
#define XMASWAP4BYTES(n) ((DWORD)((n) >> 24 | (n) << 24 | ((n) & 0xff00) << 8 | ((n) & 0xff0000) >> 8))
|
||||
|
||||
if (pXma2Format->wfx.wFormatTag == WAVE_FORMAT_XMA2)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
else if (XMASWAP2BYTES(pXma2Format->wfx.wFormatTag) == WAVE_FORMAT_XMA2)
|
||||
{
|
||||
pXma2Format->wfx.wFormatTag = XMASWAP2BYTES(pXma2Format->wfx.wFormatTag);
|
||||
pXma2Format->wfx.nChannels = XMASWAP2BYTES(pXma2Format->wfx.nChannels);
|
||||
pXma2Format->wfx.nSamplesPerSec = XMASWAP4BYTES(pXma2Format->wfx.nSamplesPerSec);
|
||||
pXma2Format->wfx.nAvgBytesPerSec = XMASWAP4BYTES(pXma2Format->wfx.nAvgBytesPerSec);
|
||||
pXma2Format->wfx.nBlockAlign = XMASWAP2BYTES(pXma2Format->wfx.nBlockAlign);
|
||||
pXma2Format->wfx.wBitsPerSample = XMASWAP2BYTES(pXma2Format->wfx.wBitsPerSample);
|
||||
pXma2Format->wfx.cbSize = XMASWAP2BYTES(pXma2Format->wfx.cbSize);
|
||||
pXma2Format->NumStreams = XMASWAP2BYTES(pXma2Format->NumStreams);
|
||||
pXma2Format->ChannelMask = XMASWAP4BYTES(pXma2Format->ChannelMask);
|
||||
pXma2Format->SamplesEncoded = XMASWAP4BYTES(pXma2Format->SamplesEncoded);
|
||||
pXma2Format->BytesPerBlock = XMASWAP4BYTES(pXma2Format->BytesPerBlock);
|
||||
pXma2Format->PlayBegin = XMASWAP4BYTES(pXma2Format->PlayBegin);
|
||||
pXma2Format->PlayLength = XMASWAP4BYTES(pXma2Format->PlayLength);
|
||||
pXma2Format->LoopBegin = XMASWAP4BYTES(pXma2Format->LoopBegin);
|
||||
pXma2Format->LoopLength = XMASWAP4BYTES(pXma2Format->LoopLength);
|
||||
pXma2Format->BlockCount = XMASWAP2BYTES(pXma2Format->BlockCount);
|
||||
return S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return E_FAIL; // Not a recognizable XMA2 format
|
||||
}
|
||||
|
||||
#undef XMASWAP2BYTES
|
||||
#undef XMASWAP4BYTES
|
||||
}
|
||||
|
||||
|
||||
#endif // #ifndef __XMA2DEFS_INCLUDED__
|
||||
+1
Submodule 3rdparty/ffmpeg added at 8dd84dc1ea
+1
Submodule 3rdparty/libpng added at ea77a6fd49
Vendored
+7183
File diff suppressed because it is too large
Load Diff
Vendored
+4890
File diff suppressed because it is too large
Load Diff
+924
@@ -0,0 +1,924 @@
|
||||
|
||||
/*=========================================================================*\
|
||||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
File: D2D1_1Helper.h
|
||||
|
||||
Module Name: D2D
|
||||
|
||||
Description: Helper files over the D2D interfaces and APIs.
|
||||
|
||||
\*=========================================================================*/
|
||||
#pragma once
|
||||
|
||||
#ifndef _D2D1_1HELPER_H_
|
||||
#define _D2D1_1HELPER_H_
|
||||
|
||||
#ifndef _D2D1_1_H_
|
||||
#include <d2d1_1.h>
|
||||
#endif // #ifndef _D2D1_H_
|
||||
|
||||
#ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
#pragma region Application Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
namespace D2D1
|
||||
{
|
||||
template<>
|
||||
struct TypeTraits<INT32>
|
||||
{
|
||||
typedef D2D1_POINT_2L Point;
|
||||
typedef D2D1_RECT_L Rect;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeTraits<LONG>
|
||||
{
|
||||
typedef D2D1_POINT_2L Point;
|
||||
typedef D2D1_RECT_L Rect;
|
||||
};
|
||||
|
||||
class Matrix4x3F : public D2D1_MATRIX_4X3_F
|
||||
{
|
||||
public:
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x3F(
|
||||
FLOAT m11, FLOAT m12, FLOAT m13,
|
||||
FLOAT m21, FLOAT m22, FLOAT m23,
|
||||
FLOAT m31, FLOAT m32, FLOAT m33,
|
||||
FLOAT m41, FLOAT m42, FLOAT m43
|
||||
)
|
||||
{
|
||||
_11 = m11;
|
||||
_12 = m12;
|
||||
_13 = m13;
|
||||
|
||||
_21 = m21;
|
||||
_22 = m22;
|
||||
_23 = m23;
|
||||
|
||||
_31 = m31;
|
||||
_32 = m32;
|
||||
_33 = m33;
|
||||
|
||||
_41 = m41;
|
||||
_42 = m42;
|
||||
_43 = m43;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x3F()
|
||||
{
|
||||
_11 = 1;
|
||||
_12 = 0;
|
||||
_13 = 0;
|
||||
|
||||
_21 = 0;
|
||||
_22 = 1;
|
||||
_23 = 0;
|
||||
|
||||
_31 = 0;
|
||||
_32 = 0;
|
||||
_33 = 1;
|
||||
|
||||
_41 = 0;
|
||||
_42 = 0;
|
||||
_43 = 0;
|
||||
}
|
||||
};
|
||||
|
||||
class Matrix4x4F : public D2D1_MATRIX_4X4_F
|
||||
{
|
||||
public:
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F(
|
||||
FLOAT m11, FLOAT m12, FLOAT m13, FLOAT m14,
|
||||
FLOAT m21, FLOAT m22, FLOAT m23, FLOAT m24,
|
||||
FLOAT m31, FLOAT m32, FLOAT m33, FLOAT m34,
|
||||
FLOAT m41, FLOAT m42, FLOAT m43, FLOAT m44
|
||||
)
|
||||
{
|
||||
_11 = m11;
|
||||
_12 = m12;
|
||||
_13 = m13;
|
||||
_14 = m14;
|
||||
|
||||
_21 = m21;
|
||||
_22 = m22;
|
||||
_23 = m23;
|
||||
_24 = m24;
|
||||
|
||||
_31 = m31;
|
||||
_32 = m32;
|
||||
_33 = m33;
|
||||
_34 = m34;
|
||||
|
||||
_41 = m41;
|
||||
_42 = m42;
|
||||
_43 = m43;
|
||||
_44 = m44;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F()
|
||||
{
|
||||
_11 = 1;
|
||||
_12 = 0;
|
||||
_13 = 0;
|
||||
_14 = 0;
|
||||
|
||||
_21 = 0;
|
||||
_22 = 1;
|
||||
_23 = 0;
|
||||
_24 = 0;
|
||||
|
||||
_31 = 0;
|
||||
_32 = 0;
|
||||
_33 = 1;
|
||||
_34 = 0;
|
||||
|
||||
_41 = 0;
|
||||
_42 = 0;
|
||||
_43 = 0;
|
||||
_44 = 1;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
bool
|
||||
operator==(
|
||||
const Matrix4x4F& r
|
||||
) const
|
||||
{
|
||||
return _11 == r._11 && _12 == r._12 && _13 == r._13 && _14 == r._14 &&
|
||||
_21 == r._21 && _22 == r._22 && _23 == r._23 && _24 == r._24 &&
|
||||
_31 == r._31 && _32 == r._32 && _33 == r._33 && _34 == r._34 &&
|
||||
_41 == r._41 && _42 == r._42 && _43 == r._43 && _44 == r._44;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
bool
|
||||
operator!=(
|
||||
const Matrix4x4F& r
|
||||
) const
|
||||
{
|
||||
return !(*this == r);
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
Translation(FLOAT x, FLOAT y, FLOAT z)
|
||||
{
|
||||
Matrix4x4F translation;
|
||||
|
||||
translation._11 = 1.0; translation._12 = 0.0; translation._13 = 0.0; translation._14 = 0.0;
|
||||
translation._21 = 0.0; translation._22 = 1.0; translation._23 = 0.0; translation._24 = 0.0;
|
||||
translation._31 = 0.0; translation._32 = 0.0; translation._33 = 1.0; translation._34 = 0.0;
|
||||
translation._41 = x; translation._42 = y; translation._43 = z; translation._44 = 1.0;
|
||||
|
||||
return translation;
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
Scale(FLOAT x, FLOAT y, FLOAT z)
|
||||
{
|
||||
Matrix4x4F scale;
|
||||
|
||||
scale._11 = x; scale._12 = 0.0; scale._13 = 0.0; scale._14 = 0.0;
|
||||
scale._21 = 0.0; scale._22 = y; scale._23 = 0.0; scale._24 = 0.0;
|
||||
scale._31 = 0.0; scale._32 = 0.0; scale._33 = z; scale._34 = 0.0;
|
||||
scale._41 = 0.0; scale._42 = 0.0; scale._43 = 0.0; scale._44 = 1.0;
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
RotationX(FLOAT degreeX)
|
||||
{
|
||||
FLOAT angleInRadian = degreeX * (3.141592654f / 180.0f);
|
||||
|
||||
FLOAT sinAngle = 0.0;
|
||||
FLOAT cosAngle = 0.0;
|
||||
D2D1SinCos(angleInRadian, &sinAngle, &cosAngle);
|
||||
|
||||
Matrix4x4F rotationX(
|
||||
1, 0, 0, 0,
|
||||
0, cosAngle, sinAngle, 0,
|
||||
0, -sinAngle, cosAngle, 0,
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return rotationX;
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
RotationY(FLOAT degreeY)
|
||||
{
|
||||
FLOAT angleInRadian = degreeY * (3.141592654f / 180.0f);
|
||||
|
||||
FLOAT sinAngle = 0.0;
|
||||
FLOAT cosAngle = 0.0;
|
||||
D2D1SinCos(angleInRadian, &sinAngle, &cosAngle);
|
||||
|
||||
Matrix4x4F rotationY(
|
||||
cosAngle, 0, -sinAngle, 0,
|
||||
0, 1, 0, 0,
|
||||
sinAngle, 0, cosAngle, 0,
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return rotationY;
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
RotationZ(FLOAT degreeZ)
|
||||
{
|
||||
FLOAT angleInRadian = degreeZ * (3.141592654f / 180.0f);
|
||||
|
||||
FLOAT sinAngle = 0.0;
|
||||
FLOAT cosAngle = 0.0;
|
||||
D2D1SinCos(angleInRadian, &sinAngle, &cosAngle);
|
||||
|
||||
Matrix4x4F rotationZ(
|
||||
cosAngle, sinAngle, 0, 0,
|
||||
-sinAngle, cosAngle, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return rotationZ;
|
||||
}
|
||||
|
||||
//
|
||||
// 3D Rotation matrix for an arbitrary axis specified by x, y and z
|
||||
//
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
RotationArbitraryAxis(FLOAT x, FLOAT y, FLOAT z, FLOAT degree)
|
||||
{
|
||||
// Normalize the vector represented by x, y, and z
|
||||
FLOAT magnitude = D2D1Vec3Length(x, y, z);
|
||||
x /= magnitude;
|
||||
y /= magnitude;
|
||||
z /= magnitude;
|
||||
|
||||
FLOAT angleInRadian = degree * (3.141592654f / 180.0f);
|
||||
|
||||
FLOAT sinAngle = 0.0;
|
||||
FLOAT cosAngle = 0.0;
|
||||
D2D1SinCos(angleInRadian, &sinAngle, &cosAngle);
|
||||
|
||||
FLOAT oneMinusCosAngle = 1 - cosAngle;
|
||||
|
||||
Matrix4x4F rotationArb(
|
||||
1 + oneMinusCosAngle * (x * x - 1),
|
||||
z * sinAngle + oneMinusCosAngle * x * y,
|
||||
-y * sinAngle + oneMinusCosAngle * x * z,
|
||||
0,
|
||||
|
||||
-z * sinAngle + oneMinusCosAngle * y * x,
|
||||
1 + oneMinusCosAngle * (y * y - 1),
|
||||
x * sinAngle + oneMinusCosAngle * y * z,
|
||||
0,
|
||||
|
||||
y * sinAngle + oneMinusCosAngle * z * x,
|
||||
-x * sinAngle + oneMinusCosAngle * z * y,
|
||||
1 + oneMinusCosAngle * (z * z - 1) ,
|
||||
0,
|
||||
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return rotationArb;
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
SkewX(FLOAT degreeX)
|
||||
{
|
||||
FLOAT angleInRadian = degreeX * (3.141592654f / 180.0f);
|
||||
|
||||
FLOAT tanAngle = D2D1Tan(angleInRadian);
|
||||
|
||||
Matrix4x4F skewX(
|
||||
1, 0, 0, 0,
|
||||
tanAngle, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return skewX;
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
SkewY(FLOAT degreeY)
|
||||
{
|
||||
FLOAT angleInRadian = degreeY * (3.141592654f / 180.0f);
|
||||
|
||||
FLOAT tanAngle = D2D1Tan(angleInRadian);
|
||||
|
||||
Matrix4x4F skewY(
|
||||
1, tanAngle, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return skewY;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
PerspectiveProjection(FLOAT depth)
|
||||
{
|
||||
float proj = 0;
|
||||
|
||||
if (depth > 0)
|
||||
{
|
||||
proj = -1/depth;
|
||||
}
|
||||
|
||||
Matrix4x4F projection(
|
||||
1, 0, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, proj,
|
||||
0, 0, 0, 1
|
||||
);
|
||||
|
||||
return projection;
|
||||
}
|
||||
|
||||
//
|
||||
// Functions for convertion from the base D2D1_MATRIX_4X4_f to
|
||||
// this type without making a copy
|
||||
//
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
const Matrix4x4F*
|
||||
ReinterpretBaseType(const D2D1_MATRIX_4X4_F *pMatrix)
|
||||
{
|
||||
return static_cast<const Matrix4x4F *>(pMatrix);
|
||||
}
|
||||
|
||||
static
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F*
|
||||
ReinterpretBaseType(D2D1_MATRIX_4X4_F *pMatrix)
|
||||
{
|
||||
return static_cast<Matrix4x4F *>(pMatrix);
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
FLOAT
|
||||
Determinant() const
|
||||
{
|
||||
FLOAT minor1 = _41 * (_12 * (_23 * _34 - _33 * _24) - _13 * (_22 * _34 - _24 * _32) + _14 * (_22 * _33 - _23 * _32));
|
||||
FLOAT minor2 = _42 * (_11 * (_21 * _34 - _31 * _24) - _13 * (_21 * _34 - _24 * _31) + _14 * (_21 * _33 - _23 * _31));
|
||||
FLOAT minor3 = _43 * (_11 * (_22 * _34 - _32 * _24) - _12 * (_21 * _34 - _24 * _31) + _14 * (_21 * _32 - _22 * _31));
|
||||
FLOAT minor4 = _44 * (_11 * (_22 * _33 - _32 * _23) - _12 * (_21 * _33 - _23 * _31) + _13 * (_21 * _32 - _22 * _31));
|
||||
|
||||
return minor1 - minor2 + minor3 - minor4;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
bool
|
||||
IsIdentity() const
|
||||
{
|
||||
return _11 == 1.f && _12 == 0.f && _13 == 0.f && _14 == 0.f
|
||||
&& _21 == 0.f && _22 == 1.f && _23 == 0.f && _24 == 0.f
|
||||
&& _31 == 0.f && _32 == 0.f && _33 == 1.f && _34 == 0.f
|
||||
&& _41 == 0.f && _42 == 0.f && _43 == 0.f && _44 == 1.f;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
void
|
||||
SetProduct(const Matrix4x4F &a, const Matrix4x4F &b)
|
||||
{
|
||||
_11 = a._11 * b._11 + a._12 * b._21 + a._13 * b._31 + a._14 * b._41;
|
||||
_12 = a._11 * b._12 + a._12 * b._22 + a._13 * b._32 + a._14 * b._42;
|
||||
_13 = a._11 * b._13 + a._12 * b._23 + a._13 * b._33 + a._14 * b._43;
|
||||
_14 = a._11 * b._14 + a._12 * b._24 + a._13 * b._34 + a._14 * b._44;
|
||||
|
||||
_21 = a._21 * b._11 + a._22 * b._21 + a._23 * b._31 + a._24 * b._41;
|
||||
_22 = a._21 * b._12 + a._22 * b._22 + a._23 * b._32 + a._24 * b._42;
|
||||
_23 = a._21 * b._13 + a._22 * b._23 + a._23 * b._33 + a._24 * b._43;
|
||||
_24 = a._21 * b._14 + a._22 * b._24 + a._23 * b._34 + a._24 * b._44;
|
||||
|
||||
_31 = a._31 * b._11 + a._32 * b._21 + a._33 * b._31 + a._34 * b._41;
|
||||
_32 = a._31 * b._12 + a._32 * b._22 + a._33 * b._32 + a._34 * b._42;
|
||||
_33 = a._31 * b._13 + a._32 * b._23 + a._33 * b._33 + a._34 * b._43;
|
||||
_34 = a._31 * b._14 + a._32 * b._24 + a._33 * b._34 + a._34 * b._44;
|
||||
|
||||
_41 = a._41 * b._11 + a._42 * b._21 + a._43 * b._31 + a._44 * b._41;
|
||||
_42 = a._41 * b._12 + a._42 * b._22 + a._43 * b._32 + a._44 * b._42;
|
||||
_43 = a._41 * b._13 + a._42 * b._23 + a._43 * b._33 + a._44 * b._43;
|
||||
_44 = a._41 * b._14 + a._42 * b._24 + a._43 * b._34 + a._44 * b._44;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix4x4F
|
||||
operator*(const Matrix4x4F &matrix) const
|
||||
{
|
||||
Matrix4x4F result;
|
||||
|
||||
result.SetProduct(*this, matrix);
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Matrix5x4F : public D2D1_MATRIX_5X4_F
|
||||
{
|
||||
public:
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix5x4F(
|
||||
FLOAT m11, FLOAT m12, FLOAT m13, FLOAT m14,
|
||||
FLOAT m21, FLOAT m22, FLOAT m23, FLOAT m24,
|
||||
FLOAT m31, FLOAT m32, FLOAT m33, FLOAT m34,
|
||||
FLOAT m41, FLOAT m42, FLOAT m43, FLOAT m44,
|
||||
FLOAT m51, FLOAT m52, FLOAT m53, FLOAT m54
|
||||
)
|
||||
{
|
||||
_11 = m11;
|
||||
_12 = m12;
|
||||
_13 = m13;
|
||||
_14 = m14;
|
||||
|
||||
_21 = m21;
|
||||
_22 = m22;
|
||||
_23 = m23;
|
||||
_24 = m24;
|
||||
|
||||
_31 = m31;
|
||||
_32 = m32;
|
||||
_33 = m33;
|
||||
_34 = m34;
|
||||
|
||||
_41 = m41;
|
||||
_42 = m42;
|
||||
_43 = m43;
|
||||
_44 = m44;
|
||||
|
||||
_51 = m51;
|
||||
_52 = m52;
|
||||
_53 = m53;
|
||||
_54 = m54;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
Matrix5x4F()
|
||||
{
|
||||
_11 = 1;
|
||||
_12 = 0;
|
||||
_13 = 0;
|
||||
_14 = 0;
|
||||
|
||||
_21 = 0;
|
||||
_22 = 1;
|
||||
_23 = 0;
|
||||
_24 = 0;
|
||||
|
||||
_31 = 0;
|
||||
_32 = 0;
|
||||
_33 = 1;
|
||||
_34 = 0;
|
||||
|
||||
_41 = 0;
|
||||
_42 = 0;
|
||||
_43 = 0;
|
||||
_44 = 1;
|
||||
|
||||
_51 = 0;
|
||||
_52 = 0;
|
||||
_53 = 0;
|
||||
_54 = 0;
|
||||
}
|
||||
};
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
inline
|
||||
D2D1_COLOR_F
|
||||
ConvertColorSpace(
|
||||
D2D1_COLOR_SPACE sourceColorSpace,
|
||||
D2D1_COLOR_SPACE destinationColorSpace,
|
||||
const D2D1_COLOR_F& color
|
||||
)
|
||||
{
|
||||
return D2D1ConvertColorSpace(
|
||||
sourceColorSpace,
|
||||
destinationColorSpace,
|
||||
&color
|
||||
);
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_DRAWING_STATE_DESCRIPTION1
|
||||
DrawingStateDescription1(
|
||||
D2D1_ANTIALIAS_MODE antialiasMode = D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
|
||||
D2D1_TEXT_ANTIALIAS_MODE textAntialiasMode = D2D1_TEXT_ANTIALIAS_MODE_DEFAULT,
|
||||
D2D1_TAG tag1 = 0,
|
||||
D2D1_TAG tag2 = 0,
|
||||
_In_ const D2D1_MATRIX_3X2_F &transform = D2D1::IdentityMatrix(),
|
||||
D2D1_PRIMITIVE_BLEND primitiveBlend = D2D1_PRIMITIVE_BLEND_SOURCE_OVER,
|
||||
D2D1_UNIT_MODE unitMode = D2D1_UNIT_MODE_DIPS
|
||||
)
|
||||
{
|
||||
D2D1_DRAWING_STATE_DESCRIPTION1 drawingStateDescription1;
|
||||
|
||||
drawingStateDescription1.antialiasMode = antialiasMode;
|
||||
drawingStateDescription1.textAntialiasMode = textAntialiasMode;
|
||||
drawingStateDescription1.tag1 = tag1;
|
||||
drawingStateDescription1.tag2 = tag2;
|
||||
drawingStateDescription1.transform = transform;
|
||||
drawingStateDescription1.primitiveBlend = primitiveBlend;
|
||||
drawingStateDescription1.unitMode = unitMode;
|
||||
|
||||
return drawingStateDescription1;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_DRAWING_STATE_DESCRIPTION1
|
||||
DrawingStateDescription1(
|
||||
_In_ const D2D1_DRAWING_STATE_DESCRIPTION &desc,
|
||||
D2D1_PRIMITIVE_BLEND primitiveBlend = D2D1_PRIMITIVE_BLEND_SOURCE_OVER,
|
||||
D2D1_UNIT_MODE unitMode = D2D1_UNIT_MODE_DIPS
|
||||
)
|
||||
{
|
||||
D2D1_DRAWING_STATE_DESCRIPTION1 drawingStateDescription1;
|
||||
|
||||
drawingStateDescription1.antialiasMode = desc.antialiasMode;
|
||||
drawingStateDescription1.textAntialiasMode = desc.textAntialiasMode;
|
||||
drawingStateDescription1.tag1 = desc.tag1;
|
||||
drawingStateDescription1.tag2 = desc.tag2;
|
||||
drawingStateDescription1.transform = desc.transform;
|
||||
drawingStateDescription1.primitiveBlend = primitiveBlend;
|
||||
drawingStateDescription1.unitMode = unitMode;
|
||||
|
||||
return drawingStateDescription1;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_BITMAP_PROPERTIES1
|
||||
BitmapProperties1(
|
||||
D2D1_BITMAP_OPTIONS bitmapOptions = D2D1_BITMAP_OPTIONS_NONE,
|
||||
_In_ CONST D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(),
|
||||
FLOAT dpiX = 96.0f,
|
||||
FLOAT dpiY = 96.0f,
|
||||
_In_opt_ ID2D1ColorContext *colorContext = NULL
|
||||
)
|
||||
{
|
||||
D2D1_BITMAP_PROPERTIES1 bitmapProperties =
|
||||
{
|
||||
pixelFormat,
|
||||
dpiX, dpiY,
|
||||
bitmapOptions,
|
||||
colorContext
|
||||
};
|
||||
|
||||
return bitmapProperties;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_LAYER_PARAMETERS1
|
||||
LayerParameters1(
|
||||
_In_ CONST D2D1_RECT_F &contentBounds = D2D1::InfiniteRect(),
|
||||
_In_opt_ ID2D1Geometry *geometricMask = NULL,
|
||||
D2D1_ANTIALIAS_MODE maskAntialiasMode = D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
|
||||
D2D1_MATRIX_3X2_F maskTransform = D2D1::IdentityMatrix(),
|
||||
FLOAT opacity = 1.0,
|
||||
_In_opt_ ID2D1Brush *opacityBrush = NULL,
|
||||
D2D1_LAYER_OPTIONS1 layerOptions = D2D1_LAYER_OPTIONS1_NONE
|
||||
)
|
||||
{
|
||||
D2D1_LAYER_PARAMETERS1 layerParameters = { 0 };
|
||||
|
||||
layerParameters.contentBounds = contentBounds;
|
||||
layerParameters.geometricMask = geometricMask;
|
||||
layerParameters.maskAntialiasMode = maskAntialiasMode;
|
||||
layerParameters.maskTransform = maskTransform;
|
||||
layerParameters.opacity = opacity;
|
||||
layerParameters.opacityBrush = opacityBrush;
|
||||
layerParameters.layerOptions = layerOptions;
|
||||
|
||||
return layerParameters;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_STROKE_STYLE_PROPERTIES1
|
||||
StrokeStyleProperties1(
|
||||
D2D1_CAP_STYLE startCap = D2D1_CAP_STYLE_FLAT,
|
||||
D2D1_CAP_STYLE endCap = D2D1_CAP_STYLE_FLAT,
|
||||
D2D1_CAP_STYLE dashCap = D2D1_CAP_STYLE_FLAT,
|
||||
D2D1_LINE_JOIN lineJoin = D2D1_LINE_JOIN_MITER,
|
||||
FLOAT miterLimit = 10.0f,
|
||||
D2D1_DASH_STYLE dashStyle = D2D1_DASH_STYLE_SOLID,
|
||||
FLOAT dashOffset = 0.0f,
|
||||
D2D1_STROKE_TRANSFORM_TYPE transformType = D2D1_STROKE_TRANSFORM_TYPE_NORMAL
|
||||
)
|
||||
{
|
||||
D2D1_STROKE_STYLE_PROPERTIES1 strokeStyleProperties;
|
||||
|
||||
strokeStyleProperties.startCap = startCap;
|
||||
strokeStyleProperties.endCap = endCap;
|
||||
strokeStyleProperties.dashCap = dashCap;
|
||||
strokeStyleProperties.lineJoin = lineJoin;
|
||||
strokeStyleProperties.miterLimit = miterLimit;
|
||||
strokeStyleProperties.dashStyle = dashStyle;
|
||||
strokeStyleProperties.dashOffset = dashOffset;
|
||||
strokeStyleProperties.transformType = transformType;
|
||||
|
||||
return strokeStyleProperties;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_IMAGE_BRUSH_PROPERTIES
|
||||
ImageBrushProperties(
|
||||
D2D1_RECT_F sourceRectangle,
|
||||
D2D1_EXTEND_MODE extendModeX = D2D1_EXTEND_MODE_CLAMP,
|
||||
D2D1_EXTEND_MODE extendModeY = D2D1_EXTEND_MODE_CLAMP,
|
||||
D2D1_INTERPOLATION_MODE interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR
|
||||
)
|
||||
{
|
||||
D2D1_IMAGE_BRUSH_PROPERTIES imageBrushProperties;
|
||||
|
||||
imageBrushProperties.extendModeX = extendModeX;
|
||||
imageBrushProperties.extendModeY = extendModeY;
|
||||
imageBrushProperties.interpolationMode = interpolationMode;
|
||||
imageBrushProperties.sourceRectangle = sourceRectangle;
|
||||
|
||||
return imageBrushProperties;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_BITMAP_BRUSH_PROPERTIES1
|
||||
BitmapBrushProperties1(
|
||||
D2D1_EXTEND_MODE extendModeX = D2D1_EXTEND_MODE_CLAMP,
|
||||
D2D1_EXTEND_MODE extendModeY = D2D1_EXTEND_MODE_CLAMP,
|
||||
D2D1_INTERPOLATION_MODE interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR
|
||||
)
|
||||
{
|
||||
D2D1_BITMAP_BRUSH_PROPERTIES1 bitmapBrush1Properties;
|
||||
|
||||
bitmapBrush1Properties.extendModeX = extendModeX;
|
||||
bitmapBrush1Properties.extendModeY = extendModeY;
|
||||
bitmapBrush1Properties.interpolationMode = interpolationMode;
|
||||
|
||||
return bitmapBrush1Properties;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_PRINT_CONTROL_PROPERTIES
|
||||
PrintControlProperties(
|
||||
D2D1_PRINT_FONT_SUBSET_MODE fontSubsetMode = D2D1_PRINT_FONT_SUBSET_MODE_DEFAULT,
|
||||
FLOAT rasterDpi = 150.0f,
|
||||
D2D1_COLOR_SPACE colorSpace = D2D1_COLOR_SPACE_SRGB
|
||||
)
|
||||
{
|
||||
D2D1_PRINT_CONTROL_PROPERTIES printControlProps;
|
||||
|
||||
printControlProps.fontSubset = fontSubsetMode;
|
||||
printControlProps.rasterDPI = rasterDpi;
|
||||
printControlProps.colorSpace = colorSpace;
|
||||
|
||||
return printControlProps;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_RENDERING_CONTROLS
|
||||
RenderingControls(
|
||||
D2D1_BUFFER_PRECISION bufferPrecision,
|
||||
D2D1_SIZE_U tileSize
|
||||
)
|
||||
{
|
||||
D2D1_RENDERING_CONTROLS renderingControls;
|
||||
|
||||
renderingControls.bufferPrecision = bufferPrecision;
|
||||
renderingControls.tileSize = tileSize;
|
||||
|
||||
return renderingControls;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_EFFECT_INPUT_DESCRIPTION
|
||||
EffectInputDescription(
|
||||
ID2D1Effect *effect,
|
||||
UINT32 inputIndex,
|
||||
D2D1_RECT_F inputRectangle
|
||||
)
|
||||
{
|
||||
D2D1_EFFECT_INPUT_DESCRIPTION description;
|
||||
|
||||
description.effect = effect;
|
||||
description.inputIndex = inputIndex;
|
||||
description.inputRectangle = inputRectangle;
|
||||
|
||||
return description;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_CREATION_PROPERTIES
|
||||
CreationProperties(
|
||||
D2D1_THREADING_MODE threadingMode,
|
||||
D2D1_DEBUG_LEVEL debugLevel,
|
||||
D2D1_DEVICE_CONTEXT_OPTIONS options
|
||||
)
|
||||
{
|
||||
D2D1_CREATION_PROPERTIES creationProperties;
|
||||
|
||||
creationProperties.threadingMode = threadingMode;
|
||||
creationProperties.debugLevel = debugLevel;
|
||||
creationProperties.options = options;
|
||||
|
||||
return creationProperties;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_VECTOR_2F
|
||||
Vector2F(
|
||||
FLOAT x = 0.0f,
|
||||
FLOAT y = 0.0f
|
||||
)
|
||||
{
|
||||
D2D1_VECTOR_2F vec2 = {x, y};
|
||||
return vec2;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_VECTOR_3F
|
||||
Vector3F(
|
||||
FLOAT x = 0.0f,
|
||||
FLOAT y = 0.0f,
|
||||
FLOAT z = 0.0f
|
||||
)
|
||||
{
|
||||
D2D1_VECTOR_3F vec3 = {x, y, z};
|
||||
return vec3;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_VECTOR_4F
|
||||
Vector4F(
|
||||
FLOAT x = 0.0f,
|
||||
FLOAT y = 0.0f,
|
||||
FLOAT z = 0.0f,
|
||||
FLOAT w = 0.0f
|
||||
)
|
||||
{
|
||||
D2D1_VECTOR_4F vec4 = {x, y, z, w};
|
||||
return vec4;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_POINT_2L
|
||||
Point2L(
|
||||
INT32 x = 0,
|
||||
INT32 y = 0
|
||||
)
|
||||
{
|
||||
return Point2<INT32>(x, y);
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_RECT_L
|
||||
RectL(
|
||||
INT32 left = 0.f,
|
||||
INT32 top = 0.f,
|
||||
INT32 right = 0.f,
|
||||
INT32 bottom = 0.f
|
||||
)
|
||||
{
|
||||
return Rect<INT32>(left, top, right, bottom);
|
||||
}
|
||||
|
||||
//
|
||||
// Sets a bitmap as an effect input, while inserting a DPI compensation effect
|
||||
// to preserve visual appearance as the device context's DPI changes.
|
||||
//
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
HRESULT
|
||||
SetDpiCompensatedEffectInput(
|
||||
_In_ ID2D1DeviceContext *deviceContext,
|
||||
_In_ ID2D1Effect *effect,
|
||||
UINT32 inputIndex,
|
||||
_In_opt_ ID2D1Bitmap *inputBitmap,
|
||||
D2D1_INTERPOLATION_MODE interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR,
|
||||
D2D1_BORDER_MODE borderMode = D2D1_BORDER_MODE_HARD
|
||||
)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
ID2D1Effect *dpiCompensationEffect = NULL;
|
||||
|
||||
if (!inputBitmap)
|
||||
{
|
||||
effect->SetInput(inputIndex, NULL);
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = deviceContext->CreateEffect(CLSID_D2D1DpiCompensation, &dpiCompensationEffect);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
dpiCompensationEffect->SetInput(0, inputBitmap);
|
||||
|
||||
D2D1_POINT_2F bitmapDpi;
|
||||
inputBitmap->GetDpi(&bitmapDpi.x, &bitmapDpi.y);
|
||||
hr = dpiCompensationEffect->SetValue(D2D1_DPICOMPENSATION_PROP_INPUT_DPI, bitmapDpi);
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = dpiCompensationEffect->SetValue(D2D1_DPICOMPENSATION_PROP_INTERPOLATION_MODE, interpolationMode);
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = dpiCompensationEffect->SetValue(D2D1_DPICOMPENSATION_PROP_BORDER_MODE, borderMode);
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
effect->SetInputEffect(inputIndex, dpiCompensationEffect);
|
||||
}
|
||||
|
||||
if (dpiCompensationEffect)
|
||||
{
|
||||
dpiCompensationEffect->Release();
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
} // namespace D2D1
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
|
||||
#endif // #ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
#endif // #ifndef _D2D1_HELPER_H_
|
||||
|
||||
Vendored
+809
@@ -0,0 +1,809 @@
|
||||
//---------------------------------------------------------------------------
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// This file is automatically generated. Please do not edit it directly.
|
||||
//
|
||||
// File name: D2D1_2.h
|
||||
//---------------------------------------------------------------------------
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif // #ifdef _MSC_VER
|
||||
|
||||
#ifndef _D2D1_2_H_
|
||||
#define _D2D1_2_H_
|
||||
|
||||
#ifndef _D2D1_1_H_
|
||||
#include <d2d1_1.h>
|
||||
#endif // #ifndef _D2D1_1_H_
|
||||
#ifndef _D2D1_EFFECTS_1_
|
||||
#include <d2d1effects_1.h>
|
||||
#endif // #ifndef _D2D1_EFFECTS_1_
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
#pragma region Application Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
#ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
interface ID2D1Device1;
|
||||
#else
|
||||
|
||||
typedef interface ID2D1Device1 ID2D1Device1;
|
||||
|
||||
#endif
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_RENDERING_PRIORITY
|
||||
//
|
||||
// Synopsis:
|
||||
// Specifies the extent to which D2D will throttle work sent to the GPU.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_RENDERING_PRIORITY
|
||||
{
|
||||
D2D1_RENDERING_PRIORITY_NORMAL = 0,
|
||||
D2D1_RENDERING_PRIORITY_LOW = 1,
|
||||
D2D1_RENDERING_PRIORITY_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_RENDERING_PRIORITY;
|
||||
|
||||
|
||||
#ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Interface:
|
||||
// ID2D1GeometryRealization
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
interface DX_DECLARE_INTERFACE("a16907d7-bc02-4801-99e8-8cf7f485f774") ID2D1GeometryRealization : public ID2D1Resource
|
||||
{
|
||||
}; // interface ID2D1GeometryRealization
|
||||
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Interface:
|
||||
// ID2D1DeviceContext1
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
interface DX_DECLARE_INTERFACE("d37f57e4-6908-459f-a199-e72f24f79987") ID2D1DeviceContext1 : public ID2D1DeviceContext
|
||||
{
|
||||
|
||||
STDMETHOD(CreateFilledGeometryRealization)(
|
||||
_In_ ID2D1Geometry *geometry,
|
||||
FLOAT flatteningTolerance,
|
||||
_Outptr_ ID2D1GeometryRealization **geometryRealization
|
||||
) PURE;
|
||||
|
||||
STDMETHOD(CreateStrokedGeometryRealization)(
|
||||
_In_ ID2D1Geometry *geometry,
|
||||
FLOAT flatteningTolerance,
|
||||
FLOAT strokeWidth,
|
||||
_In_opt_ ID2D1StrokeStyle *strokeStyle,
|
||||
_Outptr_ ID2D1GeometryRealization **geometryRealization
|
||||
) PURE;
|
||||
|
||||
STDMETHOD_(void, DrawGeometryRealization)(
|
||||
_In_ ID2D1GeometryRealization *geometryRealization,
|
||||
_In_ ID2D1Brush *brush
|
||||
) PURE;
|
||||
}; // interface ID2D1DeviceContext1
|
||||
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Interface:
|
||||
// ID2D1Device1
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
interface DX_DECLARE_INTERFACE("d21768e1-23a4-4823-a14b-7c3eba85d658") ID2D1Device1 : public ID2D1Device
|
||||
{
|
||||
|
||||
|
||||
//
|
||||
// Retrieves the rendering priority currently set on the device.
|
||||
//
|
||||
STDMETHOD_(D2D1_RENDERING_PRIORITY, GetRenderingPriority)(
|
||||
) PURE;
|
||||
|
||||
|
||||
//
|
||||
// Sets the rendering priority of the device.
|
||||
//
|
||||
STDMETHOD_(void, SetRenderingPriority)(
|
||||
D2D1_RENDERING_PRIORITY renderingPriority
|
||||
) PURE;
|
||||
|
||||
|
||||
//
|
||||
// Creates a new device context with no initially assigned target.
|
||||
//
|
||||
STDMETHOD(CreateDeviceContext)(
|
||||
D2D1_DEVICE_CONTEXT_OPTIONS options,
|
||||
_Outptr_ ID2D1DeviceContext1 **deviceContext1
|
||||
) PURE;
|
||||
|
||||
using ID2D1Device::CreateDeviceContext;
|
||||
}; // interface ID2D1Device1
|
||||
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Interface:
|
||||
// ID2D1Factory2
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
interface DX_DECLARE_INTERFACE("94f81a73-9212-4376-9c58-b16a3a0d3992") ID2D1Factory2 : public ID2D1Factory1
|
||||
{
|
||||
|
||||
|
||||
//
|
||||
// This creates a new Direct2D device from the given IDXGIDevice.
|
||||
//
|
||||
STDMETHOD(CreateDevice)(
|
||||
_In_ IDXGIDevice *dxgiDevice,
|
||||
_Outptr_ ID2D1Device1 **d2dDevice1
|
||||
) PURE;
|
||||
|
||||
using ID2D1Factory1::CreateDevice;
|
||||
}; // interface ID2D1Factory2
|
||||
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Interface:
|
||||
// ID2D1CommandSink1
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
interface DX_DECLARE_INTERFACE("9eb767fd-4269-4467-b8c2-eb30cb305743") ID2D1CommandSink1 : public ID2D1CommandSink
|
||||
{
|
||||
|
||||
|
||||
//
|
||||
// This method is called if primitiveBlend value was added after Windows 8.
|
||||
// SetPrimitiveBlend method is used for Win8 values (_SOURCE_OVER and _COPY).
|
||||
//
|
||||
STDMETHOD(SetPrimitiveBlend1)(
|
||||
D2D1_PRIMITIVE_BLEND primitiveBlend
|
||||
) PURE;
|
||||
}; // interface ID2D1CommandSink1
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
EXTERN_C CONST IID IID_ID2D1GeometryRealization;
|
||||
EXTERN_C CONST IID IID_ID2D1DeviceContext1;
|
||||
EXTERN_C CONST IID IID_ID2D1Device1;
|
||||
EXTERN_C CONST IID IID_ID2D1Factory2;
|
||||
EXTERN_C CONST IID IID_ID2D1CommandSink1;
|
||||
|
||||
|
||||
#ifdef D2D_USE_C_DEFINITIONS
|
||||
|
||||
|
||||
typedef interface ID2D1GeometryRealization ID2D1GeometryRealization;
|
||||
|
||||
typedef struct ID2D1GeometryRealizationVtbl
|
||||
{
|
||||
|
||||
ID2D1ResourceVtbl Base;
|
||||
|
||||
} ID2D1GeometryRealizationVtbl;
|
||||
|
||||
interface ID2D1GeometryRealization
|
||||
{
|
||||
CONST struct ID2D1GeometryRealizationVtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
#define ID2D1GeometryRealization_QueryInterface(This, riid, ppv) \
|
||||
((This)->lpVtbl->Base.Base.QueryInterface((IUnknown *)This, riid, ppv))
|
||||
|
||||
#define ID2D1GeometryRealization_AddRef(This) \
|
||||
((This)->lpVtbl->Base.Base.AddRef((IUnknown *)This))
|
||||
|
||||
#define ID2D1GeometryRealization_Release(This) \
|
||||
((This)->lpVtbl->Base.Base.Release((IUnknown *)This))
|
||||
|
||||
#define ID2D1GeometryRealization_GetFactory(This, factory) \
|
||||
((This)->lpVtbl->Base.GetFactory((ID2D1Resource *)This, factory))
|
||||
|
||||
typedef interface ID2D1DeviceContext1 ID2D1DeviceContext1;
|
||||
|
||||
typedef struct ID2D1DeviceContext1Vtbl
|
||||
{
|
||||
|
||||
ID2D1DeviceContextVtbl Base;
|
||||
|
||||
|
||||
STDMETHOD(CreateFilledGeometryRealization)(
|
||||
ID2D1DeviceContext1 *This,
|
||||
_In_ ID2D1Geometry *geometry,
|
||||
FLOAT flatteningTolerance,
|
||||
_Outptr_ ID2D1GeometryRealization **geometryRealization
|
||||
) PURE;
|
||||
|
||||
STDMETHOD(CreateStrokedGeometryRealization)(
|
||||
ID2D1DeviceContext1 *This,
|
||||
_In_ ID2D1Geometry *geometry,
|
||||
FLOAT flatteningTolerance,
|
||||
FLOAT strokeWidth,
|
||||
_In_opt_ ID2D1StrokeStyle *strokeStyle,
|
||||
_Outptr_ ID2D1GeometryRealization **geometryRealization
|
||||
) PURE;
|
||||
|
||||
STDMETHOD_(void, DrawGeometryRealization)(
|
||||
ID2D1DeviceContext1 *This,
|
||||
_In_ ID2D1GeometryRealization *geometryRealization,
|
||||
_In_ ID2D1Brush *brush
|
||||
) PURE;
|
||||
} ID2D1DeviceContext1Vtbl;
|
||||
|
||||
interface ID2D1DeviceContext1
|
||||
{
|
||||
CONST struct ID2D1DeviceContext1Vtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
#define ID2D1DeviceContext1_QueryInterface(This, riid, ppv) \
|
||||
((This)->lpVtbl->Base.Base.Base.Base.QueryInterface((IUnknown *)This, riid, ppv))
|
||||
|
||||
#define ID2D1DeviceContext1_AddRef(This) \
|
||||
((This)->lpVtbl->Base.Base.Base.Base.AddRef((IUnknown *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_Release(This) \
|
||||
((This)->lpVtbl->Base.Base.Base.Base.Release((IUnknown *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_GetFactory(This, factory) \
|
||||
((This)->lpVtbl->Base.Base.Base.GetFactory((ID2D1Resource *)This, factory))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateSharedBitmap(This, riid, data, bitmapProperties, bitmap) \
|
||||
((This)->lpVtbl->Base.Base.CreateSharedBitmap((ID2D1RenderTarget *)This, riid, data, bitmapProperties, bitmap))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateSolidColorBrush(This, color, brushProperties, solidColorBrush) \
|
||||
((This)->lpVtbl->Base.Base.CreateSolidColorBrush((ID2D1RenderTarget *)This, color, brushProperties, solidColorBrush))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateLinearGradientBrush(This, linearGradientBrushProperties, brushProperties, gradientStopCollection, linearGradientBrush) \
|
||||
((This)->lpVtbl->Base.Base.CreateLinearGradientBrush((ID2D1RenderTarget *)This, linearGradientBrushProperties, brushProperties, gradientStopCollection, linearGradientBrush))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateRadialGradientBrush(This, radialGradientBrushProperties, brushProperties, gradientStopCollection, radialGradientBrush) \
|
||||
((This)->lpVtbl->Base.Base.CreateRadialGradientBrush((ID2D1RenderTarget *)This, radialGradientBrushProperties, brushProperties, gradientStopCollection, radialGradientBrush))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateCompatibleRenderTarget(This, desiredSize, desiredPixelSize, desiredFormat, options, bitmapRenderTarget) \
|
||||
((This)->lpVtbl->Base.Base.CreateCompatibleRenderTarget((ID2D1RenderTarget *)This, desiredSize, desiredPixelSize, desiredFormat, options, bitmapRenderTarget))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateLayer(This, size, layer) \
|
||||
((This)->lpVtbl->Base.Base.CreateLayer((ID2D1RenderTarget *)This, size, layer))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateMesh(This, mesh) \
|
||||
((This)->lpVtbl->Base.Base.CreateMesh((ID2D1RenderTarget *)This, mesh))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawLine(This, point0, point1, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.Base.DrawLine((ID2D1RenderTarget *)This, point0, point1, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawRectangle(This, rect, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.Base.DrawRectangle((ID2D1RenderTarget *)This, rect, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1DeviceContext1_FillRectangle(This, rect, brush) \
|
||||
((This)->lpVtbl->Base.Base.FillRectangle((ID2D1RenderTarget *)This, rect, brush))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawRoundedRectangle(This, roundedRect, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.Base.DrawRoundedRectangle((ID2D1RenderTarget *)This, roundedRect, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1DeviceContext1_FillRoundedRectangle(This, roundedRect, brush) \
|
||||
((This)->lpVtbl->Base.Base.FillRoundedRectangle((ID2D1RenderTarget *)This, roundedRect, brush))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawEllipse(This, ellipse, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.Base.DrawEllipse((ID2D1RenderTarget *)This, ellipse, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1DeviceContext1_FillEllipse(This, ellipse, brush) \
|
||||
((This)->lpVtbl->Base.Base.FillEllipse((ID2D1RenderTarget *)This, ellipse, brush))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawGeometry(This, geometry, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.Base.DrawGeometry((ID2D1RenderTarget *)This, geometry, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1DeviceContext1_FillGeometry(This, geometry, brush, opacityBrush) \
|
||||
((This)->lpVtbl->Base.Base.FillGeometry((ID2D1RenderTarget *)This, geometry, brush, opacityBrush))
|
||||
|
||||
#define ID2D1DeviceContext1_FillMesh(This, mesh, brush) \
|
||||
((This)->lpVtbl->Base.Base.FillMesh((ID2D1RenderTarget *)This, mesh, brush))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawText(This, string, stringLength, textFormat, layoutRect, defaultForegroundBrush, options, measuringMode) \
|
||||
((This)->lpVtbl->Base.Base.DrawText((ID2D1RenderTarget *)This, string, stringLength, textFormat, layoutRect, defaultForegroundBrush, options, measuringMode))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawTextLayout(This, origin, textLayout, defaultForegroundBrush, options) \
|
||||
((This)->lpVtbl->Base.Base.DrawTextLayout((ID2D1RenderTarget *)This, origin, textLayout, defaultForegroundBrush, options))
|
||||
|
||||
#define ID2D1DeviceContext1_SetTransform(This, transform) \
|
||||
((This)->lpVtbl->Base.Base.SetTransform((ID2D1RenderTarget *)This, transform))
|
||||
|
||||
#define ID2D1DeviceContext1_GetTransform(This, transform) \
|
||||
((This)->lpVtbl->Base.Base.GetTransform((ID2D1RenderTarget *)This, transform))
|
||||
|
||||
#define ID2D1DeviceContext1_SetAntialiasMode(This, antialiasMode) \
|
||||
((This)->lpVtbl->Base.Base.SetAntialiasMode((ID2D1RenderTarget *)This, antialiasMode))
|
||||
|
||||
#define ID2D1DeviceContext1_GetAntialiasMode(This) \
|
||||
((This)->lpVtbl->Base.Base.GetAntialiasMode((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_SetTextAntialiasMode(This, textAntialiasMode) \
|
||||
((This)->lpVtbl->Base.Base.SetTextAntialiasMode((ID2D1RenderTarget *)This, textAntialiasMode))
|
||||
|
||||
#define ID2D1DeviceContext1_GetTextAntialiasMode(This) \
|
||||
((This)->lpVtbl->Base.Base.GetTextAntialiasMode((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_SetTextRenderingParams(This, textRenderingParams) \
|
||||
((This)->lpVtbl->Base.Base.SetTextRenderingParams((ID2D1RenderTarget *)This, textRenderingParams))
|
||||
|
||||
#define ID2D1DeviceContext1_GetTextRenderingParams(This, textRenderingParams) \
|
||||
((This)->lpVtbl->Base.Base.GetTextRenderingParams((ID2D1RenderTarget *)This, textRenderingParams))
|
||||
|
||||
#define ID2D1DeviceContext1_SetTags(This, tag1, tag2) \
|
||||
((This)->lpVtbl->Base.Base.SetTags((ID2D1RenderTarget *)This, tag1, tag2))
|
||||
|
||||
#define ID2D1DeviceContext1_GetTags(This, tag1, tag2) \
|
||||
((This)->lpVtbl->Base.Base.GetTags((ID2D1RenderTarget *)This, tag1, tag2))
|
||||
|
||||
#define ID2D1DeviceContext1_PopLayer(This) \
|
||||
((This)->lpVtbl->Base.Base.PopLayer((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_Flush(This, tag1, tag2) \
|
||||
((This)->lpVtbl->Base.Base.Flush((ID2D1RenderTarget *)This, tag1, tag2))
|
||||
|
||||
#define ID2D1DeviceContext1_SaveDrawingState(This, drawingStateBlock) \
|
||||
((This)->lpVtbl->Base.Base.SaveDrawingState((ID2D1RenderTarget *)This, drawingStateBlock))
|
||||
|
||||
#define ID2D1DeviceContext1_RestoreDrawingState(This, drawingStateBlock) \
|
||||
((This)->lpVtbl->Base.Base.RestoreDrawingState((ID2D1RenderTarget *)This, drawingStateBlock))
|
||||
|
||||
#define ID2D1DeviceContext1_PushAxisAlignedClip(This, clipRect, antialiasMode) \
|
||||
((This)->lpVtbl->Base.Base.PushAxisAlignedClip((ID2D1RenderTarget *)This, clipRect, antialiasMode))
|
||||
|
||||
#define ID2D1DeviceContext1_PopAxisAlignedClip(This) \
|
||||
((This)->lpVtbl->Base.Base.PopAxisAlignedClip((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_Clear(This, clearColor) \
|
||||
((This)->lpVtbl->Base.Base.Clear((ID2D1RenderTarget *)This, clearColor))
|
||||
|
||||
#define ID2D1DeviceContext1_BeginDraw(This) \
|
||||
((This)->lpVtbl->Base.Base.BeginDraw((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_EndDraw(This, tag1, tag2) \
|
||||
((This)->lpVtbl->Base.Base.EndDraw((ID2D1RenderTarget *)This, tag1, tag2))
|
||||
|
||||
#define ID2D1DeviceContext1_GetPixelFormat(This) \
|
||||
((This)->lpVtbl->Base.Base.GetPixelFormat((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_SetDpi(This, dpiX, dpiY) \
|
||||
((This)->lpVtbl->Base.Base.SetDpi((ID2D1RenderTarget *)This, dpiX, dpiY))
|
||||
|
||||
#define ID2D1DeviceContext1_GetDpi(This, dpiX, dpiY) \
|
||||
((This)->lpVtbl->Base.Base.GetDpi((ID2D1RenderTarget *)This, dpiX, dpiY))
|
||||
|
||||
#define ID2D1DeviceContext1_GetSize(This) \
|
||||
((This)->lpVtbl->Base.Base.GetSize((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_GetPixelSize(This) \
|
||||
((This)->lpVtbl->Base.Base.GetPixelSize((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_GetMaximumBitmapSize(This) \
|
||||
((This)->lpVtbl->Base.Base.GetMaximumBitmapSize((ID2D1RenderTarget *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_IsSupported(This, renderTargetProperties) \
|
||||
((This)->lpVtbl->Base.Base.IsSupported((ID2D1RenderTarget *)This, renderTargetProperties))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateBitmap(This, size, sourceData, pitch, bitmapProperties, bitmap) \
|
||||
((This)->lpVtbl->Base.CreateBitmap((ID2D1DeviceContext *)This, size, sourceData, pitch, bitmapProperties, bitmap))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateBitmapFromWicBitmap(This, wicBitmapSource, bitmapProperties, bitmap) \
|
||||
((This)->lpVtbl->Base.CreateBitmapFromWicBitmap((ID2D1DeviceContext *)This, wicBitmapSource, bitmapProperties, bitmap))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateColorContext(This, space, profile, profileSize, colorContext) \
|
||||
((This)->lpVtbl->Base.CreateColorContext((ID2D1DeviceContext *)This, space, profile, profileSize, colorContext))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateColorContextFromFilename(This, filename, colorContext) \
|
||||
((This)->lpVtbl->Base.CreateColorContextFromFilename((ID2D1DeviceContext *)This, filename, colorContext))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateColorContextFromWicColorContext(This, wicColorContext, colorContext) \
|
||||
((This)->lpVtbl->Base.CreateColorContextFromWicColorContext((ID2D1DeviceContext *)This, wicColorContext, colorContext))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateBitmapFromDxgiSurface(This, surface, bitmapProperties, bitmap) \
|
||||
((This)->lpVtbl->Base.CreateBitmapFromDxgiSurface((ID2D1DeviceContext *)This, surface, bitmapProperties, bitmap))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateEffect(This, effectId, effect) \
|
||||
((This)->lpVtbl->Base.CreateEffect((ID2D1DeviceContext *)This, effectId, effect))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateGradientStopCollection(This, straightAlphaGradientStops, straightAlphaGradientStopsCount, preInterpolationSpace, postInterpolationSpace, bufferPrecision, extendMode, colorInterpolationMode, gradientStopCollection1) \
|
||||
((This)->lpVtbl->Base.CreateGradientStopCollection((ID2D1DeviceContext *)This, straightAlphaGradientStops, straightAlphaGradientStopsCount, preInterpolationSpace, postInterpolationSpace, bufferPrecision, extendMode, colorInterpolationMode, gradientStopCollection1))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateImageBrush(This, image, imageBrushProperties, brushProperties, imageBrush) \
|
||||
((This)->lpVtbl->Base.CreateImageBrush((ID2D1DeviceContext *)This, image, imageBrushProperties, brushProperties, imageBrush))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateBitmapBrush(This, bitmap, bitmapBrushProperties, brushProperties, bitmapBrush) \
|
||||
((This)->lpVtbl->Base.CreateBitmapBrush((ID2D1DeviceContext *)This, bitmap, bitmapBrushProperties, brushProperties, bitmapBrush))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateCommandList(This, commandList) \
|
||||
((This)->lpVtbl->Base.CreateCommandList((ID2D1DeviceContext *)This, commandList))
|
||||
|
||||
#define ID2D1DeviceContext1_IsDxgiFormatSupported(This, format) \
|
||||
((This)->lpVtbl->Base.IsDxgiFormatSupported((ID2D1DeviceContext *)This, format))
|
||||
|
||||
#define ID2D1DeviceContext1_IsBufferPrecisionSupported(This, bufferPrecision) \
|
||||
((This)->lpVtbl->Base.IsBufferPrecisionSupported((ID2D1DeviceContext *)This, bufferPrecision))
|
||||
|
||||
#define ID2D1DeviceContext1_GetImageLocalBounds(This, image, localBounds) \
|
||||
((This)->lpVtbl->Base.GetImageLocalBounds((ID2D1DeviceContext *)This, image, localBounds))
|
||||
|
||||
#define ID2D1DeviceContext1_GetImageWorldBounds(This, image, worldBounds) \
|
||||
((This)->lpVtbl->Base.GetImageWorldBounds((ID2D1DeviceContext *)This, image, worldBounds))
|
||||
|
||||
#define ID2D1DeviceContext1_GetGlyphRunWorldBounds(This, baselineOrigin, glyphRun, measuringMode, bounds) \
|
||||
((This)->lpVtbl->Base.GetGlyphRunWorldBounds((ID2D1DeviceContext *)This, baselineOrigin, glyphRun, measuringMode, bounds))
|
||||
|
||||
#define ID2D1DeviceContext1_GetDevice(This, device) \
|
||||
((This)->lpVtbl->Base.GetDevice((ID2D1DeviceContext *)This, device))
|
||||
|
||||
#define ID2D1DeviceContext1_SetTarget(This, image) \
|
||||
((This)->lpVtbl->Base.SetTarget((ID2D1DeviceContext *)This, image))
|
||||
|
||||
#define ID2D1DeviceContext1_GetTarget(This, image) \
|
||||
((This)->lpVtbl->Base.GetTarget((ID2D1DeviceContext *)This, image))
|
||||
|
||||
#define ID2D1DeviceContext1_SetRenderingControls(This, renderingControls) \
|
||||
((This)->lpVtbl->Base.SetRenderingControls((ID2D1DeviceContext *)This, renderingControls))
|
||||
|
||||
#define ID2D1DeviceContext1_GetRenderingControls(This, renderingControls) \
|
||||
((This)->lpVtbl->Base.GetRenderingControls((ID2D1DeviceContext *)This, renderingControls))
|
||||
|
||||
#define ID2D1DeviceContext1_SetPrimitiveBlend(This, primitiveBlend) \
|
||||
((This)->lpVtbl->Base.SetPrimitiveBlend((ID2D1DeviceContext *)This, primitiveBlend))
|
||||
|
||||
#define ID2D1DeviceContext1_GetPrimitiveBlend(This) \
|
||||
((This)->lpVtbl->Base.GetPrimitiveBlend((ID2D1DeviceContext *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_SetUnitMode(This, unitMode) \
|
||||
((This)->lpVtbl->Base.SetUnitMode((ID2D1DeviceContext *)This, unitMode))
|
||||
|
||||
#define ID2D1DeviceContext1_GetUnitMode(This) \
|
||||
((This)->lpVtbl->Base.GetUnitMode((ID2D1DeviceContext *)This))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawGlyphRun(This, baselineOrigin, glyphRun, glyphRunDescription, foregroundBrush, measuringMode) \
|
||||
((This)->lpVtbl->Base.DrawGlyphRun((ID2D1DeviceContext *)This, baselineOrigin, glyphRun, glyphRunDescription, foregroundBrush, measuringMode))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawImage(This, image, targetOffset, imageRectangle, interpolationMode, compositeMode) \
|
||||
((This)->lpVtbl->Base.DrawImage((ID2D1DeviceContext *)This, image, targetOffset, imageRectangle, interpolationMode, compositeMode))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawGdiMetafile(This, gdiMetafile, targetOffset) \
|
||||
((This)->lpVtbl->Base.DrawGdiMetafile((ID2D1DeviceContext *)This, gdiMetafile, targetOffset))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawBitmap(This, bitmap, destinationRectangle, opacity, interpolationMode, sourceRectangle, perspectiveTransform) \
|
||||
((This)->lpVtbl->Base.DrawBitmap((ID2D1DeviceContext *)This, bitmap, destinationRectangle, opacity, interpolationMode, sourceRectangle, perspectiveTransform))
|
||||
|
||||
#define ID2D1DeviceContext1_PushLayer(This, layerParameters, layer) \
|
||||
((This)->lpVtbl->Base.PushLayer((ID2D1DeviceContext *)This, layerParameters, layer))
|
||||
|
||||
#define ID2D1DeviceContext1_InvalidateEffectInputRectangle(This, effect, input, inputRectangle) \
|
||||
((This)->lpVtbl->Base.InvalidateEffectInputRectangle((ID2D1DeviceContext *)This, effect, input, inputRectangle))
|
||||
|
||||
#define ID2D1DeviceContext1_GetEffectInvalidRectangleCount(This, effect, rectangleCount) \
|
||||
((This)->lpVtbl->Base.GetEffectInvalidRectangleCount((ID2D1DeviceContext *)This, effect, rectangleCount))
|
||||
|
||||
#define ID2D1DeviceContext1_GetEffectInvalidRectangles(This, effect, rectangles, rectanglesCount) \
|
||||
((This)->lpVtbl->Base.GetEffectInvalidRectangles((ID2D1DeviceContext *)This, effect, rectangles, rectanglesCount))
|
||||
|
||||
#define ID2D1DeviceContext1_GetEffectRequiredInputRectangles(This, renderEffect, renderImageRectangle, inputDescriptions, requiredInputRects, inputCount) \
|
||||
((This)->lpVtbl->Base.GetEffectRequiredInputRectangles((ID2D1DeviceContext *)This, renderEffect, renderImageRectangle, inputDescriptions, requiredInputRects, inputCount))
|
||||
|
||||
#define ID2D1DeviceContext1_FillOpacityMask(This, opacityMask, brush, destinationRectangle, sourceRectangle) \
|
||||
((This)->lpVtbl->Base.FillOpacityMask((ID2D1DeviceContext *)This, opacityMask, brush, destinationRectangle, sourceRectangle))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateFilledGeometryRealization(This, geometry, flatteningTolerance, geometryRealization) \
|
||||
((This)->lpVtbl->CreateFilledGeometryRealization(This, geometry, flatteningTolerance, geometryRealization))
|
||||
|
||||
#define ID2D1DeviceContext1_CreateStrokedGeometryRealization(This, geometry, flatteningTolerance, strokeWidth, strokeStyle, geometryRealization) \
|
||||
((This)->lpVtbl->CreateStrokedGeometryRealization(This, geometry, flatteningTolerance, strokeWidth, strokeStyle, geometryRealization))
|
||||
|
||||
#define ID2D1DeviceContext1_DrawGeometryRealization(This, geometryRealization, brush) \
|
||||
((This)->lpVtbl->DrawGeometryRealization(This, geometryRealization, brush))
|
||||
|
||||
typedef interface ID2D1Device1 ID2D1Device1;
|
||||
|
||||
typedef struct ID2D1Device1Vtbl
|
||||
{
|
||||
|
||||
ID2D1DeviceVtbl Base;
|
||||
|
||||
|
||||
STDMETHOD_(D2D1_RENDERING_PRIORITY, GetRenderingPriority)(
|
||||
ID2D1Device1 *This
|
||||
) PURE;
|
||||
|
||||
STDMETHOD_(void, SetRenderingPriority)(
|
||||
ID2D1Device1 *This,
|
||||
D2D1_RENDERING_PRIORITY renderingPriority
|
||||
) PURE;
|
||||
|
||||
STDMETHOD(CreateDeviceContext)(
|
||||
ID2D1Device1 *This,
|
||||
D2D1_DEVICE_CONTEXT_OPTIONS options,
|
||||
_Outptr_ ID2D1DeviceContext1 **deviceContext1
|
||||
) PURE;
|
||||
} ID2D1Device1Vtbl;
|
||||
|
||||
interface ID2D1Device1
|
||||
{
|
||||
CONST struct ID2D1Device1Vtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
#define ID2D1Device1_QueryInterface(This, riid, ppv) \
|
||||
((This)->lpVtbl->Base.Base.Base.QueryInterface((IUnknown *)This, riid, ppv))
|
||||
|
||||
#define ID2D1Device1_AddRef(This) \
|
||||
((This)->lpVtbl->Base.Base.Base.AddRef((IUnknown *)This))
|
||||
|
||||
#define ID2D1Device1_Release(This) \
|
||||
((This)->lpVtbl->Base.Base.Base.Release((IUnknown *)This))
|
||||
|
||||
#define ID2D1Device1_GetFactory(This, factory) \
|
||||
((This)->lpVtbl->Base.Base.GetFactory((ID2D1Resource *)This, factory))
|
||||
|
||||
#define ID2D1Device1_CreatePrintControl(This, wicFactory, documentTarget, printControlProperties, printControl) \
|
||||
((This)->lpVtbl->Base.CreatePrintControl((ID2D1Device *)This, wicFactory, documentTarget, printControlProperties, printControl))
|
||||
|
||||
#define ID2D1Device1_SetMaximumTextureMemory(This, maximumInBytes) \
|
||||
((This)->lpVtbl->Base.SetMaximumTextureMemory((ID2D1Device *)This, maximumInBytes))
|
||||
|
||||
#define ID2D1Device1_GetMaximumTextureMemory(This) \
|
||||
((This)->lpVtbl->Base.GetMaximumTextureMemory((ID2D1Device *)This))
|
||||
|
||||
#define ID2D1Device1_ClearResources(This, millisecondsSinceUse) \
|
||||
((This)->lpVtbl->Base.ClearResources((ID2D1Device *)This, millisecondsSinceUse))
|
||||
|
||||
#define ID2D1Device1_GetRenderingPriority(This) \
|
||||
((This)->lpVtbl->GetRenderingPriority(This))
|
||||
|
||||
#define ID2D1Device1_SetRenderingPriority(This, renderingPriority) \
|
||||
((This)->lpVtbl->SetRenderingPriority(This, renderingPriority))
|
||||
|
||||
#define ID2D1Device1_CreateDeviceContext(This, options, deviceContext1) \
|
||||
((This)->lpVtbl->CreateDeviceContext(This, options, deviceContext1))
|
||||
|
||||
typedef interface ID2D1Factory2 ID2D1Factory2;
|
||||
|
||||
typedef struct ID2D1Factory2Vtbl
|
||||
{
|
||||
|
||||
ID2D1Factory1Vtbl Base;
|
||||
|
||||
|
||||
STDMETHOD(CreateDevice)(
|
||||
ID2D1Factory2 *This,
|
||||
_In_ IDXGIDevice *dxgiDevice,
|
||||
_Outptr_ ID2D1Device1 **d2dDevice1
|
||||
) PURE;
|
||||
} ID2D1Factory2Vtbl;
|
||||
|
||||
interface ID2D1Factory2
|
||||
{
|
||||
CONST struct ID2D1Factory2Vtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
#define ID2D1Factory2_QueryInterface(This, riid, ppv) \
|
||||
((This)->lpVtbl->Base.Base.Base.QueryInterface((IUnknown *)This, riid, ppv))
|
||||
|
||||
#define ID2D1Factory2_AddRef(This) \
|
||||
((This)->lpVtbl->Base.Base.Base.AddRef((IUnknown *)This))
|
||||
|
||||
#define ID2D1Factory2_Release(This) \
|
||||
((This)->lpVtbl->Base.Base.Base.Release((IUnknown *)This))
|
||||
|
||||
#define ID2D1Factory2_ReloadSystemMetrics(This) \
|
||||
((This)->lpVtbl->Base.Base.ReloadSystemMetrics((ID2D1Factory *)This))
|
||||
|
||||
#define ID2D1Factory2_GetDesktopDpi(This, dpiX, dpiY) \
|
||||
((This)->lpVtbl->Base.Base.GetDesktopDpi((ID2D1Factory *)This, dpiX, dpiY))
|
||||
|
||||
#define ID2D1Factory2_CreateRectangleGeometry(This, rectangle, rectangleGeometry) \
|
||||
((This)->lpVtbl->Base.Base.CreateRectangleGeometry((ID2D1Factory *)This, rectangle, rectangleGeometry))
|
||||
|
||||
#define ID2D1Factory2_CreateRoundedRectangleGeometry(This, roundedRectangle, roundedRectangleGeometry) \
|
||||
((This)->lpVtbl->Base.Base.CreateRoundedRectangleGeometry((ID2D1Factory *)This, roundedRectangle, roundedRectangleGeometry))
|
||||
|
||||
#define ID2D1Factory2_CreateEllipseGeometry(This, ellipse, ellipseGeometry) \
|
||||
((This)->lpVtbl->Base.Base.CreateEllipseGeometry((ID2D1Factory *)This, ellipse, ellipseGeometry))
|
||||
|
||||
#define ID2D1Factory2_CreateGeometryGroup(This, fillMode, geometries, geometriesCount, geometryGroup) \
|
||||
((This)->lpVtbl->Base.Base.CreateGeometryGroup((ID2D1Factory *)This, fillMode, geometries, geometriesCount, geometryGroup))
|
||||
|
||||
#define ID2D1Factory2_CreateTransformedGeometry(This, sourceGeometry, transform, transformedGeometry) \
|
||||
((This)->lpVtbl->Base.Base.CreateTransformedGeometry((ID2D1Factory *)This, sourceGeometry, transform, transformedGeometry))
|
||||
|
||||
#define ID2D1Factory2_CreateWicBitmapRenderTarget(This, target, renderTargetProperties, renderTarget) \
|
||||
((This)->lpVtbl->Base.Base.CreateWicBitmapRenderTarget((ID2D1Factory *)This, target, renderTargetProperties, renderTarget))
|
||||
|
||||
#define ID2D1Factory2_CreateHwndRenderTarget(This, renderTargetProperties, hwndRenderTargetProperties, hwndRenderTarget) \
|
||||
((This)->lpVtbl->Base.Base.CreateHwndRenderTarget((ID2D1Factory *)This, renderTargetProperties, hwndRenderTargetProperties, hwndRenderTarget))
|
||||
|
||||
#define ID2D1Factory2_CreateDxgiSurfaceRenderTarget(This, dxgiSurface, renderTargetProperties, renderTarget) \
|
||||
((This)->lpVtbl->Base.Base.CreateDxgiSurfaceRenderTarget((ID2D1Factory *)This, dxgiSurface, renderTargetProperties, renderTarget))
|
||||
|
||||
#define ID2D1Factory2_CreateDCRenderTarget(This, renderTargetProperties, dcRenderTarget) \
|
||||
((This)->lpVtbl->Base.Base.CreateDCRenderTarget((ID2D1Factory *)This, renderTargetProperties, dcRenderTarget))
|
||||
|
||||
#define ID2D1Factory2_CreateStrokeStyle(This, strokeStyleProperties, dashes, dashesCount, strokeStyle) \
|
||||
((This)->lpVtbl->Base.CreateStrokeStyle((ID2D1Factory1 *)This, strokeStyleProperties, dashes, dashesCount, strokeStyle))
|
||||
|
||||
#define ID2D1Factory2_CreatePathGeometry(This, pathGeometry) \
|
||||
((This)->lpVtbl->Base.CreatePathGeometry((ID2D1Factory1 *)This, pathGeometry))
|
||||
|
||||
#define ID2D1Factory2_CreateDrawingStateBlock(This, drawingStateDescription, textRenderingParams, drawingStateBlock) \
|
||||
((This)->lpVtbl->Base.CreateDrawingStateBlock((ID2D1Factory1 *)This, drawingStateDescription, textRenderingParams, drawingStateBlock))
|
||||
|
||||
#define ID2D1Factory2_CreateGdiMetafile(This, metafileStream, metafile) \
|
||||
((This)->lpVtbl->Base.CreateGdiMetafile((ID2D1Factory1 *)This, metafileStream, metafile))
|
||||
|
||||
#define ID2D1Factory2_RegisterEffectFromStream(This, classId, propertyXml, bindings, bindingsCount, effectFactory) \
|
||||
((This)->lpVtbl->Base.RegisterEffectFromStream((ID2D1Factory1 *)This, classId, propertyXml, bindings, bindingsCount, effectFactory))
|
||||
|
||||
#define ID2D1Factory2_RegisterEffectFromString(This, classId, propertyXml, bindings, bindingsCount, effectFactory) \
|
||||
((This)->lpVtbl->Base.RegisterEffectFromString((ID2D1Factory1 *)This, classId, propertyXml, bindings, bindingsCount, effectFactory))
|
||||
|
||||
#define ID2D1Factory2_UnregisterEffect(This, classId) \
|
||||
((This)->lpVtbl->Base.UnregisterEffect((ID2D1Factory1 *)This, classId))
|
||||
|
||||
#define ID2D1Factory2_GetRegisteredEffects(This, effects, effectsCount, effectsReturned, effectsRegistered) \
|
||||
((This)->lpVtbl->Base.GetRegisteredEffects((ID2D1Factory1 *)This, effects, effectsCount, effectsReturned, effectsRegistered))
|
||||
|
||||
#define ID2D1Factory2_GetEffectProperties(This, effectId, properties) \
|
||||
((This)->lpVtbl->Base.GetEffectProperties((ID2D1Factory1 *)This, effectId, properties))
|
||||
|
||||
#define ID2D1Factory2_CreateDevice(This, dxgiDevice, d2dDevice1) \
|
||||
((This)->lpVtbl->CreateDevice(This, dxgiDevice, d2dDevice1))
|
||||
|
||||
typedef interface ID2D1CommandSink1 ID2D1CommandSink1;
|
||||
|
||||
typedef struct ID2D1CommandSink1Vtbl
|
||||
{
|
||||
|
||||
ID2D1CommandSinkVtbl Base;
|
||||
|
||||
|
||||
STDMETHOD(SetPrimitiveBlend1)(
|
||||
ID2D1CommandSink1 *This,
|
||||
D2D1_PRIMITIVE_BLEND primitiveBlend
|
||||
) PURE;
|
||||
} ID2D1CommandSink1Vtbl;
|
||||
|
||||
interface ID2D1CommandSink1
|
||||
{
|
||||
CONST struct ID2D1CommandSink1Vtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
#define ID2D1CommandSink1_QueryInterface(This, riid, ppv) \
|
||||
((This)->lpVtbl->Base.Base.QueryInterface((IUnknown *)This, riid, ppv))
|
||||
|
||||
#define ID2D1CommandSink1_AddRef(This) \
|
||||
((This)->lpVtbl->Base.Base.AddRef((IUnknown *)This))
|
||||
|
||||
#define ID2D1CommandSink1_Release(This) \
|
||||
((This)->lpVtbl->Base.Base.Release((IUnknown *)This))
|
||||
|
||||
#define ID2D1CommandSink1_BeginDraw(This) \
|
||||
((This)->lpVtbl->Base.BeginDraw((ID2D1CommandSink *)This))
|
||||
|
||||
#define ID2D1CommandSink1_EndDraw(This) \
|
||||
((This)->lpVtbl->Base.EndDraw((ID2D1CommandSink *)This))
|
||||
|
||||
#define ID2D1CommandSink1_SetAntialiasMode(This, antialiasMode) \
|
||||
((This)->lpVtbl->Base.SetAntialiasMode((ID2D1CommandSink *)This, antialiasMode))
|
||||
|
||||
#define ID2D1CommandSink1_SetTags(This, tag1, tag2) \
|
||||
((This)->lpVtbl->Base.SetTags((ID2D1CommandSink *)This, tag1, tag2))
|
||||
|
||||
#define ID2D1CommandSink1_SetTextAntialiasMode(This, textAntialiasMode) \
|
||||
((This)->lpVtbl->Base.SetTextAntialiasMode((ID2D1CommandSink *)This, textAntialiasMode))
|
||||
|
||||
#define ID2D1CommandSink1_SetTextRenderingParams(This, textRenderingParams) \
|
||||
((This)->lpVtbl->Base.SetTextRenderingParams((ID2D1CommandSink *)This, textRenderingParams))
|
||||
|
||||
#define ID2D1CommandSink1_SetTransform(This, transform) \
|
||||
((This)->lpVtbl->Base.SetTransform((ID2D1CommandSink *)This, transform))
|
||||
|
||||
#define ID2D1CommandSink1_SetPrimitiveBlend(This, primitiveBlend) \
|
||||
((This)->lpVtbl->Base.SetPrimitiveBlend((ID2D1CommandSink *)This, primitiveBlend))
|
||||
|
||||
#define ID2D1CommandSink1_SetUnitMode(This, unitMode) \
|
||||
((This)->lpVtbl->Base.SetUnitMode((ID2D1CommandSink *)This, unitMode))
|
||||
|
||||
#define ID2D1CommandSink1_Clear(This, color) \
|
||||
((This)->lpVtbl->Base.Clear((ID2D1CommandSink *)This, color))
|
||||
|
||||
#define ID2D1CommandSink1_DrawGlyphRun(This, baselineOrigin, glyphRun, glyphRunDescription, foregroundBrush, measuringMode) \
|
||||
((This)->lpVtbl->Base.DrawGlyphRun((ID2D1CommandSink *)This, baselineOrigin, glyphRun, glyphRunDescription, foregroundBrush, measuringMode))
|
||||
|
||||
#define ID2D1CommandSink1_DrawLine(This, point0, point1, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.DrawLine((ID2D1CommandSink *)This, point0, point1, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1CommandSink1_DrawGeometry(This, geometry, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.DrawGeometry((ID2D1CommandSink *)This, geometry, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1CommandSink1_DrawRectangle(This, rect, brush, strokeWidth, strokeStyle) \
|
||||
((This)->lpVtbl->Base.DrawRectangle((ID2D1CommandSink *)This, rect, brush, strokeWidth, strokeStyle))
|
||||
|
||||
#define ID2D1CommandSink1_DrawBitmap(This, bitmap, destinationRectangle, opacity, interpolationMode, sourceRectangle, perspectiveTransform) \
|
||||
((This)->lpVtbl->Base.DrawBitmap((ID2D1CommandSink *)This, bitmap, destinationRectangle, opacity, interpolationMode, sourceRectangle, perspectiveTransform))
|
||||
|
||||
#define ID2D1CommandSink1_DrawImage(This, image, targetOffset, imageRectangle, interpolationMode, compositeMode) \
|
||||
((This)->lpVtbl->Base.DrawImage((ID2D1CommandSink *)This, image, targetOffset, imageRectangle, interpolationMode, compositeMode))
|
||||
|
||||
#define ID2D1CommandSink1_DrawGdiMetafile(This, gdiMetafile, targetOffset) \
|
||||
((This)->lpVtbl->Base.DrawGdiMetafile((ID2D1CommandSink *)This, gdiMetafile, targetOffset))
|
||||
|
||||
#define ID2D1CommandSink1_FillMesh(This, mesh, brush) \
|
||||
((This)->lpVtbl->Base.FillMesh((ID2D1CommandSink *)This, mesh, brush))
|
||||
|
||||
#define ID2D1CommandSink1_FillOpacityMask(This, opacityMask, brush, destinationRectangle, sourceRectangle) \
|
||||
((This)->lpVtbl->Base.FillOpacityMask((ID2D1CommandSink *)This, opacityMask, brush, destinationRectangle, sourceRectangle))
|
||||
|
||||
#define ID2D1CommandSink1_FillGeometry(This, geometry, brush, opacityBrush) \
|
||||
((This)->lpVtbl->Base.FillGeometry((ID2D1CommandSink *)This, geometry, brush, opacityBrush))
|
||||
|
||||
#define ID2D1CommandSink1_FillRectangle(This, rect, brush) \
|
||||
((This)->lpVtbl->Base.FillRectangle((ID2D1CommandSink *)This, rect, brush))
|
||||
|
||||
#define ID2D1CommandSink1_PushAxisAlignedClip(This, clipRect, antialiasMode) \
|
||||
((This)->lpVtbl->Base.PushAxisAlignedClip((ID2D1CommandSink *)This, clipRect, antialiasMode))
|
||||
|
||||
#define ID2D1CommandSink1_PushLayer(This, layerParameters1, layer) \
|
||||
((This)->lpVtbl->Base.PushLayer((ID2D1CommandSink *)This, layerParameters1, layer))
|
||||
|
||||
#define ID2D1CommandSink1_PopAxisAlignedClip(This) \
|
||||
((This)->lpVtbl->Base.PopAxisAlignedClip((ID2D1CommandSink *)This))
|
||||
|
||||
#define ID2D1CommandSink1_PopLayer(This) \
|
||||
((This)->lpVtbl->Base.PopLayer((ID2D1CommandSink *)This))
|
||||
|
||||
#define ID2D1CommandSink1_SetPrimitiveBlend1(This, primitiveBlend) \
|
||||
((This)->lpVtbl->SetPrimitiveBlend1(This, primitiveBlend))
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#if NTDDI_VERSION >= NTDDI_WINBLUE
|
||||
FLOAT WINAPI
|
||||
D2D1ComputeMaximumScaleFactor(
|
||||
_In_ CONST D2D1_MATRIX_3X2_F *matrix
|
||||
);
|
||||
#endif // #if NTDDI_VERSION >= NTDDI_WINBLUE
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
#include <d2d1_2helper.h>
|
||||
#endif // #ifndef _D2D1_2_H_
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
|
||||
/*=========================================================================*\
|
||||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
File: D2D1_2Helper.h
|
||||
|
||||
Module Name: D2D
|
||||
|
||||
Description: Helper files over the D2D interfaces and APIs.
|
||||
|
||||
\*=========================================================================*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif // _MSC_VER
|
||||
|
||||
#ifndef _D2D1_2HELPER_H_
|
||||
#define _D2D1_2HELPER_H_
|
||||
|
||||
#if NTDDI_VERSION >= NTDDI_WINBLUE
|
||||
|
||||
#ifndef _D2D1_2_H_
|
||||
#include <d2d1_2.h>
|
||||
#endif // #ifndef _D2D1_2_H_
|
||||
|
||||
#ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
#pragma region Application Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
namespace D2D1
|
||||
{
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
FLOAT
|
||||
ComputeFlatteningTolerance(
|
||||
_In_ CONST D2D1_MATRIX_3X2_F &matrix,
|
||||
FLOAT dpiX = 96.0f,
|
||||
FLOAT dpiY = 96.0f,
|
||||
FLOAT maxZoomFactor = 1.0f
|
||||
)
|
||||
{
|
||||
D2D1_MATRIX_3X2_F dpiDependentTransform =
|
||||
matrix * D2D1::Matrix3x2F::Scale(dpiX / 96.0f, dpiY / 96.0f);
|
||||
|
||||
FLOAT absMaxZoomFactor = (maxZoomFactor > 0) ? maxZoomFactor : -maxZoomFactor;
|
||||
|
||||
return D2D1_DEFAULT_FLATTENING_TOLERANCE /
|
||||
(absMaxZoomFactor * D2D1ComputeMaximumScaleFactor(&dpiDependentTransform));
|
||||
}
|
||||
|
||||
} // namespace D2D1
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
|
||||
#endif // #ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
#endif // #if NTDDI_VERSION >= NTDDI_WINBLUE
|
||||
|
||||
#endif // #ifndef _D2D1_HELPER_H_
|
||||
|
||||
Vendored
+2264
File diff suppressed because it is too large
Load Diff
+228
@@ -0,0 +1,228 @@
|
||||
|
||||
/*=========================================================================*\
|
||||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
File: D2D1_3Helper.h
|
||||
|
||||
Module Name: D2D
|
||||
|
||||
Description: Helper files over the D2D interfaces and APIs.
|
||||
|
||||
\*=========================================================================*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif // _MSC_VER
|
||||
|
||||
#ifndef _D2D1_3HELPER_H_
|
||||
#define _D2D1_3HELPER_H_
|
||||
|
||||
#if NTDDI_VERSION >= NTDDI_WINTHRESHOLD
|
||||
|
||||
#ifndef _D2D1_3_H_
|
||||
#include <d2d1_3.h>
|
||||
#endif // #ifndef _D2D1_3_H_
|
||||
|
||||
#ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
#pragma region Application Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
namespace D2D1
|
||||
{
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_GRADIENT_MESH_PATCH
|
||||
GradientMeshPatch(
|
||||
D2D1_POINT_2F point00,
|
||||
D2D1_POINT_2F point01,
|
||||
D2D1_POINT_2F point02,
|
||||
D2D1_POINT_2F point03,
|
||||
D2D1_POINT_2F point10,
|
||||
D2D1_POINT_2F point11,
|
||||
D2D1_POINT_2F point12,
|
||||
D2D1_POINT_2F point13,
|
||||
D2D1_POINT_2F point20,
|
||||
D2D1_POINT_2F point21,
|
||||
D2D1_POINT_2F point22,
|
||||
D2D1_POINT_2F point23,
|
||||
D2D1_POINT_2F point30,
|
||||
D2D1_POINT_2F point31,
|
||||
D2D1_POINT_2F point32,
|
||||
D2D1_POINT_2F point33,
|
||||
D2D1_COLOR_F color00,
|
||||
D2D1_COLOR_F color03,
|
||||
D2D1_COLOR_F color30,
|
||||
D2D1_COLOR_F color33,
|
||||
D2D1_PATCH_EDGE_MODE topEdgeMode,
|
||||
D2D1_PATCH_EDGE_MODE leftEdgeMode,
|
||||
D2D1_PATCH_EDGE_MODE bottomEdgeMode,
|
||||
D2D1_PATCH_EDGE_MODE rightEdgeMode
|
||||
)
|
||||
{
|
||||
D2D1_GRADIENT_MESH_PATCH newPatch;
|
||||
newPatch.point00 = point00;
|
||||
newPatch.point01 = point01;
|
||||
newPatch.point02 = point02;
|
||||
newPatch.point03 = point03;
|
||||
newPatch.point10 = point10;
|
||||
newPatch.point11 = point11;
|
||||
newPatch.point12 = point12;
|
||||
newPatch.point13 = point13;
|
||||
newPatch.point20 = point20;
|
||||
newPatch.point21 = point21;
|
||||
newPatch.point22 = point22;
|
||||
newPatch.point23 = point23;
|
||||
newPatch.point30 = point30;
|
||||
newPatch.point31 = point31;
|
||||
newPatch.point32 = point32;
|
||||
newPatch.point33 = point33;
|
||||
|
||||
newPatch.color00 = color00;
|
||||
newPatch.color03 = color03;
|
||||
newPatch.color30 = color30;
|
||||
newPatch.color33 = color33;
|
||||
|
||||
newPatch.topEdgeMode = topEdgeMode;
|
||||
newPatch.leftEdgeMode = leftEdgeMode;
|
||||
newPatch.bottomEdgeMode = bottomEdgeMode;
|
||||
newPatch.rightEdgeMode = rightEdgeMode;
|
||||
|
||||
return newPatch;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_GRADIENT_MESH_PATCH
|
||||
GradientMeshPatchFromCoonsPatch(
|
||||
D2D1_POINT_2F point0,
|
||||
D2D1_POINT_2F point1,
|
||||
D2D1_POINT_2F point2,
|
||||
D2D1_POINT_2F point3,
|
||||
D2D1_POINT_2F point4,
|
||||
D2D1_POINT_2F point5,
|
||||
D2D1_POINT_2F point6,
|
||||
D2D1_POINT_2F point7,
|
||||
D2D1_POINT_2F point8,
|
||||
D2D1_POINT_2F point9,
|
||||
D2D1_POINT_2F point10,
|
||||
D2D1_POINT_2F point11,
|
||||
D2D1_COLOR_F color0,
|
||||
D2D1_COLOR_F color1,
|
||||
D2D1_COLOR_F color2,
|
||||
D2D1_COLOR_F color3,
|
||||
D2D1_PATCH_EDGE_MODE topEdgeMode,
|
||||
D2D1_PATCH_EDGE_MODE leftEdgeMode,
|
||||
D2D1_PATCH_EDGE_MODE bottomEdgeMode,
|
||||
D2D1_PATCH_EDGE_MODE rightEdgeMode
|
||||
)
|
||||
{
|
||||
D2D1_GRADIENT_MESH_PATCH newPatch;
|
||||
newPatch.point00 = point0;
|
||||
newPatch.point01 = point1;
|
||||
newPatch.point02 = point2;
|
||||
newPatch.point03 = point3;
|
||||
newPatch.point13 = point4;
|
||||
newPatch.point23 = point5;
|
||||
newPatch.point33 = point6;
|
||||
newPatch.point32 = point7;
|
||||
newPatch.point31 = point8;
|
||||
newPatch.point30 = point9;
|
||||
newPatch.point20 = point10;
|
||||
newPatch.point10 = point11;
|
||||
|
||||
D2D1GetGradientMeshInteriorPointsFromCoonsPatch(
|
||||
&point0,
|
||||
&point1,
|
||||
&point2,
|
||||
&point3,
|
||||
&point4,
|
||||
&point5,
|
||||
&point6,
|
||||
&point7,
|
||||
&point8,
|
||||
&point9,
|
||||
&point10,
|
||||
&point11,
|
||||
&newPatch.point11,
|
||||
&newPatch.point12,
|
||||
&newPatch.point21,
|
||||
&newPatch.point22
|
||||
);
|
||||
|
||||
newPatch.color00 = color0;
|
||||
newPatch.color03 = color1;
|
||||
newPatch.color33 = color2;
|
||||
newPatch.color30 = color3;
|
||||
newPatch.topEdgeMode = topEdgeMode;
|
||||
newPatch.leftEdgeMode = leftEdgeMode;
|
||||
newPatch.bottomEdgeMode = bottomEdgeMode;
|
||||
newPatch.rightEdgeMode = rightEdgeMode;
|
||||
|
||||
return newPatch;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_INK_POINT
|
||||
InkPoint(
|
||||
const D2D1_POINT_2F &point,
|
||||
FLOAT radius
|
||||
)
|
||||
{
|
||||
D2D1_INK_POINT inkPoint;
|
||||
|
||||
inkPoint.x = point.x;
|
||||
inkPoint.y = point.y;
|
||||
inkPoint.radius = radius;
|
||||
|
||||
return inkPoint;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_INK_BEZIER_SEGMENT
|
||||
InkBezierSegment(
|
||||
const D2D1_INK_POINT &point1,
|
||||
const D2D1_INK_POINT &point2,
|
||||
const D2D1_INK_POINT &point3
|
||||
)
|
||||
{
|
||||
D2D1_INK_BEZIER_SEGMENT inkBezierSegment;
|
||||
|
||||
inkBezierSegment.point1 = point1;
|
||||
inkBezierSegment.point2 = point2;
|
||||
inkBezierSegment.point3 = point3;
|
||||
|
||||
return inkBezierSegment;
|
||||
}
|
||||
|
||||
COM_DECLSPEC_NOTHROW
|
||||
D2D1FORCEINLINE
|
||||
D2D1_INK_STYLE_PROPERTIES
|
||||
InkStyleProperties(
|
||||
D2D1_INK_NIB_SHAPE nibShape,
|
||||
const D2D1_MATRIX_3X2_F &nibTransform
|
||||
)
|
||||
{
|
||||
D2D1_INK_STYLE_PROPERTIES inkStyleProperties;
|
||||
|
||||
inkStyleProperties.nibShape = nibShape;
|
||||
inkStyleProperties.nibTransform = nibTransform;
|
||||
|
||||
return inkStyleProperties;
|
||||
}
|
||||
} // namespace D2D1
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
|
||||
#endif // #ifndef D2D_USE_C_DEFINITIONS
|
||||
|
||||
#endif // #if NTDDI_VERSION >= NTDDI_WINTHRESHOLD
|
||||
|
||||
#endif // #ifndef _D2D1_HELPER_H_
|
||||
|
||||
+2307
File diff suppressed because it is too large
Load Diff
+102
@@ -0,0 +1,102 @@
|
||||
//---------------------------------------------------------------------------
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// This file is automatically generated. Please do not edit it directly.
|
||||
//
|
||||
// File name: D2D1Effects_1.h
|
||||
//---------------------------------------------------------------------------
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif // #ifdef _MSC_VER
|
||||
|
||||
#ifndef _D2D1_EFFECTS_1_
|
||||
#define _D2D1_EFFECTS_1_
|
||||
|
||||
#ifndef _D2D1_EFFECTS_
|
||||
#include <d2d1effects.h>
|
||||
#endif // #ifndef _D2D1_EFFECTS_
|
||||
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
#pragma region Application Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
// Built in effect CLSIDs
|
||||
DEFINE_GUID(CLSID_D2D1YCbCr, 0x99503cc1, 0x66c7, 0x45c9, 0xa8, 0x75, 0x8a, 0xd8, 0xa7, 0x91, 0x44, 0x01);
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_YCBCR_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the YCbCr effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_YCBCR_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "ChromaSubsampling"
|
||||
// Property Type: D2D1_YCBCR_CHROMA_SUBSAMPLING
|
||||
//
|
||||
D2D1_YCBCR_PROP_CHROMA_SUBSAMPLING = 0,
|
||||
|
||||
//
|
||||
// Property Name: "TransformMatrix"
|
||||
// Property Type: D2D1_MATRIX_3X2_F
|
||||
//
|
||||
D2D1_YCBCR_PROP_TRANSFORM_MATRIX = 1,
|
||||
|
||||
//
|
||||
// Property Name: "InterpolationMode"
|
||||
// Property Type: D2D1_YCBCR_INTERPOLATION_MODE
|
||||
//
|
||||
D2D1_YCBCR_PROP_INTERPOLATION_MODE = 2,
|
||||
D2D1_YCBCR_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_YCBCR_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_YCBCR_CHROMA_SUBSAMPLING
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_YCBCR_CHROMA_SUBSAMPLING
|
||||
{
|
||||
D2D1_YCBCR_CHROMA_SUBSAMPLING_AUTO = 0,
|
||||
D2D1_YCBCR_CHROMA_SUBSAMPLING_420 = 1,
|
||||
D2D1_YCBCR_CHROMA_SUBSAMPLING_422 = 2,
|
||||
D2D1_YCBCR_CHROMA_SUBSAMPLING_444 = 3,
|
||||
D2D1_YCBCR_CHROMA_SUBSAMPLING_440 = 4,
|
||||
D2D1_YCBCR_CHROMA_SUBSAMPLING_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_YCBCR_CHROMA_SUBSAMPLING;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_YCBCR_INTERPOLATION_MODE
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_YCBCR_INTERPOLATION_MODE
|
||||
{
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_NEAREST_NEIGHBOR = 0,
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_LINEAR = 1,
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_CUBIC = 2,
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_MULTI_SAMPLE_LINEAR = 3,
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_ANISOTROPIC = 4,
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_HIGH_QUALITY_CUBIC = 5,
|
||||
D2D1_YCBCR_INTERPOLATION_MODE_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_YCBCR_INTERPOLATION_MODE;
|
||||
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
|
||||
#endif // #ifndef _D2D1_EFFECTS_1_
|
||||
+594
@@ -0,0 +1,594 @@
|
||||
//---------------------------------------------------------------------------
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// This file is automatically generated. Please do not edit it directly.
|
||||
//
|
||||
// File name: D2D1Effects_2.h
|
||||
//---------------------------------------------------------------------------
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif // #ifdef _MSC_VER
|
||||
|
||||
#ifndef _D2D1_EFFECTS_2_
|
||||
#define _D2D1_EFFECTS_2_
|
||||
|
||||
#ifndef _D2D1_EFFECTS_1_
|
||||
#include <d2d1effects_1.h>
|
||||
#endif // #ifndef _D2D1_EFFECTS_1_
|
||||
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
#pragma region Application Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
// Built in effect CLSIDs
|
||||
DEFINE_GUID(CLSID_D2D1Contrast, 0xb648a78a, 0x0ed5, 0x4f80, 0xa9, 0x4a, 0x8e, 0x82, 0x5a, 0xca, 0x6b, 0x77);
|
||||
DEFINE_GUID(CLSID_D2D1RgbToHue, 0x23f3e5ec, 0x91e8, 0x4d3d, 0xad, 0x0a, 0xaf, 0xad, 0xc1, 0x00, 0x4a, 0xa1);
|
||||
DEFINE_GUID(CLSID_D2D1HueToRgb, 0x7b78a6bd, 0x0141, 0x4def, 0x8a, 0x52, 0x63, 0x56, 0xee, 0x0c, 0xbd, 0xd5);
|
||||
DEFINE_GUID(CLSID_D2D1ChromaKey, 0x74C01F5B, 0x2A0D, 0x408C, 0x88, 0xE2, 0xC7, 0xA3, 0xC7, 0x19, 0x77, 0x42);
|
||||
DEFINE_GUID(CLSID_D2D1Emboss, 0xb1c5eb2b, 0x0348, 0x43f0, 0x81, 0x07, 0x49, 0x57, 0xca, 0xcb, 0xa2, 0xae);
|
||||
DEFINE_GUID(CLSID_D2D1Exposure, 0xb56c8cfa, 0xf634, 0x41ee, 0xbe, 0xe0, 0xff, 0xa6, 0x17, 0x10, 0x60, 0x04);
|
||||
DEFINE_GUID(CLSID_D2D1Grayscale, 0x36DDE0EB, 0x3725, 0x42E0, 0x83, 0x6D, 0x52, 0xFB, 0x20, 0xAE, 0xE6, 0x44);
|
||||
DEFINE_GUID(CLSID_D2D1Invert, 0xe0c3784d, 0xcb39, 0x4e84, 0xb6, 0xfd, 0x6b, 0x72, 0xf0, 0x81, 0x02, 0x63);
|
||||
DEFINE_GUID(CLSID_D2D1Posterize, 0x2188945e, 0x33a3, 0x4366, 0xb7, 0xbc, 0x08, 0x6b, 0xd0, 0x2d, 0x08, 0x84);
|
||||
DEFINE_GUID(CLSID_D2D1Sepia, 0x3a1af410, 0x5f1d, 0x4dbe, 0x84, 0xdf, 0x91, 0x5d, 0xa7, 0x9b, 0x71, 0x53);
|
||||
DEFINE_GUID(CLSID_D2D1Sharpen, 0xC9B887CB, 0xC5FF, 0x4DC5, 0x97, 0x79, 0x27, 0x3D, 0xCF, 0x41, 0x7C, 0x7D);
|
||||
DEFINE_GUID(CLSID_D2D1Straighten, 0x4da47b12, 0x79a3, 0x4fb0, 0x82, 0x37, 0xbb, 0xc3, 0xb2, 0xa4, 0xde, 0x08);
|
||||
DEFINE_GUID(CLSID_D2D1TemperatureTint, 0x89176087, 0x8AF9, 0x4A08, 0xAE, 0xB1, 0x89, 0x5F, 0x38, 0xDB, 0x17, 0x66);
|
||||
DEFINE_GUID(CLSID_D2D1Vignette, 0xc00c40be, 0x5e67, 0x4ca3, 0x95, 0xb4, 0xf4, 0xb0, 0x2c, 0x11, 0x51, 0x35);
|
||||
DEFINE_GUID(CLSID_D2D1EdgeDetection, 0xEFF583CA, 0xCB07, 0x4AA9, 0xAC, 0x5D, 0x2C, 0xC4, 0x4C, 0x76, 0x46, 0x0F);
|
||||
DEFINE_GUID(CLSID_D2D1HighlightsShadows, 0xCADC8384, 0x323F, 0x4C7E, 0xA3, 0x61, 0x2E, 0x2B, 0x24, 0xDF, 0x6E, 0xE4);
|
||||
DEFINE_GUID(CLSID_D2D1LookupTable3D, 0x349E0EDA, 0x0088, 0x4A79, 0x9C, 0xA3, 0xC7, 0xE3, 0x00, 0x20, 0x20, 0x20);
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_CONTRAST_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Contrast effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_CONTRAST_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Contrast"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_CONTRAST_PROP_CONTRAST = 0,
|
||||
|
||||
//
|
||||
// Property Name: "ClampInput"
|
||||
// Property Type: BOOL
|
||||
//
|
||||
D2D1_CONTRAST_PROP_CLAMP_INPUT = 1,
|
||||
D2D1_CONTRAST_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_CONTRAST_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_RGBTOHUE_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the RgbToHue effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_RGBTOHUE_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "OutputColorSpace"
|
||||
// Property Type: D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE
|
||||
//
|
||||
D2D1_RGBTOHUE_PROP_OUTPUT_COLOR_SPACE = 0,
|
||||
D2D1_RGBTOHUE_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_RGBTOHUE_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE
|
||||
{
|
||||
D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE_HUE_SATURATION_VALUE = 0,
|
||||
D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE_HUE_SATURATION_LIGHTNESS = 1,
|
||||
D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_RGBTOHUE_OUTPUT_COLOR_SPACE;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_HUETORGB_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the HueToRgb effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_HUETORGB_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "InputColorSpace"
|
||||
// Property Type: D2D1_HUETORGB_INPUT_COLOR_SPACE
|
||||
//
|
||||
D2D1_HUETORGB_PROP_INPUT_COLOR_SPACE = 0,
|
||||
D2D1_HUETORGB_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_HUETORGB_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_HUETORGB_INPUT_COLOR_SPACE
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_HUETORGB_INPUT_COLOR_SPACE
|
||||
{
|
||||
D2D1_HUETORGB_INPUT_COLOR_SPACE_HUE_SATURATION_VALUE = 0,
|
||||
D2D1_HUETORGB_INPUT_COLOR_SPACE_HUE_SATURATION_LIGHTNESS = 1,
|
||||
D2D1_HUETORGB_INPUT_COLOR_SPACE_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_HUETORGB_INPUT_COLOR_SPACE;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_CHROMAKEY_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Chroma Key effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_CHROMAKEY_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Color"
|
||||
// Property Type: D2D1_VECTOR_3F
|
||||
//
|
||||
D2D1_CHROMAKEY_PROP_COLOR = 0,
|
||||
|
||||
//
|
||||
// Property Name: "Tolerance"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_CHROMAKEY_PROP_TOLERANCE = 1,
|
||||
|
||||
//
|
||||
// Property Name: "InvertAlpha"
|
||||
// Property Type: BOOL
|
||||
//
|
||||
D2D1_CHROMAKEY_PROP_INVERT_ALPHA = 2,
|
||||
|
||||
//
|
||||
// Property Name: "Feather"
|
||||
// Property Type: BOOL
|
||||
//
|
||||
D2D1_CHROMAKEY_PROP_FEATHER = 3,
|
||||
D2D1_CHROMAKEY_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_CHROMAKEY_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_EMBOSS_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Emboss effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_EMBOSS_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Height"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_EMBOSS_PROP_HEIGHT = 0,
|
||||
|
||||
//
|
||||
// Property Name: "Direction"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_EMBOSS_PROP_DIRECTION = 1,
|
||||
D2D1_EMBOSS_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_EMBOSS_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_EXPOSURE_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Exposure effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_EXPOSURE_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "ExposureValue"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_EXPOSURE_PROP_EXPOSURE_VALUE = 0,
|
||||
D2D1_EXPOSURE_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_EXPOSURE_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_POSTERIZE_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Posterize effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_POSTERIZE_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "RedValueCount"
|
||||
// Property Type: UINT32
|
||||
//
|
||||
D2D1_POSTERIZE_PROP_RED_VALUE_COUNT = 0,
|
||||
|
||||
//
|
||||
// Property Name: "GreenValueCount"
|
||||
// Property Type: UINT32
|
||||
//
|
||||
D2D1_POSTERIZE_PROP_GREEN_VALUE_COUNT = 1,
|
||||
|
||||
//
|
||||
// Property Name: "BlueValueCount"
|
||||
// Property Type: UINT32
|
||||
//
|
||||
D2D1_POSTERIZE_PROP_BLUE_VALUE_COUNT = 2,
|
||||
D2D1_POSTERIZE_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_POSTERIZE_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_SEPIA_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Sepia effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_SEPIA_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Intensity"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_SEPIA_PROP_INTENSITY = 0,
|
||||
|
||||
//
|
||||
// Property Name: "AlphaMode"
|
||||
// Property Type: D2D1_ALPHA_MODE
|
||||
//
|
||||
D2D1_SEPIA_PROP_ALPHA_MODE = 1,
|
||||
D2D1_SEPIA_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_SEPIA_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_SHARPEN_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Sharpen effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_SHARPEN_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Sharpness"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_SHARPEN_PROP_SHARPNESS = 0,
|
||||
|
||||
//
|
||||
// Property Name: "Threshold"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_SHARPEN_PROP_THRESHOLD = 1,
|
||||
D2D1_SHARPEN_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_SHARPEN_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_STRAIGHTEN_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Straighten effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_STRAIGHTEN_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Angle"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_STRAIGHTEN_PROP_ANGLE = 0,
|
||||
|
||||
//
|
||||
// Property Name: "MaintainSize"
|
||||
// Property Type: BOOL
|
||||
//
|
||||
D2D1_STRAIGHTEN_PROP_MAINTAIN_SIZE = 1,
|
||||
|
||||
//
|
||||
// Property Name: "ScaleMode"
|
||||
// Property Type: D2D1_STRAIGHTEN_SCALE_MODE
|
||||
//
|
||||
D2D1_STRAIGHTEN_PROP_SCALE_MODE = 2,
|
||||
D2D1_STRAIGHTEN_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_STRAIGHTEN_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_STRAIGHTEN_SCALE_MODE
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_STRAIGHTEN_SCALE_MODE
|
||||
{
|
||||
D2D1_STRAIGHTEN_SCALE_MODE_NEAREST_NEIGHBOR = 0,
|
||||
D2D1_STRAIGHTEN_SCALE_MODE_LINEAR = 1,
|
||||
D2D1_STRAIGHTEN_SCALE_MODE_CUBIC = 2,
|
||||
D2D1_STRAIGHTEN_SCALE_MODE_MULTI_SAMPLE_LINEAR = 3,
|
||||
D2D1_STRAIGHTEN_SCALE_MODE_ANISOTROPIC = 4,
|
||||
D2D1_STRAIGHTEN_SCALE_MODE_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_STRAIGHTEN_SCALE_MODE;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_TEMPERATUREANDTINT_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Temperature And Tint effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_TEMPERATUREANDTINT_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Temperature"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_TEMPERATUREANDTINT_PROP_TEMPERATURE = 0,
|
||||
|
||||
//
|
||||
// Property Name: "Tint"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_TEMPERATUREANDTINT_PROP_TINT = 1,
|
||||
D2D1_TEMPERATUREANDTINT_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_TEMPERATUREANDTINT_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_VIGNETTE_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Vignette effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_VIGNETTE_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Color"
|
||||
// Property Type: D2D1_VECTOR_4F
|
||||
//
|
||||
D2D1_VIGNETTE_PROP_COLOR = 0,
|
||||
|
||||
//
|
||||
// Property Name: "TransitionSize"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_VIGNETTE_PROP_TRANSITION_SIZE = 1,
|
||||
|
||||
//
|
||||
// Property Name: "Strength"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_VIGNETTE_PROP_STRENGTH = 2,
|
||||
D2D1_VIGNETTE_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_VIGNETTE_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_EDGEDETECTION_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Edge Detection effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_EDGEDETECTION_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Strength"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_EDGEDETECTION_PROP_STRENGTH = 0,
|
||||
|
||||
//
|
||||
// Property Name: "BlurRadius"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_EDGEDETECTION_PROP_BLUR_RADIUS = 1,
|
||||
|
||||
//
|
||||
// Property Name: "Mode"
|
||||
// Property Type: D2D1_EDGEDETECTION_MODE
|
||||
//
|
||||
D2D1_EDGEDETECTION_PROP_MODE = 2,
|
||||
|
||||
//
|
||||
// Property Name: "OverlayEdges"
|
||||
// Property Type: BOOL
|
||||
//
|
||||
D2D1_EDGEDETECTION_PROP_OVERLAY_EDGES = 3,
|
||||
|
||||
//
|
||||
// Property Name: "AlphaMode"
|
||||
// Property Type: D2D1_ALPHA_MODE
|
||||
//
|
||||
D2D1_EDGEDETECTION_PROP_ALPHA_MODE = 4,
|
||||
D2D1_EDGEDETECTION_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_EDGEDETECTION_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_EDGEDETECTION_MODE
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_EDGEDETECTION_MODE
|
||||
{
|
||||
D2D1_EDGEDETECTION_MODE_SOBEL = 0,
|
||||
D2D1_EDGEDETECTION_MODE_PREWITT = 1,
|
||||
D2D1_EDGEDETECTION_MODE_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_EDGEDETECTION_MODE;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_HIGHLIGHTSANDSHADOWS_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Highlights and Shadows effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_HIGHLIGHTSANDSHADOWS_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Highlights"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_PROP_HIGHLIGHTS = 0,
|
||||
|
||||
//
|
||||
// Property Name: "Shadows"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_PROP_SHADOWS = 1,
|
||||
|
||||
//
|
||||
// Property Name: "Clarity"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_PROP_CLARITY = 2,
|
||||
|
||||
//
|
||||
// Property Name: "InputGamma"
|
||||
// Property Type: D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA
|
||||
//
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_PROP_INPUT_GAMMA = 3,
|
||||
|
||||
//
|
||||
// Property Name: "MaskBlurRadius"
|
||||
// Property Type: FLOAT
|
||||
//
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_PROP_MASK_BLUR_RADIUS = 4,
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_HIGHLIGHTSANDSHADOWS_PROP;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA
|
||||
{
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA_LINEAR = 0,
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA_SRGB = 1,
|
||||
D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_HIGHLIGHTSANDSHADOWS_INPUT_GAMMA;
|
||||
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_LOOKUPTABLE3D_PROP
|
||||
//
|
||||
// Synopsis:
|
||||
// The enumeration of the Lookup Table 3D effect's top level properties.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_LOOKUPTABLE3D_PROP
|
||||
{
|
||||
|
||||
//
|
||||
// Property Name: "Lut"
|
||||
// Property Type: IUnknown *
|
||||
//
|
||||
D2D1_LOOKUPTABLE3D_PROP_LUT = 0,
|
||||
|
||||
//
|
||||
// Property Name: "AlphaMode"
|
||||
// Property Type: D2D1_ALPHA_MODE
|
||||
//
|
||||
D2D1_LOOKUPTABLE3D_PROP_ALPHA_MODE = 1,
|
||||
D2D1_LOOKUPTABLE3D_PROP_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_LOOKUPTABLE3D_PROP;
|
||||
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
|
||||
#endif // #ifndef _D2D1_EFFECTS_2_
|
||||
Vendored
+6819
File diff suppressed because it is too large
Load Diff
Vendored
+1793
File diff suppressed because it is too large
Load Diff
+306
@@ -0,0 +1,306 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: D3D10_1Shader.h
|
||||
// Content: D3D10.1 Shader Types and APIs
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __D3D10_1SHADER_H__
|
||||
#define __D3D10_1SHADER_H__
|
||||
|
||||
#include "d3d10shader.h"
|
||||
|
||||
#include <winapifamily.h>
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Shader debugging structures
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
typedef enum _D3D10_SHADER_DEBUG_REGTYPE
|
||||
{
|
||||
D3D10_SHADER_DEBUG_REG_INPUT,
|
||||
D3D10_SHADER_DEBUG_REG_OUTPUT,
|
||||
D3D10_SHADER_DEBUG_REG_CBUFFER,
|
||||
D3D10_SHADER_DEBUG_REG_TBUFFER,
|
||||
D3D10_SHADER_DEBUG_REG_TEMP,
|
||||
D3D10_SHADER_DEBUG_REG_TEMPARRAY,
|
||||
D3D10_SHADER_DEBUG_REG_TEXTURE,
|
||||
D3D10_SHADER_DEBUG_REG_SAMPLER,
|
||||
D3D10_SHADER_DEBUG_REG_IMMEDIATECBUFFER,
|
||||
D3D10_SHADER_DEBUG_REG_LITERAL,
|
||||
D3D10_SHADER_DEBUG_REG_UNUSED,
|
||||
D3D11_SHADER_DEBUG_REG_INTERFACE_POINTERS,
|
||||
D3D11_SHADER_DEBUG_REG_UAV,
|
||||
D3D10_SHADER_DEBUG_REG_FORCE_DWORD = 0x7fffffff,
|
||||
} D3D10_SHADER_DEBUG_REGTYPE;
|
||||
|
||||
typedef enum _D3D10_SHADER_DEBUG_SCOPETYPE
|
||||
{
|
||||
D3D10_SHADER_DEBUG_SCOPE_GLOBAL,
|
||||
D3D10_SHADER_DEBUG_SCOPE_BLOCK,
|
||||
D3D10_SHADER_DEBUG_SCOPE_FORLOOP,
|
||||
D3D10_SHADER_DEBUG_SCOPE_STRUCT,
|
||||
D3D10_SHADER_DEBUG_SCOPE_FUNC_PARAMS,
|
||||
D3D10_SHADER_DEBUG_SCOPE_STATEBLOCK,
|
||||
D3D10_SHADER_DEBUG_SCOPE_NAMESPACE,
|
||||
D3D10_SHADER_DEBUG_SCOPE_ANNOTATION,
|
||||
D3D10_SHADER_DEBUG_SCOPE_FORCE_DWORD = 0x7fffffff,
|
||||
} D3D10_SHADER_DEBUG_SCOPETYPE;
|
||||
|
||||
typedef enum _D3D10_SHADER_DEBUG_VARTYPE
|
||||
{
|
||||
D3D10_SHADER_DEBUG_VAR_VARIABLE,
|
||||
D3D10_SHADER_DEBUG_VAR_FUNCTION,
|
||||
D3D10_SHADER_DEBUG_VAR_FORCE_DWORD = 0x7fffffff,
|
||||
} D3D10_SHADER_DEBUG_VARTYPE;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// These are the serialized structures that get written to the file
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct _D3D10_SHADER_DEBUG_TOKEN_INFO
|
||||
{
|
||||
UINT File; // offset into file list
|
||||
UINT Line; // line #
|
||||
UINT Column; // column #
|
||||
|
||||
UINT TokenLength;
|
||||
UINT TokenId; // offset to LPCSTR of length TokenLength in string datastore
|
||||
} D3D10_SHADER_DEBUG_TOKEN_INFO;
|
||||
|
||||
// Variable list
|
||||
typedef struct _D3D10_SHADER_DEBUG_VAR_INFO
|
||||
{
|
||||
// Index into token list for declaring identifier
|
||||
UINT TokenId;
|
||||
D3D10_SHADER_VARIABLE_TYPE Type;
|
||||
// register and component for this variable, only valid/necessary for arrays
|
||||
UINT Register;
|
||||
UINT Component;
|
||||
// gives the original variable that declared this variable
|
||||
UINT ScopeVar;
|
||||
// this variable's offset in its ScopeVar
|
||||
UINT ScopeVarOffset;
|
||||
} D3D10_SHADER_DEBUG_VAR_INFO;
|
||||
|
||||
typedef struct _D3D10_SHADER_DEBUG_INPUT_INFO
|
||||
{
|
||||
// index into array of variables of variable to initialize
|
||||
UINT Var;
|
||||
// input, cbuffer, tbuffer
|
||||
D3D10_SHADER_DEBUG_REGTYPE InitialRegisterSet;
|
||||
// set to cbuffer or tbuffer slot, geometry shader input primitive #,
|
||||
// identifying register for indexable temp, or -1
|
||||
UINT InitialBank;
|
||||
// -1 if temp, otherwise gives register in register set
|
||||
UINT InitialRegister;
|
||||
// -1 if temp, otherwise gives component
|
||||
UINT InitialComponent;
|
||||
// initial value if literal
|
||||
UINT InitialValue;
|
||||
} D3D10_SHADER_DEBUG_INPUT_INFO;
|
||||
|
||||
typedef struct _D3D10_SHADER_DEBUG_SCOPEVAR_INFO
|
||||
{
|
||||
// Index into variable token
|
||||
UINT TokenId;
|
||||
|
||||
D3D10_SHADER_DEBUG_VARTYPE VarType; // variable or function (different namespaces)
|
||||
D3D10_SHADER_VARIABLE_CLASS Class;
|
||||
UINT Rows; // number of rows (matrices)
|
||||
UINT Columns; // number of columns (vectors and matrices)
|
||||
|
||||
// In an array of structures, one struct member scope is provided, and
|
||||
// you'll have to add the array stride times the index to the variable
|
||||
// index you find, then find that variable in this structure's list of
|
||||
// variables.
|
||||
|
||||
// gives a scope to look up struct members. -1 if not a struct
|
||||
UINT StructMemberScope;
|
||||
|
||||
// number of array indices
|
||||
UINT uArrayIndices; // a[3][2][1] has 3 indices
|
||||
// maximum array index for each index
|
||||
// offset to UINT[uArrayIndices] in UINT datastore
|
||||
UINT ArrayElements; // a[3][2][1] has {3, 2, 1}
|
||||
// how many variables each array index moves
|
||||
// offset to UINT[uArrayIndices] in UINT datastore
|
||||
UINT ArrayStrides; // a[3][2][1] has {2, 1, 1}
|
||||
|
||||
UINT uVariables;
|
||||
// index of the first variable, later variables are offsets from this one
|
||||
UINT uFirstVariable;
|
||||
} D3D10_SHADER_DEBUG_SCOPEVAR_INFO;
|
||||
|
||||
// scope data, this maps variable names to debug variables (useful for the watch window)
|
||||
typedef struct _D3D10_SHADER_DEBUG_SCOPE_INFO
|
||||
{
|
||||
D3D10_SHADER_DEBUG_SCOPETYPE ScopeType;
|
||||
UINT Name; // offset to name of scope in strings list
|
||||
UINT uNameLen; // length of name string
|
||||
UINT uVariables;
|
||||
UINT VariableData; // Offset to UINT[uVariables] indexing the Scope Variable list
|
||||
} D3D10_SHADER_DEBUG_SCOPE_INFO;
|
||||
|
||||
// instruction outputs
|
||||
typedef struct _D3D10_SHADER_DEBUG_OUTPUTVAR
|
||||
{
|
||||
// index variable being written to, if -1 it's not going to a variable
|
||||
UINT Var;
|
||||
// range data that the compiler expects to be true
|
||||
UINT uValueMin, uValueMax;
|
||||
INT iValueMin, iValueMax;
|
||||
FLOAT fValueMin, fValueMax;
|
||||
|
||||
BOOL bNaNPossible, bInfPossible;
|
||||
} D3D10_SHADER_DEBUG_OUTPUTVAR;
|
||||
|
||||
typedef struct _D3D10_SHADER_DEBUG_OUTPUTREG_INFO
|
||||
{
|
||||
// Only temp, indexable temp, and output are valid here
|
||||
D3D10_SHADER_DEBUG_REGTYPE OutputRegisterSet;
|
||||
// -1 means no output
|
||||
UINT OutputReg;
|
||||
// if a temp array, identifier for which one
|
||||
UINT TempArrayReg;
|
||||
// -1 means masked out
|
||||
UINT OutputComponents[4];
|
||||
D3D10_SHADER_DEBUG_OUTPUTVAR OutputVars[4];
|
||||
// when indexing the output, get the value of this register, then add
|
||||
// that to uOutputReg. If uIndexReg is -1, then there is no index.
|
||||
// find the variable whose register is the sum (by looking in the ScopeVar)
|
||||
// and component matches, then set it. This should only happen for indexable
|
||||
// temps and outputs.
|
||||
UINT IndexReg;
|
||||
UINT IndexComp;
|
||||
} D3D10_SHADER_DEBUG_OUTPUTREG_INFO;
|
||||
|
||||
// per instruction data
|
||||
typedef struct _D3D10_SHADER_DEBUG_INST_INFO
|
||||
{
|
||||
UINT Id; // Which instruction this is in the bytecode
|
||||
UINT Opcode; // instruction type
|
||||
|
||||
// 0, 1, or 2
|
||||
UINT uOutputs;
|
||||
|
||||
// up to two outputs per instruction
|
||||
D3D10_SHADER_DEBUG_OUTPUTREG_INFO pOutputs[2];
|
||||
|
||||
// index into the list of tokens for this instruction's token
|
||||
UINT TokenId;
|
||||
|
||||
// how many function calls deep this instruction is
|
||||
UINT NestingLevel;
|
||||
|
||||
// list of scopes from outer-most to inner-most
|
||||
// Number of scopes
|
||||
UINT Scopes;
|
||||
UINT ScopeInfo; // Offset to UINT[uScopes] specifying indices of the ScopeInfo Array
|
||||
|
||||
// list of variables accessed by this instruction
|
||||
// Number of variables
|
||||
UINT AccessedVars;
|
||||
UINT AccessedVarsInfo; // Offset to UINT[AccessedVars] specifying indices of the ScopeVariableInfo Array
|
||||
} D3D10_SHADER_DEBUG_INST_INFO;
|
||||
|
||||
typedef struct _D3D10_SHADER_DEBUG_FILE_INFO
|
||||
{
|
||||
UINT FileName; // Offset to LPCSTR for file name
|
||||
UINT FileNameLen; // Length of file name
|
||||
UINT FileData; // Offset to LPCSTR of length FileLen
|
||||
UINT FileLen; // Length of file
|
||||
} D3D10_SHADER_DEBUG_FILE_INFO;
|
||||
|
||||
typedef struct _D3D10_SHADER_DEBUG_INFO
|
||||
{
|
||||
UINT Size; // sizeof(D3D10_SHADER_DEBUG_INFO)
|
||||
UINT Creator; // Offset to LPCSTR for compiler version
|
||||
UINT EntrypointName; // Offset to LPCSTR for Entry point name
|
||||
UINT ShaderTarget; // Offset to LPCSTR for shader target
|
||||
UINT CompileFlags; // flags used to compile
|
||||
UINT Files; // number of included files
|
||||
UINT FileInfo; // Offset to D3D10_SHADER_DEBUG_FILE_INFO[Files]
|
||||
UINT Instructions; // number of instructions
|
||||
UINT InstructionInfo; // Offset to D3D10_SHADER_DEBUG_INST_INFO[Instructions]
|
||||
UINT Variables; // number of variables
|
||||
UINT VariableInfo; // Offset to D3D10_SHADER_DEBUG_VAR_INFO[Variables]
|
||||
UINT InputVariables; // number of variables to initialize before running
|
||||
UINT InputVariableInfo; // Offset to D3D10_SHADER_DEBUG_INPUT_INFO[InputVariables]
|
||||
UINT Tokens; // number of tokens to initialize
|
||||
UINT TokenInfo; // Offset to D3D10_SHADER_DEBUG_TOKEN_INFO[Tokens]
|
||||
UINT Scopes; // number of scopes
|
||||
UINT ScopeInfo; // Offset to D3D10_SHADER_DEBUG_SCOPE_INFO[Scopes]
|
||||
UINT ScopeVariables; // number of variables declared
|
||||
UINT ScopeVariableInfo; // Offset to D3D10_SHADER_DEBUG_SCOPEVAR_INFO[Scopes]
|
||||
UINT UintOffset; // Offset to the UINT datastore, all UINT offsets are from this offset
|
||||
UINT StringOffset; // Offset to the string datastore, all string offsets are from this offset
|
||||
} D3D10_SHADER_DEBUG_INFO;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// ID3D10ShaderReflection1:
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Interface definitions
|
||||
//
|
||||
|
||||
|
||||
typedef interface ID3D10ShaderReflection1 ID3D10ShaderReflection1;
|
||||
typedef interface ID3D10ShaderReflection1 *LPD3D10SHADERREFLECTION1;
|
||||
|
||||
// {C3457783-A846-47CE-9520-CEA6F66E7447}
|
||||
DEFINE_GUID(IID_ID3D10ShaderReflection1,
|
||||
0xc3457783, 0xa846, 0x47ce, 0x95, 0x20, 0xce, 0xa6, 0xf6, 0x6e, 0x74, 0x47);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D10ShaderReflection1
|
||||
|
||||
DECLARE_INTERFACE_(ID3D10ShaderReflection1, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D10_SHADER_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D10ShaderReflectionConstantBuffer*, GetConstantBufferByIndex)(THIS_ UINT Index) PURE;
|
||||
STDMETHOD_(ID3D10ShaderReflectionConstantBuffer*, GetConstantBufferByName)(THIS_ LPCSTR Name) PURE;
|
||||
|
||||
STDMETHOD(GetResourceBindingDesc)(THIS_ UINT ResourceIndex, _Out_ D3D10_SHADER_INPUT_BIND_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD(GetInputParameterDesc)(THIS_ UINT ParameterIndex, _Out_ D3D10_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
|
||||
STDMETHOD(GetOutputParameterDesc)(THIS_ UINT ParameterIndex, _Out_ D3D10_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D10ShaderReflectionVariable*, GetVariableByName)(THIS_ LPCSTR Name) PURE;
|
||||
|
||||
STDMETHOD(GetResourceBindingDescByName)(THIS_ LPCSTR Name, _Out_ D3D10_SHADER_INPUT_BIND_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD(GetMovInstructionCount)(THIS_ _Out_ UINT* pCount) PURE;
|
||||
STDMETHOD(GetMovcInstructionCount)(THIS_ _Out_ UINT* pCount) PURE;
|
||||
STDMETHOD(GetConversionInstructionCount)(THIS_ _Out_ UINT* pCount) PURE;
|
||||
STDMETHOD(GetBitwiseInstructionCount)(THIS_ _Out_ UINT* pCount) PURE;
|
||||
|
||||
STDMETHOD(GetGSInputPrimitive)(THIS_ _Out_ D3D10_PRIMITIVE* pPrim) PURE;
|
||||
STDMETHOD(IsLevel9Shader)(THIS_ _Out_ BOOL* pbLevel9Shader) PURE;
|
||||
STDMETHOD(IsSampleFrequencyShader)(THIS_ _Out_ BOOL* pbSampleFrequency) PURE;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// APIs //////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif //__cplusplus
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif //__cplusplus
|
||||
|
||||
#endif //__D3D10_1SHADER_H__
|
||||
|
||||
Vendored
+14586
File diff suppressed because it is too large
Load Diff
Vendored
+5222
File diff suppressed because it is too large
Load Diff
Vendored
+2721
File diff suppressed because it is too large
Load Diff
Vendored
+4817
File diff suppressed because it is too large
Load Diff
+283
@@ -0,0 +1,283 @@
|
||||
/*-------------------------------------------------------------------------------------
|
||||
*
|
||||
* Copyright (c) Microsoft Corporation
|
||||
*
|
||||
*-------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/* this ALWAYS GENERATED file contains the definitions for the interfaces */
|
||||
|
||||
|
||||
/* File created by MIDL compiler version 8.00.0613 */
|
||||
|
||||
|
||||
|
||||
/* verify that the <rpcndr.h> version is high enough to compile this file*/
|
||||
#ifndef __REQUIRED_RPCNDR_H_VERSION__
|
||||
#define __REQUIRED_RPCNDR_H_VERSION__ 500
|
||||
#endif
|
||||
|
||||
/* verify that the <rpcsal.h> version is high enough to compile this file*/
|
||||
#ifndef __REQUIRED_RPCSAL_H_VERSION__
|
||||
#define __REQUIRED_RPCSAL_H_VERSION__ 100
|
||||
#endif
|
||||
|
||||
#include "rpc.h"
|
||||
#include "rpcndr.h"
|
||||
|
||||
#ifndef __RPCNDR_H_VERSION__
|
||||
#error this stub requires an updated version of <rpcndr.h>
|
||||
#endif /* __RPCNDR_H_VERSION__ */
|
||||
|
||||
#ifndef COM_NO_WINDOWS_H
|
||||
#include "windows.h"
|
||||
#include "ole2.h"
|
||||
#endif /*COM_NO_WINDOWS_H*/
|
||||
|
||||
#ifndef __d3d11on12_h__
|
||||
#define __d3d11on12_h__
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
/* Forward Declarations */
|
||||
|
||||
#ifndef __ID3D11On12Device_FWD_DEFINED__
|
||||
#define __ID3D11On12Device_FWD_DEFINED__
|
||||
typedef interface ID3D11On12Device ID3D11On12Device;
|
||||
|
||||
#endif /* __ID3D11On12Device_FWD_DEFINED__ */
|
||||
|
||||
|
||||
/* header files for imported files */
|
||||
#include "oaidl.h"
|
||||
#include "ocidl.h"
|
||||
#include "d3d11.h"
|
||||
#include "d3d12.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
|
||||
/* interface __MIDL_itf_d3d11on12_0000_0000 */
|
||||
/* [local] */
|
||||
|
||||
#include <winapifamily.h>
|
||||
#pragma region App Family
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// D3D11On12CreateDevice
|
||||
// ------------------
|
||||
//
|
||||
// pDevice
|
||||
// Specifies a pre-existing D3D12 device to use for D3D11 interop.
|
||||
// May not be NULL.
|
||||
// Flags
|
||||
// Any of those documented for D3D11CreateDeviceAndSwapChain.
|
||||
// pFeatureLevels
|
||||
// Array of any of the following:
|
||||
// D3D_FEATURE_LEVEL_12_1
|
||||
// D3D_FEATURE_LEVEL_12_0
|
||||
// D3D_FEATURE_LEVEL_11_1
|
||||
// D3D_FEATURE_LEVEL_11_0
|
||||
// D3D_FEATURE_LEVEL_10_1
|
||||
// D3D_FEATURE_LEVEL_10_0
|
||||
// D3D_FEATURE_LEVEL_9_3
|
||||
// D3D_FEATURE_LEVEL_9_2
|
||||
// D3D_FEATURE_LEVEL_9_1
|
||||
// The first feature level which is less than or equal to the
|
||||
// D3D12 device's feature level will be used to perform D3D11 validation.
|
||||
// Creation will fail if no acceptable feature levels are provided.
|
||||
// Providing NULL will default to the D3D12 device's feature level.
|
||||
// FeatureLevels
|
||||
// Size of feature levels array.
|
||||
// ppCommandQueues
|
||||
// Array of unique queues for D3D11On12 to use. Valid queue types:
|
||||
// 3D command queue.
|
||||
// Flags must be compatible with device flags, and its NodeMask must
|
||||
// be a subset of the NodeMask provided to this API.
|
||||
// NumQueues
|
||||
// Size of command queue array.
|
||||
// NodeMask
|
||||
// Which node of the D3D12 device to use. Only 1 bit may be set.
|
||||
// ppDevice
|
||||
// Pointer to returned interface. May be NULL.
|
||||
// ppImmediateContext
|
||||
// Pointer to returned interface. May be NULL.
|
||||
// pChosenFeatureLevel
|
||||
// Pointer to returned feature level. May be NULL.
|
||||
//
|
||||
// Return Values
|
||||
// Any of those documented for
|
||||
// D3D11CreateDevice
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
typedef HRESULT (WINAPI* PFN_D3D11ON12_CREATE_DEVICE)( _In_ IUnknown*, UINT,
|
||||
_In_reads_opt_( FeatureLevels ) CONST D3D_FEATURE_LEVEL*, UINT FeatureLevels,
|
||||
_In_reads_opt_( NumQueues ) IUnknown* CONST*, UINT NumQueues,
|
||||
UINT, _COM_Outptr_opt_ ID3D11Device**, _COM_Outptr_opt_ ID3D11DeviceContext**,
|
||||
_Out_opt_ D3D_FEATURE_LEVEL* );
|
||||
|
||||
HRESULT WINAPI D3D11On12CreateDevice(
|
||||
_In_ IUnknown* pDevice,
|
||||
UINT Flags,
|
||||
_In_reads_opt_( FeatureLevels ) CONST D3D_FEATURE_LEVEL* pFeatureLevels,
|
||||
UINT FeatureLevels,
|
||||
_In_reads_opt_( NumQueues ) IUnknown* CONST* ppCommandQueues,
|
||||
UINT NumQueues,
|
||||
UINT NodeMask,
|
||||
_COM_Outptr_opt_ ID3D11Device** ppDevice,
|
||||
_COM_Outptr_opt_ ID3D11DeviceContext** ppImmediateContext,
|
||||
_Out_opt_ D3D_FEATURE_LEVEL* pChosenFeatureLevel );
|
||||
|
||||
typedef struct D3D11_RESOURCE_FLAGS
|
||||
{
|
||||
UINT BindFlags;
|
||||
UINT MiscFlags;
|
||||
UINT CPUAccessFlags;
|
||||
UINT StructureByteStride;
|
||||
} D3D11_RESOURCE_FLAGS;
|
||||
|
||||
|
||||
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3d11on12_0000_0000_v0_0_c_ifspec;
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3d11on12_0000_0000_v0_0_s_ifspec;
|
||||
|
||||
#ifndef __ID3D11On12Device_INTERFACE_DEFINED__
|
||||
#define __ID3D11On12Device_INTERFACE_DEFINED__
|
||||
|
||||
/* interface ID3D11On12Device */
|
||||
/* [unique][local][object][uuid] */
|
||||
|
||||
|
||||
EXTERN_C const IID IID_ID3D11On12Device;
|
||||
|
||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
|
||||
MIDL_INTERFACE("85611e73-70a9-490e-9614-a9e302777904")
|
||||
ID3D11On12Device : public IUnknown
|
||||
{
|
||||
public:
|
||||
virtual HRESULT STDMETHODCALLTYPE CreateWrappedResource(
|
||||
_In_ IUnknown *pResource12,
|
||||
_In_ const D3D11_RESOURCE_FLAGS *pFlags11,
|
||||
D3D12_RESOURCE_STATES InState,
|
||||
D3D12_RESOURCE_STATES OutState,
|
||||
REFIID riid,
|
||||
_COM_Outptr_opt_ void **ppResource11) = 0;
|
||||
|
||||
virtual void STDMETHODCALLTYPE ReleaseWrappedResources(
|
||||
_In_reads_( NumResources ) ID3D11Resource *const *ppResources,
|
||||
UINT NumResources) = 0;
|
||||
|
||||
virtual void STDMETHODCALLTYPE AcquireWrappedResources(
|
||||
_In_reads_( NumResources ) ID3D11Resource *const *ppResources,
|
||||
UINT NumResources) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#else /* C style interface */
|
||||
|
||||
typedef struct ID3D11On12DeviceVtbl
|
||||
{
|
||||
BEGIN_INTERFACE
|
||||
|
||||
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
|
||||
ID3D11On12Device * This,
|
||||
REFIID riid,
|
||||
_COM_Outptr_ void **ppvObject);
|
||||
|
||||
ULONG ( STDMETHODCALLTYPE *AddRef )(
|
||||
ID3D11On12Device * This);
|
||||
|
||||
ULONG ( STDMETHODCALLTYPE *Release )(
|
||||
ID3D11On12Device * This);
|
||||
|
||||
HRESULT ( STDMETHODCALLTYPE *CreateWrappedResource )(
|
||||
ID3D11On12Device * This,
|
||||
_In_ IUnknown *pResource12,
|
||||
_In_ const D3D11_RESOURCE_FLAGS *pFlags11,
|
||||
D3D12_RESOURCE_STATES InState,
|
||||
D3D12_RESOURCE_STATES OutState,
|
||||
REFIID riid,
|
||||
_COM_Outptr_opt_ void **ppResource11);
|
||||
|
||||
void ( STDMETHODCALLTYPE *ReleaseWrappedResources )(
|
||||
ID3D11On12Device * This,
|
||||
_In_reads_( NumResources ) ID3D11Resource *const *ppResources,
|
||||
UINT NumResources);
|
||||
|
||||
void ( STDMETHODCALLTYPE *AcquireWrappedResources )(
|
||||
ID3D11On12Device * This,
|
||||
_In_reads_( NumResources ) ID3D11Resource *const *ppResources,
|
||||
UINT NumResources);
|
||||
|
||||
END_INTERFACE
|
||||
} ID3D11On12DeviceVtbl;
|
||||
|
||||
interface ID3D11On12Device
|
||||
{
|
||||
CONST_VTBL struct ID3D11On12DeviceVtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#ifdef COBJMACROS
|
||||
|
||||
|
||||
#define ID3D11On12Device_QueryInterface(This,riid,ppvObject) \
|
||||
( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
|
||||
|
||||
#define ID3D11On12Device_AddRef(This) \
|
||||
( (This)->lpVtbl -> AddRef(This) )
|
||||
|
||||
#define ID3D11On12Device_Release(This) \
|
||||
( (This)->lpVtbl -> Release(This) )
|
||||
|
||||
|
||||
#define ID3D11On12Device_CreateWrappedResource(This,pResource12,pFlags11,InState,OutState,riid,ppResource11) \
|
||||
( (This)->lpVtbl -> CreateWrappedResource(This,pResource12,pFlags11,InState,OutState,riid,ppResource11) )
|
||||
|
||||
#define ID3D11On12Device_ReleaseWrappedResources(This,ppResources,NumResources) \
|
||||
( (This)->lpVtbl -> ReleaseWrappedResources(This,ppResources,NumResources) )
|
||||
|
||||
#define ID3D11On12Device_AcquireWrappedResources(This,ppResources,NumResources) \
|
||||
( (This)->lpVtbl -> AcquireWrappedResources(This,ppResources,NumResources) )
|
||||
|
||||
#endif /* COBJMACROS */
|
||||
|
||||
|
||||
#endif /* C style interface */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* __ID3D11On12Device_INTERFACE_DEFINED__ */
|
||||
|
||||
|
||||
/* interface __MIDL_itf_d3d11on12_0000_0001 */
|
||||
/* [local] */
|
||||
|
||||
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
|
||||
#pragma endregion
|
||||
DEFINE_GUID(IID_ID3D11On12Device,0x85611e73,0x70a9,0x490e,0x96,0x14,0xa9,0xe3,0x02,0x77,0x79,0x04);
|
||||
|
||||
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3d11on12_0000_0001_v0_0_c_ifspec;
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3d11on12_0000_0001_v0_0_s_ifspec;
|
||||
|
||||
/* Additional Prototypes for ALL interfaces */
|
||||
|
||||
/* end of Additional Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+601
@@ -0,0 +1,601 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: D3D11Shader.h
|
||||
// Content: D3D11 Shader Types and APIs
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __D3D11SHADER_H__
|
||||
#define __D3D11SHADER_H__
|
||||
|
||||
#include "d3dcommon.h"
|
||||
|
||||
|
||||
typedef enum D3D11_SHADER_VERSION_TYPE
|
||||
{
|
||||
D3D11_SHVER_PIXEL_SHADER = 0,
|
||||
D3D11_SHVER_VERTEX_SHADER = 1,
|
||||
D3D11_SHVER_GEOMETRY_SHADER = 2,
|
||||
|
||||
// D3D11 Shaders
|
||||
D3D11_SHVER_HULL_SHADER = 3,
|
||||
D3D11_SHVER_DOMAIN_SHADER = 4,
|
||||
D3D11_SHVER_COMPUTE_SHADER = 5,
|
||||
|
||||
D3D11_SHVER_RESERVED0 = 0xFFF0,
|
||||
} D3D11_SHADER_VERSION_TYPE;
|
||||
|
||||
#define D3D11_SHVER_GET_TYPE(_Version) \
|
||||
(((_Version) >> 16) & 0xffff)
|
||||
#define D3D11_SHVER_GET_MAJOR(_Version) \
|
||||
(((_Version) >> 4) & 0xf)
|
||||
#define D3D11_SHVER_GET_MINOR(_Version) \
|
||||
(((_Version) >> 0) & 0xf)
|
||||
|
||||
// Slot ID for library function return
|
||||
#define D3D_RETURN_PARAMETER_INDEX (-1)
|
||||
|
||||
typedef D3D_RESOURCE_RETURN_TYPE D3D11_RESOURCE_RETURN_TYPE;
|
||||
|
||||
typedef D3D_CBUFFER_TYPE D3D11_CBUFFER_TYPE;
|
||||
|
||||
|
||||
typedef struct _D3D11_SIGNATURE_PARAMETER_DESC
|
||||
{
|
||||
LPCSTR SemanticName; // Name of the semantic
|
||||
UINT SemanticIndex; // Index of the semantic
|
||||
UINT Register; // Number of member variables
|
||||
D3D_NAME SystemValueType;// A predefined system value, or D3D_NAME_UNDEFINED if not applicable
|
||||
D3D_REGISTER_COMPONENT_TYPE ComponentType; // Scalar type (e.g. uint, float, etc.)
|
||||
BYTE Mask; // Mask to indicate which components of the register
|
||||
// are used (combination of D3D10_COMPONENT_MASK values)
|
||||
BYTE ReadWriteMask; // Mask to indicate whether a given component is
|
||||
// never written (if this is an output signature) or
|
||||
// always read (if this is an input signature).
|
||||
// (combination of D3D_MASK_* values)
|
||||
UINT Stream; // Stream index
|
||||
D3D_MIN_PRECISION MinPrecision; // Minimum desired interpolation precision
|
||||
} D3D11_SIGNATURE_PARAMETER_DESC;
|
||||
|
||||
typedef struct _D3D11_SHADER_BUFFER_DESC
|
||||
{
|
||||
LPCSTR Name; // Name of the constant buffer
|
||||
D3D_CBUFFER_TYPE Type; // Indicates type of buffer content
|
||||
UINT Variables; // Number of member variables
|
||||
UINT Size; // Size of CB (in bytes)
|
||||
UINT uFlags; // Buffer description flags
|
||||
} D3D11_SHADER_BUFFER_DESC;
|
||||
|
||||
typedef struct _D3D11_SHADER_VARIABLE_DESC
|
||||
{
|
||||
LPCSTR Name; // Name of the variable
|
||||
UINT StartOffset; // Offset in constant buffer's backing store
|
||||
UINT Size; // Size of variable (in bytes)
|
||||
UINT uFlags; // Variable flags
|
||||
LPVOID DefaultValue; // Raw pointer to default value
|
||||
UINT StartTexture; // First texture index (or -1 if no textures used)
|
||||
UINT TextureSize; // Number of texture slots possibly used.
|
||||
UINT StartSampler; // First sampler index (or -1 if no textures used)
|
||||
UINT SamplerSize; // Number of sampler slots possibly used.
|
||||
} D3D11_SHADER_VARIABLE_DESC;
|
||||
|
||||
typedef struct _D3D11_SHADER_TYPE_DESC
|
||||
{
|
||||
D3D_SHADER_VARIABLE_CLASS Class; // Variable class (e.g. object, matrix, etc.)
|
||||
D3D_SHADER_VARIABLE_TYPE Type; // Variable type (e.g. float, sampler, etc.)
|
||||
UINT Rows; // Number of rows (for matrices, 1 for other numeric, 0 if not applicable)
|
||||
UINT Columns; // Number of columns (for vectors & matrices, 1 for other numeric, 0 if not applicable)
|
||||
UINT Elements; // Number of elements (0 if not an array)
|
||||
UINT Members; // Number of members (0 if not a structure)
|
||||
UINT Offset; // Offset from the start of structure (0 if not a structure member)
|
||||
LPCSTR Name; // Name of type, can be NULL
|
||||
} D3D11_SHADER_TYPE_DESC;
|
||||
|
||||
typedef D3D_TESSELLATOR_DOMAIN D3D11_TESSELLATOR_DOMAIN;
|
||||
|
||||
typedef D3D_TESSELLATOR_PARTITIONING D3D11_TESSELLATOR_PARTITIONING;
|
||||
|
||||
typedef D3D_TESSELLATOR_OUTPUT_PRIMITIVE D3D11_TESSELLATOR_OUTPUT_PRIMITIVE;
|
||||
|
||||
typedef struct _D3D11_SHADER_DESC
|
||||
{
|
||||
UINT Version; // Shader version
|
||||
LPCSTR Creator; // Creator string
|
||||
UINT Flags; // Shader compilation/parse flags
|
||||
|
||||
UINT ConstantBuffers; // Number of constant buffers
|
||||
UINT BoundResources; // Number of bound resources
|
||||
UINT InputParameters; // Number of parameters in the input signature
|
||||
UINT OutputParameters; // Number of parameters in the output signature
|
||||
|
||||
UINT InstructionCount; // Number of emitted instructions
|
||||
UINT TempRegisterCount; // Number of temporary registers used
|
||||
UINT TempArrayCount; // Number of temporary arrays used
|
||||
UINT DefCount; // Number of constant defines
|
||||
UINT DclCount; // Number of declarations (input + output)
|
||||
UINT TextureNormalInstructions; // Number of non-categorized texture instructions
|
||||
UINT TextureLoadInstructions; // Number of texture load instructions
|
||||
UINT TextureCompInstructions; // Number of texture comparison instructions
|
||||
UINT TextureBiasInstructions; // Number of texture bias instructions
|
||||
UINT TextureGradientInstructions; // Number of texture gradient instructions
|
||||
UINT FloatInstructionCount; // Number of floating point arithmetic instructions used
|
||||
UINT IntInstructionCount; // Number of signed integer arithmetic instructions used
|
||||
UINT UintInstructionCount; // Number of unsigned integer arithmetic instructions used
|
||||
UINT StaticFlowControlCount; // Number of static flow control instructions used
|
||||
UINT DynamicFlowControlCount; // Number of dynamic flow control instructions used
|
||||
UINT MacroInstructionCount; // Number of macro instructions used
|
||||
UINT ArrayInstructionCount; // Number of array instructions used
|
||||
UINT CutInstructionCount; // Number of cut instructions used
|
||||
UINT EmitInstructionCount; // Number of emit instructions used
|
||||
D3D_PRIMITIVE_TOPOLOGY GSOutputTopology; // Geometry shader output topology
|
||||
UINT GSMaxOutputVertexCount; // Geometry shader maximum output vertex count
|
||||
D3D_PRIMITIVE InputPrimitive; // GS/HS input primitive
|
||||
UINT PatchConstantParameters; // Number of parameters in the patch constant signature
|
||||
UINT cGSInstanceCount; // Number of Geometry shader instances
|
||||
UINT cControlPoints; // Number of control points in the HS->DS stage
|
||||
D3D_TESSELLATOR_OUTPUT_PRIMITIVE HSOutputPrimitive; // Primitive output by the tessellator
|
||||
D3D_TESSELLATOR_PARTITIONING HSPartitioning; // Partitioning mode of the tessellator
|
||||
D3D_TESSELLATOR_DOMAIN TessellatorDomain; // Domain of the tessellator (quad, tri, isoline)
|
||||
// instruction counts
|
||||
UINT cBarrierInstructions; // Number of barrier instructions in a compute shader
|
||||
UINT cInterlockedInstructions; // Number of interlocked instructions
|
||||
UINT cTextureStoreInstructions; // Number of texture writes
|
||||
} D3D11_SHADER_DESC;
|
||||
|
||||
typedef struct _D3D11_SHADER_INPUT_BIND_DESC
|
||||
{
|
||||
LPCSTR Name; // Name of the resource
|
||||
D3D_SHADER_INPUT_TYPE Type; // Type of resource (e.g. texture, cbuffer, etc.)
|
||||
UINT BindPoint; // Starting bind point
|
||||
UINT BindCount; // Number of contiguous bind points (for arrays)
|
||||
|
||||
UINT uFlags; // Input binding flags
|
||||
D3D_RESOURCE_RETURN_TYPE ReturnType; // Return type (if texture)
|
||||
D3D_SRV_DIMENSION Dimension; // Dimension (if texture)
|
||||
UINT NumSamples; // Number of samples (0 if not MS texture)
|
||||
} D3D11_SHADER_INPUT_BIND_DESC;
|
||||
|
||||
#define D3D_SHADER_REQUIRES_DOUBLES 0x00000001
|
||||
#define D3D_SHADER_REQUIRES_EARLY_DEPTH_STENCIL 0x00000002
|
||||
#define D3D_SHADER_REQUIRES_UAVS_AT_EVERY_STAGE 0x00000004
|
||||
#define D3D_SHADER_REQUIRES_64_UAVS 0x00000008
|
||||
#define D3D_SHADER_REQUIRES_MINIMUM_PRECISION 0x00000010
|
||||
#define D3D_SHADER_REQUIRES_11_1_DOUBLE_EXTENSIONS 0x00000020
|
||||
#define D3D_SHADER_REQUIRES_11_1_SHADER_EXTENSIONS 0x00000040
|
||||
#define D3D_SHADER_REQUIRES_LEVEL_9_COMPARISON_FILTERING 0x00000080
|
||||
#define D3D_SHADER_REQUIRES_TILED_RESOURCES 0x00000100
|
||||
|
||||
|
||||
typedef struct _D3D11_LIBRARY_DESC
|
||||
{
|
||||
LPCSTR Creator; // The name of the originator of the library.
|
||||
UINT Flags; // Compilation flags.
|
||||
UINT FunctionCount; // Number of functions exported from the library.
|
||||
} D3D11_LIBRARY_DESC;
|
||||
|
||||
typedef struct _D3D11_FUNCTION_DESC
|
||||
{
|
||||
UINT Version; // Shader version
|
||||
LPCSTR Creator; // Creator string
|
||||
UINT Flags; // Shader compilation/parse flags
|
||||
|
||||
UINT ConstantBuffers; // Number of constant buffers
|
||||
UINT BoundResources; // Number of bound resources
|
||||
|
||||
UINT InstructionCount; // Number of emitted instructions
|
||||
UINT TempRegisterCount; // Number of temporary registers used
|
||||
UINT TempArrayCount; // Number of temporary arrays used
|
||||
UINT DefCount; // Number of constant defines
|
||||
UINT DclCount; // Number of declarations (input + output)
|
||||
UINT TextureNormalInstructions; // Number of non-categorized texture instructions
|
||||
UINT TextureLoadInstructions; // Number of texture load instructions
|
||||
UINT TextureCompInstructions; // Number of texture comparison instructions
|
||||
UINT TextureBiasInstructions; // Number of texture bias instructions
|
||||
UINT TextureGradientInstructions; // Number of texture gradient instructions
|
||||
UINT FloatInstructionCount; // Number of floating point arithmetic instructions used
|
||||
UINT IntInstructionCount; // Number of signed integer arithmetic instructions used
|
||||
UINT UintInstructionCount; // Number of unsigned integer arithmetic instructions used
|
||||
UINT StaticFlowControlCount; // Number of static flow control instructions used
|
||||
UINT DynamicFlowControlCount; // Number of dynamic flow control instructions used
|
||||
UINT MacroInstructionCount; // Number of macro instructions used
|
||||
UINT ArrayInstructionCount; // Number of array instructions used
|
||||
UINT MovInstructionCount; // Number of mov instructions used
|
||||
UINT MovcInstructionCount; // Number of movc instructions used
|
||||
UINT ConversionInstructionCount; // Number of type conversion instructions used
|
||||
UINT BitwiseInstructionCount; // Number of bitwise arithmetic instructions used
|
||||
D3D_FEATURE_LEVEL MinFeatureLevel; // Min target of the function byte code
|
||||
UINT64 RequiredFeatureFlags; // Required feature flags
|
||||
|
||||
LPCSTR Name; // Function name
|
||||
INT FunctionParameterCount; // Number of logical parameters in the function signature (not including return)
|
||||
BOOL HasReturn; // TRUE, if function returns a value, false - it is a subroutine
|
||||
BOOL Has10Level9VertexShader; // TRUE, if there is a 10L9 VS blob
|
||||
BOOL Has10Level9PixelShader; // TRUE, if there is a 10L9 PS blob
|
||||
} D3D11_FUNCTION_DESC;
|
||||
|
||||
typedef struct _D3D11_PARAMETER_DESC
|
||||
{
|
||||
LPCSTR Name; // Parameter name.
|
||||
LPCSTR SemanticName; // Parameter semantic name (+index).
|
||||
D3D_SHADER_VARIABLE_TYPE Type; // Element type.
|
||||
D3D_SHADER_VARIABLE_CLASS Class; // Scalar/Vector/Matrix.
|
||||
UINT Rows; // Rows are for matrix parameters.
|
||||
UINT Columns; // Components or Columns in matrix.
|
||||
D3D_INTERPOLATION_MODE InterpolationMode; // Interpolation mode.
|
||||
D3D_PARAMETER_FLAGS Flags; // Parameter modifiers.
|
||||
|
||||
UINT FirstInRegister; // The first input register for this parameter.
|
||||
UINT FirstInComponent; // The first input register component for this parameter.
|
||||
UINT FirstOutRegister; // The first output register for this parameter.
|
||||
UINT FirstOutComponent; // The first output register component for this parameter.
|
||||
} D3D11_PARAMETER_DESC;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Interfaces ////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef interface ID3D11ShaderReflectionType ID3D11ShaderReflectionType;
|
||||
typedef interface ID3D11ShaderReflectionType *LPD3D11SHADERREFLECTIONTYPE;
|
||||
|
||||
typedef interface ID3D11ShaderReflectionVariable ID3D11ShaderReflectionVariable;
|
||||
typedef interface ID3D11ShaderReflectionVariable *LPD3D11SHADERREFLECTIONVARIABLE;
|
||||
|
||||
typedef interface ID3D11ShaderReflectionConstantBuffer ID3D11ShaderReflectionConstantBuffer;
|
||||
typedef interface ID3D11ShaderReflectionConstantBuffer *LPD3D11SHADERREFLECTIONCONSTANTBUFFER;
|
||||
|
||||
typedef interface ID3D11ShaderReflection ID3D11ShaderReflection;
|
||||
typedef interface ID3D11ShaderReflection *LPD3D11SHADERREFLECTION;
|
||||
|
||||
typedef interface ID3D11LibraryReflection ID3D11LibraryReflection;
|
||||
typedef interface ID3D11LibraryReflection *LPD3D11LIBRARYREFLECTION;
|
||||
|
||||
typedef interface ID3D11FunctionReflection ID3D11FunctionReflection;
|
||||
typedef interface ID3D11FunctionReflection *LPD3D11FUNCTIONREFLECTION;
|
||||
|
||||
typedef interface ID3D11FunctionParameterReflection ID3D11FunctionParameterReflection;
|
||||
typedef interface ID3D11FunctionParameterReflection *LPD3D11FUNCTIONPARAMETERREFLECTION;
|
||||
|
||||
// {6E6FFA6A-9BAE-4613-A51E-91652D508C21}
|
||||
interface DECLSPEC_UUID("6E6FFA6A-9BAE-4613-A51E-91652D508C21") ID3D11ShaderReflectionType;
|
||||
DEFINE_GUID(IID_ID3D11ShaderReflectionType,
|
||||
0x6e6ffa6a, 0x9bae, 0x4613, 0xa5, 0x1e, 0x91, 0x65, 0x2d, 0x50, 0x8c, 0x21);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11ShaderReflectionType
|
||||
|
||||
DECLARE_INTERFACE(ID3D11ShaderReflectionType)
|
||||
{
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D11_SHADER_TYPE_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionType*, GetMemberTypeByIndex)(THIS_ _In_ UINT Index) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionType*, GetMemberTypeByName)(THIS_ _In_ LPCSTR Name) PURE;
|
||||
STDMETHOD_(LPCSTR, GetMemberTypeName)(THIS_ _In_ UINT Index) PURE;
|
||||
|
||||
STDMETHOD(IsEqual)(THIS_ _In_ ID3D11ShaderReflectionType* pType) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionType*, GetSubType)(THIS) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionType*, GetBaseClass)(THIS) PURE;
|
||||
STDMETHOD_(UINT, GetNumInterfaces)(THIS) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionType*, GetInterfaceByIndex)(THIS_ _In_ UINT uIndex) PURE;
|
||||
STDMETHOD(IsOfType)(THIS_ _In_ ID3D11ShaderReflectionType* pType) PURE;
|
||||
STDMETHOD(ImplementsInterface)(THIS_ _In_ ID3D11ShaderReflectionType* pBase) PURE;
|
||||
};
|
||||
|
||||
// {51F23923-F3E5-4BD1-91CB-606177D8DB4C}
|
||||
interface DECLSPEC_UUID("51F23923-F3E5-4BD1-91CB-606177D8DB4C") ID3D11ShaderReflectionVariable;
|
||||
DEFINE_GUID(IID_ID3D11ShaderReflectionVariable,
|
||||
0x51f23923, 0xf3e5, 0x4bd1, 0x91, 0xcb, 0x60, 0x61, 0x77, 0xd8, 0xdb, 0x4c);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11ShaderReflectionVariable
|
||||
|
||||
DECLARE_INTERFACE(ID3D11ShaderReflectionVariable)
|
||||
{
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D11_SHADER_VARIABLE_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionType*, GetType)(THIS) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionConstantBuffer*, GetBuffer)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(UINT, GetInterfaceSlot)(THIS_ _In_ UINT uArrayIndex) PURE;
|
||||
};
|
||||
|
||||
// {EB62D63D-93DD-4318-8AE8-C6F83AD371B8}
|
||||
interface DECLSPEC_UUID("EB62D63D-93DD-4318-8AE8-C6F83AD371B8") ID3D11ShaderReflectionConstantBuffer;
|
||||
DEFINE_GUID(IID_ID3D11ShaderReflectionConstantBuffer,
|
||||
0xeb62d63d, 0x93dd, 0x4318, 0x8a, 0xe8, 0xc6, 0xf8, 0x3a, 0xd3, 0x71, 0xb8);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11ShaderReflectionConstantBuffer
|
||||
|
||||
DECLARE_INTERFACE(ID3D11ShaderReflectionConstantBuffer)
|
||||
{
|
||||
STDMETHOD(GetDesc)(THIS_ D3D11_SHADER_BUFFER_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionVariable*, GetVariableByIndex)(THIS_ _In_ UINT Index) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionVariable*, GetVariableByName)(THIS_ _In_ LPCSTR Name) PURE;
|
||||
};
|
||||
|
||||
// The ID3D11ShaderReflection IID may change from SDK version to SDK version
|
||||
// if the reflection API changes. This prevents new code with the new API
|
||||
// from working with an old binary. Recompiling with the new header
|
||||
// will pick up the new IID.
|
||||
|
||||
// 8d536ca1-0cca-4956-a837-786963755584
|
||||
interface DECLSPEC_UUID("8d536ca1-0cca-4956-a837-786963755584") ID3D11ShaderReflection;
|
||||
DEFINE_GUID(IID_ID3D11ShaderReflection,
|
||||
0x8d536ca1, 0x0cca, 0x4956, 0xa8, 0x37, 0x78, 0x69, 0x63, 0x75, 0x55, 0x84);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11ShaderReflection
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11ShaderReflection, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid,
|
||||
_Out_ LPVOID *ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D11_SHADER_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionConstantBuffer*, GetConstantBufferByIndex)(THIS_ _In_ UINT Index) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionConstantBuffer*, GetConstantBufferByName)(THIS_ _In_ LPCSTR Name) PURE;
|
||||
|
||||
STDMETHOD(GetResourceBindingDesc)(THIS_ _In_ UINT ResourceIndex,
|
||||
_Out_ D3D11_SHADER_INPUT_BIND_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD(GetInputParameterDesc)(THIS_ _In_ UINT ParameterIndex,
|
||||
_Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
|
||||
STDMETHOD(GetOutputParameterDesc)(THIS_ _In_ UINT ParameterIndex,
|
||||
_Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
|
||||
STDMETHOD(GetPatchConstantParameterDesc)(THIS_ _In_ UINT ParameterIndex,
|
||||
_Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionVariable*, GetVariableByName)(THIS_ _In_ LPCSTR Name) PURE;
|
||||
|
||||
STDMETHOD(GetResourceBindingDescByName)(THIS_ _In_ LPCSTR Name,
|
||||
_Out_ D3D11_SHADER_INPUT_BIND_DESC *pDesc) PURE;
|
||||
|
||||
STDMETHOD_(UINT, GetMovInstructionCount)(THIS) PURE;
|
||||
STDMETHOD_(UINT, GetMovcInstructionCount)(THIS) PURE;
|
||||
STDMETHOD_(UINT, GetConversionInstructionCount)(THIS) PURE;
|
||||
STDMETHOD_(UINT, GetBitwiseInstructionCount)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(D3D_PRIMITIVE, GetGSInputPrimitive)(THIS) PURE;
|
||||
STDMETHOD_(BOOL, IsSampleFrequencyShader)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(UINT, GetNumInterfaceSlots)(THIS) PURE;
|
||||
STDMETHOD(GetMinFeatureLevel)(THIS_ _Out_ enum D3D_FEATURE_LEVEL* pLevel) PURE;
|
||||
|
||||
STDMETHOD_(UINT, GetThreadGroupSize)(THIS_
|
||||
_Out_opt_ UINT* pSizeX,
|
||||
_Out_opt_ UINT* pSizeY,
|
||||
_Out_opt_ UINT* pSizeZ) PURE;
|
||||
|
||||
STDMETHOD_(UINT64, GetRequiresFlags)(THIS) PURE;
|
||||
};
|
||||
|
||||
// {54384F1B-5B3E-4BB7-AE01-60BA3097CBB6}
|
||||
interface DECLSPEC_UUID("54384F1B-5B3E-4BB7-AE01-60BA3097CBB6") ID3D11LibraryReflection;
|
||||
DEFINE_GUID(IID_ID3D11LibraryReflection,
|
||||
0x54384f1b, 0x5b3e, 0x4bb7, 0xae, 0x1, 0x60, 0xba, 0x30, 0x97, 0xcb, 0xb6);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11LibraryReflection
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11LibraryReflection, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid, _Out_ LPVOID * ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D11_LIBRARY_DESC * pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11FunctionReflection *, GetFunctionByIndex)(THIS_ _In_ INT FunctionIndex) PURE;
|
||||
};
|
||||
|
||||
// {207BCECB-D683-4A06-A8A3-9B149B9F73A4}
|
||||
interface DECLSPEC_UUID("207BCECB-D683-4A06-A8A3-9B149B9F73A4") ID3D11FunctionReflection;
|
||||
DEFINE_GUID(IID_ID3D11FunctionReflection,
|
||||
0x207bcecb, 0xd683, 0x4a06, 0xa8, 0xa3, 0x9b, 0x14, 0x9b, 0x9f, 0x73, 0xa4);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11FunctionReflection
|
||||
|
||||
DECLARE_INTERFACE(ID3D11FunctionReflection)
|
||||
{
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D11_FUNCTION_DESC * pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionConstantBuffer *, GetConstantBufferByIndex)(THIS_ _In_ UINT BufferIndex) PURE;
|
||||
STDMETHOD_(ID3D11ShaderReflectionConstantBuffer *, GetConstantBufferByName)(THIS_ _In_ LPCSTR Name) PURE;
|
||||
|
||||
STDMETHOD(GetResourceBindingDesc)(THIS_ _In_ UINT ResourceIndex,
|
||||
_Out_ D3D11_SHADER_INPUT_BIND_DESC * pDesc) PURE;
|
||||
|
||||
STDMETHOD_(ID3D11ShaderReflectionVariable *, GetVariableByName)(THIS_ _In_ LPCSTR Name) PURE;
|
||||
|
||||
STDMETHOD(GetResourceBindingDescByName)(THIS_ _In_ LPCSTR Name,
|
||||
_Out_ D3D11_SHADER_INPUT_BIND_DESC * pDesc) PURE;
|
||||
|
||||
// Use D3D_RETURN_PARAMETER_INDEX to get description of the return value.
|
||||
STDMETHOD_(ID3D11FunctionParameterReflection *, GetFunctionParameter)(THIS_ _In_ INT ParameterIndex) PURE;
|
||||
};
|
||||
|
||||
// {42757488-334F-47FE-982E-1A65D08CC462}
|
||||
interface DECLSPEC_UUID("42757488-334F-47FE-982E-1A65D08CC462") ID3D11FunctionParameterReflection;
|
||||
DEFINE_GUID(IID_ID3D11FunctionParameterReflection,
|
||||
0x42757488, 0x334f, 0x47fe, 0x98, 0x2e, 0x1a, 0x65, 0xd0, 0x8c, 0xc4, 0x62);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11FunctionParameterReflection
|
||||
|
||||
DECLARE_INTERFACE(ID3D11FunctionParameterReflection)
|
||||
{
|
||||
STDMETHOD(GetDesc)(THIS_ _Out_ D3D11_PARAMETER_DESC * pDesc) PURE;
|
||||
};
|
||||
|
||||
// {CAC701EE-80FC-4122-8242-10B39C8CEC34}
|
||||
interface DECLSPEC_UUID("CAC701EE-80FC-4122-8242-10B39C8CEC34") ID3D11Module;
|
||||
DEFINE_GUID(IID_ID3D11Module,
|
||||
0xcac701ee, 0x80fc, 0x4122, 0x82, 0x42, 0x10, 0xb3, 0x9c, 0x8c, 0xec, 0x34);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11Module
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11Module, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid, _Out_ LPVOID * ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
// Create an instance of a module for resource re-binding.
|
||||
STDMETHOD(CreateInstance)(THIS_ _In_opt_ LPCSTR pNamespace,
|
||||
_COM_Outptr_ interface ID3D11ModuleInstance ** ppModuleInstance) PURE;
|
||||
};
|
||||
|
||||
|
||||
// {469E07F7-045A-48D5-AA12-68A478CDF75D}
|
||||
interface DECLSPEC_UUID("469E07F7-045A-48D5-AA12-68A478CDF75D") ID3D11ModuleInstance;
|
||||
DEFINE_GUID(IID_ID3D11ModuleInstance,
|
||||
0x469e07f7, 0x45a, 0x48d5, 0xaa, 0x12, 0x68, 0xa4, 0x78, 0xcd, 0xf7, 0x5d);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11ModuleInstance
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11ModuleInstance, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid, _Out_ LPVOID * ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
//
|
||||
// Resource binding API.
|
||||
//
|
||||
STDMETHOD(BindConstantBuffer)(THIS_ _In_ UINT uSrcSlot, _In_ UINT uDstSlot, _In_ UINT cbDstOffset) PURE;
|
||||
STDMETHOD(BindConstantBufferByName)(THIS_ _In_ LPCSTR pName, _In_ UINT uDstSlot, _In_ UINT cbDstOffset) PURE;
|
||||
|
||||
STDMETHOD(BindResource)(THIS_ _In_ UINT uSrcSlot, _In_ UINT uDstSlot, _In_ UINT uCount) PURE;
|
||||
STDMETHOD(BindResourceByName)(THIS_ _In_ LPCSTR pName, _In_ UINT uDstSlot, _In_ UINT uCount) PURE;
|
||||
|
||||
STDMETHOD(BindSampler)(THIS_ _In_ UINT uSrcSlot, _In_ UINT uDstSlot, _In_ UINT uCount) PURE;
|
||||
STDMETHOD(BindSamplerByName)(THIS_ _In_ LPCSTR pName, _In_ UINT uDstSlot, _In_ UINT uCount) PURE;
|
||||
|
||||
STDMETHOD(BindUnorderedAccessView)(THIS_ _In_ UINT uSrcSlot, _In_ UINT uDstSlot, _In_ UINT uCount) PURE;
|
||||
STDMETHOD(BindUnorderedAccessViewByName)(THIS_ _In_ LPCSTR pName, _In_ UINT uDstSlot, _In_ UINT uCount) PURE;
|
||||
|
||||
STDMETHOD(BindResourceAsUnorderedAccessView)(THIS_ _In_ UINT uSrcSrvSlot, _In_ UINT uDstUavSlot, _In_ UINT uCount) PURE;
|
||||
STDMETHOD(BindResourceAsUnorderedAccessViewByName)(THIS_ _In_ LPCSTR pSrvName, _In_ UINT uDstUavSlot, _In_ UINT uCount) PURE;
|
||||
};
|
||||
|
||||
|
||||
// {59A6CD0E-E10D-4C1F-88C0-63ABA1DAF30E}
|
||||
interface DECLSPEC_UUID("59A6CD0E-E10D-4C1F-88C0-63ABA1DAF30E") ID3D11Linker;
|
||||
DEFINE_GUID(IID_ID3D11Linker,
|
||||
0x59a6cd0e, 0xe10d, 0x4c1f, 0x88, 0xc0, 0x63, 0xab, 0xa1, 0xda, 0xf3, 0xe);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11Linker
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11Linker, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid, _Out_ LPVOID * ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
// Link the shader and produce a shader blob suitable to D3D runtime.
|
||||
STDMETHOD(Link)(THIS_ _In_ interface ID3D11ModuleInstance * pEntry,
|
||||
_In_ LPCSTR pEntryName,
|
||||
_In_ LPCSTR pTargetName,
|
||||
_In_ UINT uFlags,
|
||||
_COM_Outptr_ ID3DBlob ** ppShaderBlob,
|
||||
_Always_(_Outptr_opt_result_maybenull_) ID3DBlob ** ppErrorBuffer) PURE;
|
||||
|
||||
// Add an instance of a library module to be used for linking.
|
||||
STDMETHOD(UseLibrary)(THIS_ _In_ interface ID3D11ModuleInstance * pLibraryMI) PURE;
|
||||
|
||||
// Add a clip plane with the plane coefficients taken from a cbuffer entry for 10L9 shaders.
|
||||
STDMETHOD(AddClipPlaneFromCBuffer)(THIS_ _In_ UINT uCBufferSlot, _In_ UINT uCBufferEntry) PURE;
|
||||
};
|
||||
|
||||
|
||||
// {D80DD70C-8D2F-4751-94A1-03C79B3556DB}
|
||||
interface DECLSPEC_UUID("D80DD70C-8D2F-4751-94A1-03C79B3556DB") ID3D11LinkingNode;
|
||||
DEFINE_GUID(IID_ID3D11LinkingNode,
|
||||
0xd80dd70c, 0x8d2f, 0x4751, 0x94, 0xa1, 0x3, 0xc7, 0x9b, 0x35, 0x56, 0xdb);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11LinkingNode
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11LinkingNode, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid, _Out_ LPVOID * ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
};
|
||||
|
||||
|
||||
// {54133220-1CE8-43D3-8236-9855C5CEECFF}
|
||||
interface DECLSPEC_UUID("54133220-1CE8-43D3-8236-9855C5CEECFF") ID3D11FunctionLinkingGraph;
|
||||
DEFINE_GUID(IID_ID3D11FunctionLinkingGraph,
|
||||
0x54133220, 0x1ce8, 0x43d3, 0x82, 0x36, 0x98, 0x55, 0xc5, 0xce, 0xec, 0xff);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3D11FunctionLinkingGraph
|
||||
|
||||
DECLARE_INTERFACE_(ID3D11FunctionLinkingGraph, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface)(THIS_ _In_ REFIID iid, _Out_ LPVOID * ppv) PURE;
|
||||
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release)(THIS) PURE;
|
||||
|
||||
// Create a shader module out of FLG description.
|
||||
STDMETHOD(CreateModuleInstance)(THIS_ _COM_Outptr_ interface ID3D11ModuleInstance ** ppModuleInstance,
|
||||
_Always_(_Outptr_opt_result_maybenull_) ID3DBlob ** ppErrorBuffer) PURE;
|
||||
|
||||
STDMETHOD(SetInputSignature)(THIS_ __in_ecount(cInputParameters) const D3D11_PARAMETER_DESC * pInputParameters,
|
||||
_In_ UINT cInputParameters,
|
||||
_COM_Outptr_ interface ID3D11LinkingNode ** ppInputNode) PURE;
|
||||
|
||||
STDMETHOD(SetOutputSignature)(THIS_ __in_ecount(cOutputParameters) const D3D11_PARAMETER_DESC * pOutputParameters,
|
||||
_In_ UINT cOutputParameters,
|
||||
_COM_Outptr_ interface ID3D11LinkingNode ** ppOutputNode) PURE;
|
||||
|
||||
STDMETHOD(CallFunction)(THIS_ _In_opt_ LPCSTR pModuleInstanceNamespace,
|
||||
_In_ interface ID3D11Module * pModuleWithFunctionPrototype,
|
||||
_In_ LPCSTR pFunctionName,
|
||||
_COM_Outptr_ interface ID3D11LinkingNode ** ppCallNode) PURE;
|
||||
|
||||
STDMETHOD(PassValue)(THIS_ _In_ interface ID3D11LinkingNode * pSrcNode,
|
||||
_In_ INT SrcParameterIndex,
|
||||
_In_ interface ID3D11LinkingNode * pDstNode,
|
||||
_In_ INT DstParameterIndex) PURE;
|
||||
|
||||
STDMETHOD(PassValueWithSwizzle)(THIS_ _In_ interface ID3D11LinkingNode * pSrcNode,
|
||||
_In_ INT SrcParameterIndex,
|
||||
_In_ LPCSTR pSrcSwizzle,
|
||||
_In_ interface ID3D11LinkingNode * pDstNode,
|
||||
_In_ INT DstParameterIndex,
|
||||
_In_ LPCSTR pDstSwizzle) PURE;
|
||||
|
||||
STDMETHOD(GetLastError)(THIS_ _Always_(_Outptr_opt_result_maybenull_) ID3DBlob ** ppErrorBuffer) PURE;
|
||||
|
||||
STDMETHOD(GenerateHlsl)(THIS_ _In_ UINT uFlags, // uFlags is reserved for future use.
|
||||
_COM_Outptr_ ID3DBlob ** ppBuffer) PURE;
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// APIs //////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif //__cplusplus
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif //__cplusplus
|
||||
|
||||
#endif //__D3D11SHADER_H__
|
||||
|
||||
Vendored
+6265
File diff suppressed because it is too large
Load Diff
+1926
File diff suppressed because it is too large
Load Diff
+882
@@ -0,0 +1,882 @@
|
||||
|
||||
|
||||
/* this ALWAYS GENERATED file contains the definitions for the interfaces */
|
||||
|
||||
|
||||
/* File created by MIDL compiler version 8.00.0613 */
|
||||
/* @@MIDL_FILE_HEADING( ) */
|
||||
|
||||
|
||||
|
||||
/* verify that the <rpcndr.h> version is high enough to compile this file*/
|
||||
#ifndef __REQUIRED_RPCNDR_H_VERSION__
|
||||
#define __REQUIRED_RPCNDR_H_VERSION__ 500
|
||||
#endif
|
||||
|
||||
/* verify that the <rpcsal.h> version is high enough to compile this file*/
|
||||
#ifndef __REQUIRED_RPCSAL_H_VERSION__
|
||||
#define __REQUIRED_RPCSAL_H_VERSION__ 100
|
||||
#endif
|
||||
|
||||
#include "rpc.h"
|
||||
#include "rpcndr.h"
|
||||
|
||||
#ifndef __RPCNDR_H_VERSION__
|
||||
#error this stub requires an updated version of <rpcndr.h>
|
||||
#endif /* __RPCNDR_H_VERSION__ */
|
||||
|
||||
#ifndef COM_NO_WINDOWS_H
|
||||
#include "windows.h"
|
||||
#include "ole2.h"
|
||||
#endif /*COM_NO_WINDOWS_H*/
|
||||
|
||||
#ifndef __d3dcommon_h__
|
||||
#define __d3dcommon_h__
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
/* Forward Declarations */
|
||||
|
||||
#ifndef __ID3D10Blob_FWD_DEFINED__
|
||||
#define __ID3D10Blob_FWD_DEFINED__
|
||||
typedef interface ID3D10Blob ID3D10Blob;
|
||||
|
||||
#endif /* __ID3D10Blob_FWD_DEFINED__ */
|
||||
|
||||
|
||||
/* header files for imported files */
|
||||
#include "oaidl.h"
|
||||
#include "ocidl.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
|
||||
/* interface __MIDL_itf_d3dcommon_0000_0000 */
|
||||
/* [local] */
|
||||
|
||||
typedef
|
||||
enum D3D_DRIVER_TYPE
|
||||
{
|
||||
D3D_DRIVER_TYPE_UNKNOWN = 0,
|
||||
D3D_DRIVER_TYPE_HARDWARE = ( D3D_DRIVER_TYPE_UNKNOWN + 1 ) ,
|
||||
D3D_DRIVER_TYPE_REFERENCE = ( D3D_DRIVER_TYPE_HARDWARE + 1 ) ,
|
||||
D3D_DRIVER_TYPE_NULL = ( D3D_DRIVER_TYPE_REFERENCE + 1 ) ,
|
||||
D3D_DRIVER_TYPE_SOFTWARE = ( D3D_DRIVER_TYPE_NULL + 1 ) ,
|
||||
D3D_DRIVER_TYPE_WARP = ( D3D_DRIVER_TYPE_SOFTWARE + 1 )
|
||||
} D3D_DRIVER_TYPE;
|
||||
|
||||
typedef
|
||||
enum D3D_FEATURE_LEVEL
|
||||
{
|
||||
D3D_FEATURE_LEVEL_9_1 = 0x9100,
|
||||
D3D_FEATURE_LEVEL_9_2 = 0x9200,
|
||||
D3D_FEATURE_LEVEL_9_3 = 0x9300,
|
||||
D3D_FEATURE_LEVEL_10_0 = 0xa000,
|
||||
D3D_FEATURE_LEVEL_10_1 = 0xa100,
|
||||
D3D_FEATURE_LEVEL_11_0 = 0xb000,
|
||||
D3D_FEATURE_LEVEL_11_1 = 0xb100,
|
||||
D3D_FEATURE_LEVEL_12_0 = 0xc000,
|
||||
D3D_FEATURE_LEVEL_12_1 = 0xc100
|
||||
} D3D_FEATURE_LEVEL;
|
||||
|
||||
#define D3D_FL9_1_REQ_TEXTURE1D_U_DIMENSION 2048
|
||||
#define D3D_FL9_3_REQ_TEXTURE1D_U_DIMENSION 4096
|
||||
#define D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION 2048
|
||||
#define D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION 4096
|
||||
#define D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION 512
|
||||
#define D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION 4096
|
||||
#define D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION 256
|
||||
#define D3D_FL9_1_DEFAULT_MAX_ANISOTROPY 2
|
||||
#define D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT 65535
|
||||
#define D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT 1048575
|
||||
#define D3D_FL9_1_SIMULTANEOUS_RENDER_TARGET_COUNT 1
|
||||
#define D3D_FL9_3_SIMULTANEOUS_RENDER_TARGET_COUNT 4
|
||||
#define D3D_FL9_1_MAX_TEXTURE_REPEAT 128
|
||||
#define D3D_FL9_2_MAX_TEXTURE_REPEAT 2048
|
||||
#define D3D_FL9_3_MAX_TEXTURE_REPEAT 8192
|
||||
typedef
|
||||
enum D3D_PRIMITIVE_TOPOLOGY
|
||||
{
|
||||
D3D_PRIMITIVE_TOPOLOGY_UNDEFINED = 0,
|
||||
D3D_PRIMITIVE_TOPOLOGY_POINTLIST = 1,
|
||||
D3D_PRIMITIVE_TOPOLOGY_LINELIST = 2,
|
||||
D3D_PRIMITIVE_TOPOLOGY_LINESTRIP = 3,
|
||||
D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,
|
||||
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5,
|
||||
D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10,
|
||||
D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11,
|
||||
D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12,
|
||||
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13,
|
||||
D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = 33,
|
||||
D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = 34,
|
||||
D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST = 35,
|
||||
D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST = 36,
|
||||
D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST = 37,
|
||||
D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST = 38,
|
||||
D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST = 39,
|
||||
D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST = 40,
|
||||
D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST = 41,
|
||||
D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST = 42,
|
||||
D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST = 43,
|
||||
D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST = 44,
|
||||
D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST = 45,
|
||||
D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST = 46,
|
||||
D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST = 47,
|
||||
D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST = 48,
|
||||
D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST = 49,
|
||||
D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST = 50,
|
||||
D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST = 51,
|
||||
D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST = 52,
|
||||
D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST = 53,
|
||||
D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST = 54,
|
||||
D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST = 55,
|
||||
D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST = 56,
|
||||
D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST = 57,
|
||||
D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST = 58,
|
||||
D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST = 59,
|
||||
D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST = 60,
|
||||
D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST = 61,
|
||||
D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST = 62,
|
||||
D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST = 63,
|
||||
D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = 64,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_UNDEFINED = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_POINTLIST = D3D_PRIMITIVE_TOPOLOGY_POINTLIST,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_LINELIST = D3D_PRIMITIVE_TOPOLOGY_LINELIST,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ,
|
||||
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_POINTLIST = D3D_PRIMITIVE_TOPOLOGY_POINTLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_LINELIST = D3D_PRIMITIVE_TOPOLOGY_LINELIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST,
|
||||
D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST
|
||||
} D3D_PRIMITIVE_TOPOLOGY;
|
||||
|
||||
typedef
|
||||
enum D3D_PRIMITIVE
|
||||
{
|
||||
D3D_PRIMITIVE_UNDEFINED = 0,
|
||||
D3D_PRIMITIVE_POINT = 1,
|
||||
D3D_PRIMITIVE_LINE = 2,
|
||||
D3D_PRIMITIVE_TRIANGLE = 3,
|
||||
D3D_PRIMITIVE_LINE_ADJ = 6,
|
||||
D3D_PRIMITIVE_TRIANGLE_ADJ = 7,
|
||||
D3D_PRIMITIVE_1_CONTROL_POINT_PATCH = 8,
|
||||
D3D_PRIMITIVE_2_CONTROL_POINT_PATCH = 9,
|
||||
D3D_PRIMITIVE_3_CONTROL_POINT_PATCH = 10,
|
||||
D3D_PRIMITIVE_4_CONTROL_POINT_PATCH = 11,
|
||||
D3D_PRIMITIVE_5_CONTROL_POINT_PATCH = 12,
|
||||
D3D_PRIMITIVE_6_CONTROL_POINT_PATCH = 13,
|
||||
D3D_PRIMITIVE_7_CONTROL_POINT_PATCH = 14,
|
||||
D3D_PRIMITIVE_8_CONTROL_POINT_PATCH = 15,
|
||||
D3D_PRIMITIVE_9_CONTROL_POINT_PATCH = 16,
|
||||
D3D_PRIMITIVE_10_CONTROL_POINT_PATCH = 17,
|
||||
D3D_PRIMITIVE_11_CONTROL_POINT_PATCH = 18,
|
||||
D3D_PRIMITIVE_12_CONTROL_POINT_PATCH = 19,
|
||||
D3D_PRIMITIVE_13_CONTROL_POINT_PATCH = 20,
|
||||
D3D_PRIMITIVE_14_CONTROL_POINT_PATCH = 21,
|
||||
D3D_PRIMITIVE_15_CONTROL_POINT_PATCH = 22,
|
||||
D3D_PRIMITIVE_16_CONTROL_POINT_PATCH = 23,
|
||||
D3D_PRIMITIVE_17_CONTROL_POINT_PATCH = 24,
|
||||
D3D_PRIMITIVE_18_CONTROL_POINT_PATCH = 25,
|
||||
D3D_PRIMITIVE_19_CONTROL_POINT_PATCH = 26,
|
||||
D3D_PRIMITIVE_20_CONTROL_POINT_PATCH = 27,
|
||||
D3D_PRIMITIVE_21_CONTROL_POINT_PATCH = 28,
|
||||
D3D_PRIMITIVE_22_CONTROL_POINT_PATCH = 29,
|
||||
D3D_PRIMITIVE_23_CONTROL_POINT_PATCH = 30,
|
||||
D3D_PRIMITIVE_24_CONTROL_POINT_PATCH = 31,
|
||||
D3D_PRIMITIVE_25_CONTROL_POINT_PATCH = 32,
|
||||
D3D_PRIMITIVE_26_CONTROL_POINT_PATCH = 33,
|
||||
D3D_PRIMITIVE_27_CONTROL_POINT_PATCH = 34,
|
||||
D3D_PRIMITIVE_28_CONTROL_POINT_PATCH = 35,
|
||||
D3D_PRIMITIVE_29_CONTROL_POINT_PATCH = 36,
|
||||
D3D_PRIMITIVE_30_CONTROL_POINT_PATCH = 37,
|
||||
D3D_PRIMITIVE_31_CONTROL_POINT_PATCH = 38,
|
||||
D3D_PRIMITIVE_32_CONTROL_POINT_PATCH = 39,
|
||||
D3D10_PRIMITIVE_UNDEFINED = D3D_PRIMITIVE_UNDEFINED,
|
||||
D3D10_PRIMITIVE_POINT = D3D_PRIMITIVE_POINT,
|
||||
D3D10_PRIMITIVE_LINE = D3D_PRIMITIVE_LINE,
|
||||
D3D10_PRIMITIVE_TRIANGLE = D3D_PRIMITIVE_TRIANGLE,
|
||||
D3D10_PRIMITIVE_LINE_ADJ = D3D_PRIMITIVE_LINE_ADJ,
|
||||
D3D10_PRIMITIVE_TRIANGLE_ADJ = D3D_PRIMITIVE_TRIANGLE_ADJ,
|
||||
D3D11_PRIMITIVE_UNDEFINED = D3D_PRIMITIVE_UNDEFINED,
|
||||
D3D11_PRIMITIVE_POINT = D3D_PRIMITIVE_POINT,
|
||||
D3D11_PRIMITIVE_LINE = D3D_PRIMITIVE_LINE,
|
||||
D3D11_PRIMITIVE_TRIANGLE = D3D_PRIMITIVE_TRIANGLE,
|
||||
D3D11_PRIMITIVE_LINE_ADJ = D3D_PRIMITIVE_LINE_ADJ,
|
||||
D3D11_PRIMITIVE_TRIANGLE_ADJ = D3D_PRIMITIVE_TRIANGLE_ADJ,
|
||||
D3D11_PRIMITIVE_1_CONTROL_POINT_PATCH = D3D_PRIMITIVE_1_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_2_CONTROL_POINT_PATCH = D3D_PRIMITIVE_2_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_3_CONTROL_POINT_PATCH = D3D_PRIMITIVE_3_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_4_CONTROL_POINT_PATCH = D3D_PRIMITIVE_4_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_5_CONTROL_POINT_PATCH = D3D_PRIMITIVE_5_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_6_CONTROL_POINT_PATCH = D3D_PRIMITIVE_6_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_7_CONTROL_POINT_PATCH = D3D_PRIMITIVE_7_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_8_CONTROL_POINT_PATCH = D3D_PRIMITIVE_8_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_9_CONTROL_POINT_PATCH = D3D_PRIMITIVE_9_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_10_CONTROL_POINT_PATCH = D3D_PRIMITIVE_10_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_11_CONTROL_POINT_PATCH = D3D_PRIMITIVE_11_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_12_CONTROL_POINT_PATCH = D3D_PRIMITIVE_12_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_13_CONTROL_POINT_PATCH = D3D_PRIMITIVE_13_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_14_CONTROL_POINT_PATCH = D3D_PRIMITIVE_14_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_15_CONTROL_POINT_PATCH = D3D_PRIMITIVE_15_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_16_CONTROL_POINT_PATCH = D3D_PRIMITIVE_16_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_17_CONTROL_POINT_PATCH = D3D_PRIMITIVE_17_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_18_CONTROL_POINT_PATCH = D3D_PRIMITIVE_18_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_19_CONTROL_POINT_PATCH = D3D_PRIMITIVE_19_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_20_CONTROL_POINT_PATCH = D3D_PRIMITIVE_20_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_21_CONTROL_POINT_PATCH = D3D_PRIMITIVE_21_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_22_CONTROL_POINT_PATCH = D3D_PRIMITIVE_22_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_23_CONTROL_POINT_PATCH = D3D_PRIMITIVE_23_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_24_CONTROL_POINT_PATCH = D3D_PRIMITIVE_24_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_25_CONTROL_POINT_PATCH = D3D_PRIMITIVE_25_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_26_CONTROL_POINT_PATCH = D3D_PRIMITIVE_26_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_27_CONTROL_POINT_PATCH = D3D_PRIMITIVE_27_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_28_CONTROL_POINT_PATCH = D3D_PRIMITIVE_28_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_29_CONTROL_POINT_PATCH = D3D_PRIMITIVE_29_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_30_CONTROL_POINT_PATCH = D3D_PRIMITIVE_30_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_31_CONTROL_POINT_PATCH = D3D_PRIMITIVE_31_CONTROL_POINT_PATCH,
|
||||
D3D11_PRIMITIVE_32_CONTROL_POINT_PATCH = D3D_PRIMITIVE_32_CONTROL_POINT_PATCH
|
||||
} D3D_PRIMITIVE;
|
||||
|
||||
typedef
|
||||
enum D3D_SRV_DIMENSION
|
||||
{
|
||||
D3D_SRV_DIMENSION_UNKNOWN = 0,
|
||||
D3D_SRV_DIMENSION_BUFFER = 1,
|
||||
D3D_SRV_DIMENSION_TEXTURE1D = 2,
|
||||
D3D_SRV_DIMENSION_TEXTURE1DARRAY = 3,
|
||||
D3D_SRV_DIMENSION_TEXTURE2D = 4,
|
||||
D3D_SRV_DIMENSION_TEXTURE2DARRAY = 5,
|
||||
D3D_SRV_DIMENSION_TEXTURE2DMS = 6,
|
||||
D3D_SRV_DIMENSION_TEXTURE2DMSARRAY = 7,
|
||||
D3D_SRV_DIMENSION_TEXTURE3D = 8,
|
||||
D3D_SRV_DIMENSION_TEXTURECUBE = 9,
|
||||
D3D_SRV_DIMENSION_TEXTURECUBEARRAY = 10,
|
||||
D3D_SRV_DIMENSION_BUFFEREX = 11,
|
||||
D3D10_SRV_DIMENSION_UNKNOWN = D3D_SRV_DIMENSION_UNKNOWN,
|
||||
D3D10_SRV_DIMENSION_BUFFER = D3D_SRV_DIMENSION_BUFFER,
|
||||
D3D10_SRV_DIMENSION_TEXTURE1D = D3D_SRV_DIMENSION_TEXTURE1D,
|
||||
D3D10_SRV_DIMENSION_TEXTURE1DARRAY = D3D_SRV_DIMENSION_TEXTURE1DARRAY,
|
||||
D3D10_SRV_DIMENSION_TEXTURE2D = D3D_SRV_DIMENSION_TEXTURE2D,
|
||||
D3D10_SRV_DIMENSION_TEXTURE2DARRAY = D3D_SRV_DIMENSION_TEXTURE2DARRAY,
|
||||
D3D10_SRV_DIMENSION_TEXTURE2DMS = D3D_SRV_DIMENSION_TEXTURE2DMS,
|
||||
D3D10_SRV_DIMENSION_TEXTURE2DMSARRAY = D3D_SRV_DIMENSION_TEXTURE2DMSARRAY,
|
||||
D3D10_SRV_DIMENSION_TEXTURE3D = D3D_SRV_DIMENSION_TEXTURE3D,
|
||||
D3D10_SRV_DIMENSION_TEXTURECUBE = D3D_SRV_DIMENSION_TEXTURECUBE,
|
||||
D3D10_1_SRV_DIMENSION_UNKNOWN = D3D_SRV_DIMENSION_UNKNOWN,
|
||||
D3D10_1_SRV_DIMENSION_BUFFER = D3D_SRV_DIMENSION_BUFFER,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE1D = D3D_SRV_DIMENSION_TEXTURE1D,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE1DARRAY = D3D_SRV_DIMENSION_TEXTURE1DARRAY,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE2D = D3D_SRV_DIMENSION_TEXTURE2D,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE2DARRAY = D3D_SRV_DIMENSION_TEXTURE2DARRAY,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE2DMS = D3D_SRV_DIMENSION_TEXTURE2DMS,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE2DMSARRAY = D3D_SRV_DIMENSION_TEXTURE2DMSARRAY,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURE3D = D3D_SRV_DIMENSION_TEXTURE3D,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURECUBE = D3D_SRV_DIMENSION_TEXTURECUBE,
|
||||
D3D10_1_SRV_DIMENSION_TEXTURECUBEARRAY = D3D_SRV_DIMENSION_TEXTURECUBEARRAY,
|
||||
D3D11_SRV_DIMENSION_UNKNOWN = D3D_SRV_DIMENSION_UNKNOWN,
|
||||
D3D11_SRV_DIMENSION_BUFFER = D3D_SRV_DIMENSION_BUFFER,
|
||||
D3D11_SRV_DIMENSION_TEXTURE1D = D3D_SRV_DIMENSION_TEXTURE1D,
|
||||
D3D11_SRV_DIMENSION_TEXTURE1DARRAY = D3D_SRV_DIMENSION_TEXTURE1DARRAY,
|
||||
D3D11_SRV_DIMENSION_TEXTURE2D = D3D_SRV_DIMENSION_TEXTURE2D,
|
||||
D3D11_SRV_DIMENSION_TEXTURE2DARRAY = D3D_SRV_DIMENSION_TEXTURE2DARRAY,
|
||||
D3D11_SRV_DIMENSION_TEXTURE2DMS = D3D_SRV_DIMENSION_TEXTURE2DMS,
|
||||
D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY = D3D_SRV_DIMENSION_TEXTURE2DMSARRAY,
|
||||
D3D11_SRV_DIMENSION_TEXTURE3D = D3D_SRV_DIMENSION_TEXTURE3D,
|
||||
D3D11_SRV_DIMENSION_TEXTURECUBE = D3D_SRV_DIMENSION_TEXTURECUBE,
|
||||
D3D11_SRV_DIMENSION_TEXTURECUBEARRAY = D3D_SRV_DIMENSION_TEXTURECUBEARRAY,
|
||||
D3D11_SRV_DIMENSION_BUFFEREX = D3D_SRV_DIMENSION_BUFFEREX
|
||||
} D3D_SRV_DIMENSION;
|
||||
|
||||
typedef struct _D3D_SHADER_MACRO
|
||||
{
|
||||
LPCSTR Name;
|
||||
LPCSTR Definition;
|
||||
} D3D_SHADER_MACRO;
|
||||
|
||||
typedef struct _D3D_SHADER_MACRO *LPD3D_SHADER_MACRO;
|
||||
|
||||
DEFINE_GUID(IID_ID3D10Blob, 0x8ba5fb08, 0x5195, 0x40e2, 0xac, 0x58, 0xd, 0x98, 0x9c, 0x3a, 0x1, 0x2);
|
||||
|
||||
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3dcommon_0000_0000_v0_0_c_ifspec;
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3dcommon_0000_0000_v0_0_s_ifspec;
|
||||
|
||||
#ifndef __ID3D10Blob_INTERFACE_DEFINED__
|
||||
#define __ID3D10Blob_INTERFACE_DEFINED__
|
||||
|
||||
/* interface ID3D10Blob */
|
||||
/* [unique][local][object][uuid] */
|
||||
|
||||
|
||||
EXTERN_C const IID IID_ID3D10Blob;
|
||||
|
||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
|
||||
MIDL_INTERFACE("8BA5FB08-5195-40e2-AC58-0D989C3A0102")
|
||||
ID3D10Blob : public IUnknown
|
||||
{
|
||||
public:
|
||||
virtual LPVOID STDMETHODCALLTYPE GetBufferPointer( void) = 0;
|
||||
|
||||
virtual SIZE_T STDMETHODCALLTYPE GetBufferSize( void) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#else /* C style interface */
|
||||
|
||||
typedef struct ID3D10BlobVtbl
|
||||
{
|
||||
BEGIN_INTERFACE
|
||||
|
||||
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
|
||||
ID3D10Blob * This,
|
||||
/* [in] */ REFIID riid,
|
||||
/* [annotation][iid_is][out] */
|
||||
_COM_Outptr_ void **ppvObject);
|
||||
|
||||
ULONG ( STDMETHODCALLTYPE *AddRef )(
|
||||
ID3D10Blob * This);
|
||||
|
||||
ULONG ( STDMETHODCALLTYPE *Release )(
|
||||
ID3D10Blob * This);
|
||||
|
||||
LPVOID ( STDMETHODCALLTYPE *GetBufferPointer )(
|
||||
ID3D10Blob * This);
|
||||
|
||||
SIZE_T ( STDMETHODCALLTYPE *GetBufferSize )(
|
||||
ID3D10Blob * This);
|
||||
|
||||
END_INTERFACE
|
||||
} ID3D10BlobVtbl;
|
||||
|
||||
interface ID3D10Blob
|
||||
{
|
||||
CONST_VTBL struct ID3D10BlobVtbl *lpVtbl;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#ifdef COBJMACROS
|
||||
|
||||
|
||||
#define ID3D10Blob_QueryInterface(This,riid,ppvObject) \
|
||||
( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
|
||||
|
||||
#define ID3D10Blob_AddRef(This) \
|
||||
( (This)->lpVtbl -> AddRef(This) )
|
||||
|
||||
#define ID3D10Blob_Release(This) \
|
||||
( (This)->lpVtbl -> Release(This) )
|
||||
|
||||
|
||||
#define ID3D10Blob_GetBufferPointer(This) \
|
||||
( (This)->lpVtbl -> GetBufferPointer(This) )
|
||||
|
||||
#define ID3D10Blob_GetBufferSize(This) \
|
||||
( (This)->lpVtbl -> GetBufferSize(This) )
|
||||
|
||||
#endif /* COBJMACROS */
|
||||
|
||||
|
||||
#endif /* C style interface */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* __ID3D10Blob_INTERFACE_DEFINED__ */
|
||||
|
||||
|
||||
/* interface __MIDL_itf_d3dcommon_0000_0001 */
|
||||
/* [local] */
|
||||
|
||||
typedef interface ID3D10Blob* LPD3D10BLOB;
|
||||
typedef ID3D10Blob ID3DBlob;
|
||||
|
||||
typedef ID3DBlob* LPD3DBLOB;
|
||||
#define IID_ID3DBlob IID_ID3D10Blob
|
||||
typedef
|
||||
enum _D3D_INCLUDE_TYPE
|
||||
{
|
||||
D3D_INCLUDE_LOCAL = 0,
|
||||
D3D_INCLUDE_SYSTEM = ( D3D_INCLUDE_LOCAL + 1 ) ,
|
||||
D3D10_INCLUDE_LOCAL = D3D_INCLUDE_LOCAL,
|
||||
D3D10_INCLUDE_SYSTEM = D3D_INCLUDE_SYSTEM,
|
||||
D3D_INCLUDE_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_INCLUDE_TYPE;
|
||||
|
||||
typedef interface ID3DInclude ID3DInclude;
|
||||
#undef INTERFACE
|
||||
#define INTERFACE ID3DInclude
|
||||
DECLARE_INTERFACE(ID3DInclude)
|
||||
{
|
||||
STDMETHOD(Open)(THIS_ D3D_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes) PURE;
|
||||
STDMETHOD(Close)(THIS_ LPCVOID pData) PURE;
|
||||
};
|
||||
typedef ID3DInclude* LPD3DINCLUDE;
|
||||
typedef
|
||||
enum _D3D_SHADER_VARIABLE_CLASS
|
||||
{
|
||||
D3D_SVC_SCALAR = 0,
|
||||
D3D_SVC_VECTOR = ( D3D_SVC_SCALAR + 1 ) ,
|
||||
D3D_SVC_MATRIX_ROWS = ( D3D_SVC_VECTOR + 1 ) ,
|
||||
D3D_SVC_MATRIX_COLUMNS = ( D3D_SVC_MATRIX_ROWS + 1 ) ,
|
||||
D3D_SVC_OBJECT = ( D3D_SVC_MATRIX_COLUMNS + 1 ) ,
|
||||
D3D_SVC_STRUCT = ( D3D_SVC_OBJECT + 1 ) ,
|
||||
D3D_SVC_INTERFACE_CLASS = ( D3D_SVC_STRUCT + 1 ) ,
|
||||
D3D_SVC_INTERFACE_POINTER = ( D3D_SVC_INTERFACE_CLASS + 1 ) ,
|
||||
D3D10_SVC_SCALAR = D3D_SVC_SCALAR,
|
||||
D3D10_SVC_VECTOR = D3D_SVC_VECTOR,
|
||||
D3D10_SVC_MATRIX_ROWS = D3D_SVC_MATRIX_ROWS,
|
||||
D3D10_SVC_MATRIX_COLUMNS = D3D_SVC_MATRIX_COLUMNS,
|
||||
D3D10_SVC_OBJECT = D3D_SVC_OBJECT,
|
||||
D3D10_SVC_STRUCT = D3D_SVC_STRUCT,
|
||||
D3D11_SVC_INTERFACE_CLASS = D3D_SVC_INTERFACE_CLASS,
|
||||
D3D11_SVC_INTERFACE_POINTER = D3D_SVC_INTERFACE_POINTER,
|
||||
D3D_SVC_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_SHADER_VARIABLE_CLASS;
|
||||
|
||||
typedef
|
||||
enum _D3D_SHADER_VARIABLE_FLAGS
|
||||
{
|
||||
D3D_SVF_USERPACKED = 1,
|
||||
D3D_SVF_USED = 2,
|
||||
D3D_SVF_INTERFACE_POINTER = 4,
|
||||
D3D_SVF_INTERFACE_PARAMETER = 8,
|
||||
D3D10_SVF_USERPACKED = D3D_SVF_USERPACKED,
|
||||
D3D10_SVF_USED = D3D_SVF_USED,
|
||||
D3D11_SVF_INTERFACE_POINTER = D3D_SVF_INTERFACE_POINTER,
|
||||
D3D11_SVF_INTERFACE_PARAMETER = D3D_SVF_INTERFACE_PARAMETER,
|
||||
D3D_SVF_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_SHADER_VARIABLE_FLAGS;
|
||||
|
||||
typedef
|
||||
enum _D3D_SHADER_VARIABLE_TYPE
|
||||
{
|
||||
D3D_SVT_VOID = 0,
|
||||
D3D_SVT_BOOL = 1,
|
||||
D3D_SVT_INT = 2,
|
||||
D3D_SVT_FLOAT = 3,
|
||||
D3D_SVT_STRING = 4,
|
||||
D3D_SVT_TEXTURE = 5,
|
||||
D3D_SVT_TEXTURE1D = 6,
|
||||
D3D_SVT_TEXTURE2D = 7,
|
||||
D3D_SVT_TEXTURE3D = 8,
|
||||
D3D_SVT_TEXTURECUBE = 9,
|
||||
D3D_SVT_SAMPLER = 10,
|
||||
D3D_SVT_SAMPLER1D = 11,
|
||||
D3D_SVT_SAMPLER2D = 12,
|
||||
D3D_SVT_SAMPLER3D = 13,
|
||||
D3D_SVT_SAMPLERCUBE = 14,
|
||||
D3D_SVT_PIXELSHADER = 15,
|
||||
D3D_SVT_VERTEXSHADER = 16,
|
||||
D3D_SVT_PIXELFRAGMENT = 17,
|
||||
D3D_SVT_VERTEXFRAGMENT = 18,
|
||||
D3D_SVT_UINT = 19,
|
||||
D3D_SVT_UINT8 = 20,
|
||||
D3D_SVT_GEOMETRYSHADER = 21,
|
||||
D3D_SVT_RASTERIZER = 22,
|
||||
D3D_SVT_DEPTHSTENCIL = 23,
|
||||
D3D_SVT_BLEND = 24,
|
||||
D3D_SVT_BUFFER = 25,
|
||||
D3D_SVT_CBUFFER = 26,
|
||||
D3D_SVT_TBUFFER = 27,
|
||||
D3D_SVT_TEXTURE1DARRAY = 28,
|
||||
D3D_SVT_TEXTURE2DARRAY = 29,
|
||||
D3D_SVT_RENDERTARGETVIEW = 30,
|
||||
D3D_SVT_DEPTHSTENCILVIEW = 31,
|
||||
D3D_SVT_TEXTURE2DMS = 32,
|
||||
D3D_SVT_TEXTURE2DMSARRAY = 33,
|
||||
D3D_SVT_TEXTURECUBEARRAY = 34,
|
||||
D3D_SVT_HULLSHADER = 35,
|
||||
D3D_SVT_DOMAINSHADER = 36,
|
||||
D3D_SVT_INTERFACE_POINTER = 37,
|
||||
D3D_SVT_COMPUTESHADER = 38,
|
||||
D3D_SVT_DOUBLE = 39,
|
||||
D3D_SVT_RWTEXTURE1D = 40,
|
||||
D3D_SVT_RWTEXTURE1DARRAY = 41,
|
||||
D3D_SVT_RWTEXTURE2D = 42,
|
||||
D3D_SVT_RWTEXTURE2DARRAY = 43,
|
||||
D3D_SVT_RWTEXTURE3D = 44,
|
||||
D3D_SVT_RWBUFFER = 45,
|
||||
D3D_SVT_BYTEADDRESS_BUFFER = 46,
|
||||
D3D_SVT_RWBYTEADDRESS_BUFFER = 47,
|
||||
D3D_SVT_STRUCTURED_BUFFER = 48,
|
||||
D3D_SVT_RWSTRUCTURED_BUFFER = 49,
|
||||
D3D_SVT_APPEND_STRUCTURED_BUFFER = 50,
|
||||
D3D_SVT_CONSUME_STRUCTURED_BUFFER = 51,
|
||||
D3D_SVT_MIN8FLOAT = 52,
|
||||
D3D_SVT_MIN10FLOAT = 53,
|
||||
D3D_SVT_MIN16FLOAT = 54,
|
||||
D3D_SVT_MIN12INT = 55,
|
||||
D3D_SVT_MIN16INT = 56,
|
||||
D3D_SVT_MIN16UINT = 57,
|
||||
D3D10_SVT_VOID = D3D_SVT_VOID,
|
||||
D3D10_SVT_BOOL = D3D_SVT_BOOL,
|
||||
D3D10_SVT_INT = D3D_SVT_INT,
|
||||
D3D10_SVT_FLOAT = D3D_SVT_FLOAT,
|
||||
D3D10_SVT_STRING = D3D_SVT_STRING,
|
||||
D3D10_SVT_TEXTURE = D3D_SVT_TEXTURE,
|
||||
D3D10_SVT_TEXTURE1D = D3D_SVT_TEXTURE1D,
|
||||
D3D10_SVT_TEXTURE2D = D3D_SVT_TEXTURE2D,
|
||||
D3D10_SVT_TEXTURE3D = D3D_SVT_TEXTURE3D,
|
||||
D3D10_SVT_TEXTURECUBE = D3D_SVT_TEXTURECUBE,
|
||||
D3D10_SVT_SAMPLER = D3D_SVT_SAMPLER,
|
||||
D3D10_SVT_SAMPLER1D = D3D_SVT_SAMPLER1D,
|
||||
D3D10_SVT_SAMPLER2D = D3D_SVT_SAMPLER2D,
|
||||
D3D10_SVT_SAMPLER3D = D3D_SVT_SAMPLER3D,
|
||||
D3D10_SVT_SAMPLERCUBE = D3D_SVT_SAMPLERCUBE,
|
||||
D3D10_SVT_PIXELSHADER = D3D_SVT_PIXELSHADER,
|
||||
D3D10_SVT_VERTEXSHADER = D3D_SVT_VERTEXSHADER,
|
||||
D3D10_SVT_PIXELFRAGMENT = D3D_SVT_PIXELFRAGMENT,
|
||||
D3D10_SVT_VERTEXFRAGMENT = D3D_SVT_VERTEXFRAGMENT,
|
||||
D3D10_SVT_UINT = D3D_SVT_UINT,
|
||||
D3D10_SVT_UINT8 = D3D_SVT_UINT8,
|
||||
D3D10_SVT_GEOMETRYSHADER = D3D_SVT_GEOMETRYSHADER,
|
||||
D3D10_SVT_RASTERIZER = D3D_SVT_RASTERIZER,
|
||||
D3D10_SVT_DEPTHSTENCIL = D3D_SVT_DEPTHSTENCIL,
|
||||
D3D10_SVT_BLEND = D3D_SVT_BLEND,
|
||||
D3D10_SVT_BUFFER = D3D_SVT_BUFFER,
|
||||
D3D10_SVT_CBUFFER = D3D_SVT_CBUFFER,
|
||||
D3D10_SVT_TBUFFER = D3D_SVT_TBUFFER,
|
||||
D3D10_SVT_TEXTURE1DARRAY = D3D_SVT_TEXTURE1DARRAY,
|
||||
D3D10_SVT_TEXTURE2DARRAY = D3D_SVT_TEXTURE2DARRAY,
|
||||
D3D10_SVT_RENDERTARGETVIEW = D3D_SVT_RENDERTARGETVIEW,
|
||||
D3D10_SVT_DEPTHSTENCILVIEW = D3D_SVT_DEPTHSTENCILVIEW,
|
||||
D3D10_SVT_TEXTURE2DMS = D3D_SVT_TEXTURE2DMS,
|
||||
D3D10_SVT_TEXTURE2DMSARRAY = D3D_SVT_TEXTURE2DMSARRAY,
|
||||
D3D10_SVT_TEXTURECUBEARRAY = D3D_SVT_TEXTURECUBEARRAY,
|
||||
D3D11_SVT_HULLSHADER = D3D_SVT_HULLSHADER,
|
||||
D3D11_SVT_DOMAINSHADER = D3D_SVT_DOMAINSHADER,
|
||||
D3D11_SVT_INTERFACE_POINTER = D3D_SVT_INTERFACE_POINTER,
|
||||
D3D11_SVT_COMPUTESHADER = D3D_SVT_COMPUTESHADER,
|
||||
D3D11_SVT_DOUBLE = D3D_SVT_DOUBLE,
|
||||
D3D11_SVT_RWTEXTURE1D = D3D_SVT_RWTEXTURE1D,
|
||||
D3D11_SVT_RWTEXTURE1DARRAY = D3D_SVT_RWTEXTURE1DARRAY,
|
||||
D3D11_SVT_RWTEXTURE2D = D3D_SVT_RWTEXTURE2D,
|
||||
D3D11_SVT_RWTEXTURE2DARRAY = D3D_SVT_RWTEXTURE2DARRAY,
|
||||
D3D11_SVT_RWTEXTURE3D = D3D_SVT_RWTEXTURE3D,
|
||||
D3D11_SVT_RWBUFFER = D3D_SVT_RWBUFFER,
|
||||
D3D11_SVT_BYTEADDRESS_BUFFER = D3D_SVT_BYTEADDRESS_BUFFER,
|
||||
D3D11_SVT_RWBYTEADDRESS_BUFFER = D3D_SVT_RWBYTEADDRESS_BUFFER,
|
||||
D3D11_SVT_STRUCTURED_BUFFER = D3D_SVT_STRUCTURED_BUFFER,
|
||||
D3D11_SVT_RWSTRUCTURED_BUFFER = D3D_SVT_RWSTRUCTURED_BUFFER,
|
||||
D3D11_SVT_APPEND_STRUCTURED_BUFFER = D3D_SVT_APPEND_STRUCTURED_BUFFER,
|
||||
D3D11_SVT_CONSUME_STRUCTURED_BUFFER = D3D_SVT_CONSUME_STRUCTURED_BUFFER,
|
||||
D3D_SVT_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_SHADER_VARIABLE_TYPE;
|
||||
|
||||
typedef
|
||||
enum _D3D_SHADER_INPUT_FLAGS
|
||||
{
|
||||
D3D_SIF_USERPACKED = 0x1,
|
||||
D3D_SIF_COMPARISON_SAMPLER = 0x2,
|
||||
D3D_SIF_TEXTURE_COMPONENT_0 = 0x4,
|
||||
D3D_SIF_TEXTURE_COMPONENT_1 = 0x8,
|
||||
D3D_SIF_TEXTURE_COMPONENTS = 0xc,
|
||||
D3D_SIF_UNUSED = 0x10,
|
||||
D3D10_SIF_USERPACKED = D3D_SIF_USERPACKED,
|
||||
D3D10_SIF_COMPARISON_SAMPLER = D3D_SIF_COMPARISON_SAMPLER,
|
||||
D3D10_SIF_TEXTURE_COMPONENT_0 = D3D_SIF_TEXTURE_COMPONENT_0,
|
||||
D3D10_SIF_TEXTURE_COMPONENT_1 = D3D_SIF_TEXTURE_COMPONENT_1,
|
||||
D3D10_SIF_TEXTURE_COMPONENTS = D3D_SIF_TEXTURE_COMPONENTS,
|
||||
D3D_SIF_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_SHADER_INPUT_FLAGS;
|
||||
|
||||
typedef
|
||||
enum _D3D_SHADER_INPUT_TYPE
|
||||
{
|
||||
D3D_SIT_CBUFFER = 0,
|
||||
D3D_SIT_TBUFFER = ( D3D_SIT_CBUFFER + 1 ) ,
|
||||
D3D_SIT_TEXTURE = ( D3D_SIT_TBUFFER + 1 ) ,
|
||||
D3D_SIT_SAMPLER = ( D3D_SIT_TEXTURE + 1 ) ,
|
||||
D3D_SIT_UAV_RWTYPED = ( D3D_SIT_SAMPLER + 1 ) ,
|
||||
D3D_SIT_STRUCTURED = ( D3D_SIT_UAV_RWTYPED + 1 ) ,
|
||||
D3D_SIT_UAV_RWSTRUCTURED = ( D3D_SIT_STRUCTURED + 1 ) ,
|
||||
D3D_SIT_BYTEADDRESS = ( D3D_SIT_UAV_RWSTRUCTURED + 1 ) ,
|
||||
D3D_SIT_UAV_RWBYTEADDRESS = ( D3D_SIT_BYTEADDRESS + 1 ) ,
|
||||
D3D_SIT_UAV_APPEND_STRUCTURED = ( D3D_SIT_UAV_RWBYTEADDRESS + 1 ) ,
|
||||
D3D_SIT_UAV_CONSUME_STRUCTURED = ( D3D_SIT_UAV_APPEND_STRUCTURED + 1 ) ,
|
||||
D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER = ( D3D_SIT_UAV_CONSUME_STRUCTURED + 1 ) ,
|
||||
D3D10_SIT_CBUFFER = D3D_SIT_CBUFFER,
|
||||
D3D10_SIT_TBUFFER = D3D_SIT_TBUFFER,
|
||||
D3D10_SIT_TEXTURE = D3D_SIT_TEXTURE,
|
||||
D3D10_SIT_SAMPLER = D3D_SIT_SAMPLER,
|
||||
D3D11_SIT_UAV_RWTYPED = D3D_SIT_UAV_RWTYPED,
|
||||
D3D11_SIT_STRUCTURED = D3D_SIT_STRUCTURED,
|
||||
D3D11_SIT_UAV_RWSTRUCTURED = D3D_SIT_UAV_RWSTRUCTURED,
|
||||
D3D11_SIT_BYTEADDRESS = D3D_SIT_BYTEADDRESS,
|
||||
D3D11_SIT_UAV_RWBYTEADDRESS = D3D_SIT_UAV_RWBYTEADDRESS,
|
||||
D3D11_SIT_UAV_APPEND_STRUCTURED = D3D_SIT_UAV_APPEND_STRUCTURED,
|
||||
D3D11_SIT_UAV_CONSUME_STRUCTURED = D3D_SIT_UAV_CONSUME_STRUCTURED,
|
||||
D3D11_SIT_UAV_RWSTRUCTURED_WITH_COUNTER = D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER
|
||||
} D3D_SHADER_INPUT_TYPE;
|
||||
|
||||
typedef
|
||||
enum _D3D_SHADER_CBUFFER_FLAGS
|
||||
{
|
||||
D3D_CBF_USERPACKED = 1,
|
||||
D3D10_CBF_USERPACKED = D3D_CBF_USERPACKED,
|
||||
D3D_CBF_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_SHADER_CBUFFER_FLAGS;
|
||||
|
||||
typedef
|
||||
enum _D3D_CBUFFER_TYPE
|
||||
{
|
||||
D3D_CT_CBUFFER = 0,
|
||||
D3D_CT_TBUFFER = ( D3D_CT_CBUFFER + 1 ) ,
|
||||
D3D_CT_INTERFACE_POINTERS = ( D3D_CT_TBUFFER + 1 ) ,
|
||||
D3D_CT_RESOURCE_BIND_INFO = ( D3D_CT_INTERFACE_POINTERS + 1 ) ,
|
||||
D3D10_CT_CBUFFER = D3D_CT_CBUFFER,
|
||||
D3D10_CT_TBUFFER = D3D_CT_TBUFFER,
|
||||
D3D11_CT_CBUFFER = D3D_CT_CBUFFER,
|
||||
D3D11_CT_TBUFFER = D3D_CT_TBUFFER,
|
||||
D3D11_CT_INTERFACE_POINTERS = D3D_CT_INTERFACE_POINTERS,
|
||||
D3D11_CT_RESOURCE_BIND_INFO = D3D_CT_RESOURCE_BIND_INFO
|
||||
} D3D_CBUFFER_TYPE;
|
||||
|
||||
typedef
|
||||
enum D3D_NAME
|
||||
{
|
||||
D3D_NAME_UNDEFINED = 0,
|
||||
D3D_NAME_POSITION = 1,
|
||||
D3D_NAME_CLIP_DISTANCE = 2,
|
||||
D3D_NAME_CULL_DISTANCE = 3,
|
||||
D3D_NAME_RENDER_TARGET_ARRAY_INDEX = 4,
|
||||
D3D_NAME_VIEWPORT_ARRAY_INDEX = 5,
|
||||
D3D_NAME_VERTEX_ID = 6,
|
||||
D3D_NAME_PRIMITIVE_ID = 7,
|
||||
D3D_NAME_INSTANCE_ID = 8,
|
||||
D3D_NAME_IS_FRONT_FACE = 9,
|
||||
D3D_NAME_SAMPLE_INDEX = 10,
|
||||
D3D_NAME_FINAL_QUAD_EDGE_TESSFACTOR = 11,
|
||||
D3D_NAME_FINAL_QUAD_INSIDE_TESSFACTOR = 12,
|
||||
D3D_NAME_FINAL_TRI_EDGE_TESSFACTOR = 13,
|
||||
D3D_NAME_FINAL_TRI_INSIDE_TESSFACTOR = 14,
|
||||
D3D_NAME_FINAL_LINE_DETAIL_TESSFACTOR = 15,
|
||||
D3D_NAME_FINAL_LINE_DENSITY_TESSFACTOR = 16,
|
||||
D3D_NAME_TARGET = 64,
|
||||
D3D_NAME_DEPTH = 65,
|
||||
D3D_NAME_COVERAGE = 66,
|
||||
D3D_NAME_DEPTH_GREATER_EQUAL = 67,
|
||||
D3D_NAME_DEPTH_LESS_EQUAL = 68,
|
||||
D3D_NAME_STENCIL_REF = 69,
|
||||
D3D_NAME_INNER_COVERAGE = 70,
|
||||
D3D10_NAME_UNDEFINED = D3D_NAME_UNDEFINED,
|
||||
D3D10_NAME_POSITION = D3D_NAME_POSITION,
|
||||
D3D10_NAME_CLIP_DISTANCE = D3D_NAME_CLIP_DISTANCE,
|
||||
D3D10_NAME_CULL_DISTANCE = D3D_NAME_CULL_DISTANCE,
|
||||
D3D10_NAME_RENDER_TARGET_ARRAY_INDEX = D3D_NAME_RENDER_TARGET_ARRAY_INDEX,
|
||||
D3D10_NAME_VIEWPORT_ARRAY_INDEX = D3D_NAME_VIEWPORT_ARRAY_INDEX,
|
||||
D3D10_NAME_VERTEX_ID = D3D_NAME_VERTEX_ID,
|
||||
D3D10_NAME_PRIMITIVE_ID = D3D_NAME_PRIMITIVE_ID,
|
||||
D3D10_NAME_INSTANCE_ID = D3D_NAME_INSTANCE_ID,
|
||||
D3D10_NAME_IS_FRONT_FACE = D3D_NAME_IS_FRONT_FACE,
|
||||
D3D10_NAME_SAMPLE_INDEX = D3D_NAME_SAMPLE_INDEX,
|
||||
D3D10_NAME_TARGET = D3D_NAME_TARGET,
|
||||
D3D10_NAME_DEPTH = D3D_NAME_DEPTH,
|
||||
D3D10_NAME_COVERAGE = D3D_NAME_COVERAGE,
|
||||
D3D11_NAME_FINAL_QUAD_EDGE_TESSFACTOR = D3D_NAME_FINAL_QUAD_EDGE_TESSFACTOR,
|
||||
D3D11_NAME_FINAL_QUAD_INSIDE_TESSFACTOR = D3D_NAME_FINAL_QUAD_INSIDE_TESSFACTOR,
|
||||
D3D11_NAME_FINAL_TRI_EDGE_TESSFACTOR = D3D_NAME_FINAL_TRI_EDGE_TESSFACTOR,
|
||||
D3D11_NAME_FINAL_TRI_INSIDE_TESSFACTOR = D3D_NAME_FINAL_TRI_INSIDE_TESSFACTOR,
|
||||
D3D11_NAME_FINAL_LINE_DETAIL_TESSFACTOR = D3D_NAME_FINAL_LINE_DETAIL_TESSFACTOR,
|
||||
D3D11_NAME_FINAL_LINE_DENSITY_TESSFACTOR = D3D_NAME_FINAL_LINE_DENSITY_TESSFACTOR,
|
||||
D3D11_NAME_DEPTH_GREATER_EQUAL = D3D_NAME_DEPTH_GREATER_EQUAL,
|
||||
D3D11_NAME_DEPTH_LESS_EQUAL = D3D_NAME_DEPTH_LESS_EQUAL,
|
||||
D3D11_NAME_STENCIL_REF = D3D_NAME_STENCIL_REF,
|
||||
D3D11_NAME_INNER_COVERAGE = D3D_NAME_INNER_COVERAGE
|
||||
} D3D_NAME;
|
||||
|
||||
typedef
|
||||
enum D3D_RESOURCE_RETURN_TYPE
|
||||
{
|
||||
D3D_RETURN_TYPE_UNORM = 1,
|
||||
D3D_RETURN_TYPE_SNORM = 2,
|
||||
D3D_RETURN_TYPE_SINT = 3,
|
||||
D3D_RETURN_TYPE_UINT = 4,
|
||||
D3D_RETURN_TYPE_FLOAT = 5,
|
||||
D3D_RETURN_TYPE_MIXED = 6,
|
||||
D3D_RETURN_TYPE_DOUBLE = 7,
|
||||
D3D_RETURN_TYPE_CONTINUED = 8,
|
||||
D3D10_RETURN_TYPE_UNORM = D3D_RETURN_TYPE_UNORM,
|
||||
D3D10_RETURN_TYPE_SNORM = D3D_RETURN_TYPE_SNORM,
|
||||
D3D10_RETURN_TYPE_SINT = D3D_RETURN_TYPE_SINT,
|
||||
D3D10_RETURN_TYPE_UINT = D3D_RETURN_TYPE_UINT,
|
||||
D3D10_RETURN_TYPE_FLOAT = D3D_RETURN_TYPE_FLOAT,
|
||||
D3D10_RETURN_TYPE_MIXED = D3D_RETURN_TYPE_MIXED,
|
||||
D3D11_RETURN_TYPE_UNORM = D3D_RETURN_TYPE_UNORM,
|
||||
D3D11_RETURN_TYPE_SNORM = D3D_RETURN_TYPE_SNORM,
|
||||
D3D11_RETURN_TYPE_SINT = D3D_RETURN_TYPE_SINT,
|
||||
D3D11_RETURN_TYPE_UINT = D3D_RETURN_TYPE_UINT,
|
||||
D3D11_RETURN_TYPE_FLOAT = D3D_RETURN_TYPE_FLOAT,
|
||||
D3D11_RETURN_TYPE_MIXED = D3D_RETURN_TYPE_MIXED,
|
||||
D3D11_RETURN_TYPE_DOUBLE = D3D_RETURN_TYPE_DOUBLE,
|
||||
D3D11_RETURN_TYPE_CONTINUED = D3D_RETURN_TYPE_CONTINUED
|
||||
} D3D_RESOURCE_RETURN_TYPE;
|
||||
|
||||
typedef
|
||||
enum D3D_REGISTER_COMPONENT_TYPE
|
||||
{
|
||||
D3D_REGISTER_COMPONENT_UNKNOWN = 0,
|
||||
D3D_REGISTER_COMPONENT_UINT32 = 1,
|
||||
D3D_REGISTER_COMPONENT_SINT32 = 2,
|
||||
D3D_REGISTER_COMPONENT_FLOAT32 = 3,
|
||||
D3D10_REGISTER_COMPONENT_UNKNOWN = D3D_REGISTER_COMPONENT_UNKNOWN,
|
||||
D3D10_REGISTER_COMPONENT_UINT32 = D3D_REGISTER_COMPONENT_UINT32,
|
||||
D3D10_REGISTER_COMPONENT_SINT32 = D3D_REGISTER_COMPONENT_SINT32,
|
||||
D3D10_REGISTER_COMPONENT_FLOAT32 = D3D_REGISTER_COMPONENT_FLOAT32
|
||||
} D3D_REGISTER_COMPONENT_TYPE;
|
||||
|
||||
typedef
|
||||
enum D3D_TESSELLATOR_DOMAIN
|
||||
{
|
||||
D3D_TESSELLATOR_DOMAIN_UNDEFINED = 0,
|
||||
D3D_TESSELLATOR_DOMAIN_ISOLINE = 1,
|
||||
D3D_TESSELLATOR_DOMAIN_TRI = 2,
|
||||
D3D_TESSELLATOR_DOMAIN_QUAD = 3,
|
||||
D3D11_TESSELLATOR_DOMAIN_UNDEFINED = D3D_TESSELLATOR_DOMAIN_UNDEFINED,
|
||||
D3D11_TESSELLATOR_DOMAIN_ISOLINE = D3D_TESSELLATOR_DOMAIN_ISOLINE,
|
||||
D3D11_TESSELLATOR_DOMAIN_TRI = D3D_TESSELLATOR_DOMAIN_TRI,
|
||||
D3D11_TESSELLATOR_DOMAIN_QUAD = D3D_TESSELLATOR_DOMAIN_QUAD
|
||||
} D3D_TESSELLATOR_DOMAIN;
|
||||
|
||||
typedef
|
||||
enum D3D_TESSELLATOR_PARTITIONING
|
||||
{
|
||||
D3D_TESSELLATOR_PARTITIONING_UNDEFINED = 0,
|
||||
D3D_TESSELLATOR_PARTITIONING_INTEGER = 1,
|
||||
D3D_TESSELLATOR_PARTITIONING_POW2 = 2,
|
||||
D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD = 3,
|
||||
D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN = 4,
|
||||
D3D11_TESSELLATOR_PARTITIONING_UNDEFINED = D3D_TESSELLATOR_PARTITIONING_UNDEFINED,
|
||||
D3D11_TESSELLATOR_PARTITIONING_INTEGER = D3D_TESSELLATOR_PARTITIONING_INTEGER,
|
||||
D3D11_TESSELLATOR_PARTITIONING_POW2 = D3D_TESSELLATOR_PARTITIONING_POW2,
|
||||
D3D11_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD = D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD,
|
||||
D3D11_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN = D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN
|
||||
} D3D_TESSELLATOR_PARTITIONING;
|
||||
|
||||
typedef
|
||||
enum D3D_TESSELLATOR_OUTPUT_PRIMITIVE
|
||||
{
|
||||
D3D_TESSELLATOR_OUTPUT_UNDEFINED = 0,
|
||||
D3D_TESSELLATOR_OUTPUT_POINT = 1,
|
||||
D3D_TESSELLATOR_OUTPUT_LINE = 2,
|
||||
D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW = 3,
|
||||
D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW = 4,
|
||||
D3D11_TESSELLATOR_OUTPUT_UNDEFINED = D3D_TESSELLATOR_OUTPUT_UNDEFINED,
|
||||
D3D11_TESSELLATOR_OUTPUT_POINT = D3D_TESSELLATOR_OUTPUT_POINT,
|
||||
D3D11_TESSELLATOR_OUTPUT_LINE = D3D_TESSELLATOR_OUTPUT_LINE,
|
||||
D3D11_TESSELLATOR_OUTPUT_TRIANGLE_CW = D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW,
|
||||
D3D11_TESSELLATOR_OUTPUT_TRIANGLE_CCW = D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW
|
||||
} D3D_TESSELLATOR_OUTPUT_PRIMITIVE;
|
||||
|
||||
typedef
|
||||
enum D3D_MIN_PRECISION
|
||||
{
|
||||
D3D_MIN_PRECISION_DEFAULT = 0,
|
||||
D3D_MIN_PRECISION_FLOAT_16 = 1,
|
||||
D3D_MIN_PRECISION_FLOAT_2_8 = 2,
|
||||
D3D_MIN_PRECISION_RESERVED = 3,
|
||||
D3D_MIN_PRECISION_SINT_16 = 4,
|
||||
D3D_MIN_PRECISION_UINT_16 = 5,
|
||||
D3D_MIN_PRECISION_ANY_16 = 0xf0,
|
||||
D3D_MIN_PRECISION_ANY_10 = 0xf1
|
||||
} D3D_MIN_PRECISION;
|
||||
|
||||
typedef
|
||||
enum D3D_INTERPOLATION_MODE
|
||||
{
|
||||
D3D_INTERPOLATION_UNDEFINED = 0,
|
||||
D3D_INTERPOLATION_CONSTANT = 1,
|
||||
D3D_INTERPOLATION_LINEAR = 2,
|
||||
D3D_INTERPOLATION_LINEAR_CENTROID = 3,
|
||||
D3D_INTERPOLATION_LINEAR_NOPERSPECTIVE = 4,
|
||||
D3D_INTERPOLATION_LINEAR_NOPERSPECTIVE_CENTROID = 5,
|
||||
D3D_INTERPOLATION_LINEAR_SAMPLE = 6,
|
||||
D3D_INTERPOLATION_LINEAR_NOPERSPECTIVE_SAMPLE = 7
|
||||
} D3D_INTERPOLATION_MODE;
|
||||
|
||||
typedef
|
||||
enum _D3D_PARAMETER_FLAGS
|
||||
{
|
||||
D3D_PF_NONE = 0,
|
||||
D3D_PF_IN = 0x1,
|
||||
D3D_PF_OUT = 0x2,
|
||||
D3D_PF_FORCE_DWORD = 0x7fffffff
|
||||
} D3D_PARAMETER_FLAGS;
|
||||
|
||||
DEFINE_GUID(WKPDID_D3DDebugObjectName,0x429b8c22,0x9188,0x4b0c,0x87,0x42,0xac,0xb0,0xbf,0x85,0xc2,0x00);
|
||||
DEFINE_GUID(WKPDID_D3DDebugObjectNameW,0x4cca5fd8,0x921f,0x42c8,0x85,0x66,0x70,0xca,0xf2,0xa9,0xb7,0x41);
|
||||
DEFINE_GUID(WKPDID_CommentStringW,0xd0149dc0,0x90e8,0x4ec8,0x81, 0x44, 0xe9, 0x00, 0xad, 0x26, 0x6b, 0xb2);
|
||||
#define D3D_SET_OBJECT_NAME_N_A(pObject, Chars, pName) (pObject)->SetPrivateData(WKPDID_D3DDebugObjectName, Chars, pName)
|
||||
#define D3D_SET_OBJECT_NAME_A(pObject, pName) D3D_SET_OBJECT_NAME_N_A(pObject, lstrlenA(pName), pName)
|
||||
#define D3D_SET_OBJECT_NAME_N_W(pObject, Chars, pName) (pObject)->SetPrivateData(WKPDID_D3DDebugObjectNameW, Chars*2, pName)
|
||||
#define D3D_SET_OBJECT_NAME_W(pObject, pName) D3D_SET_OBJECT_NAME_N_W(pObject, wcslen(pName), pName)
|
||||
#define D3D_COMPONENT_MASK_X 1
|
||||
#define D3D_COMPONENT_MASK_Y 2
|
||||
#define D3D_COMPONENT_MASK_Z 4
|
||||
#define D3D_COMPONENT_MASK_W 8
|
||||
|
||||
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3dcommon_0000_0001_v0_0_c_ifspec;
|
||||
extern RPC_IF_HANDLE __MIDL_itf_d3dcommon_0000_0001_v0_0_s_ifspec;
|
||||
|
||||
/* Additional Prototypes for ALL interfaces */
|
||||
|
||||
/* end of Additional Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Vendored
+109
@@ -0,0 +1,109 @@
|
||||
//+--------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// Abstract:
|
||||
// Public API definitions for DWrite, D2D and DImage.
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
#pragma once
|
||||
|
||||
#ifndef DCOMMON_H_INCLUDED
|
||||
#define DCOMMON_H_INCLUDED
|
||||
|
||||
#include <dxgiformat.h>
|
||||
|
||||
#ifndef DX_DECLARE_INTERFACE
|
||||
#define DX_DECLARE_INTERFACE(x) DECLSPEC_UUID(x) DECLSPEC_NOVTABLE
|
||||
#endif
|
||||
|
||||
#ifndef CHECKMETHOD
|
||||
#define CHECKMETHOD(method) virtual DECLSPEC_NOTHROW _Must_inspect_result_ HRESULT STDMETHODCALLTYPE method
|
||||
#endif
|
||||
|
||||
//
|
||||
// Forward declarations
|
||||
//
|
||||
interface IDXGISurface;
|
||||
|
||||
//+----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// DWRITE_MEASURING_MODE
|
||||
//
|
||||
// Synopsis:
|
||||
// The measuring method used for text layout.
|
||||
//
|
||||
//-------------------------------------------------------------------------------
|
||||
typedef enum DWRITE_MEASURING_MODE
|
||||
{
|
||||
//
|
||||
// Text is measured using glyph ideal metrics whose values are independent to the current display resolution.
|
||||
//
|
||||
DWRITE_MEASURING_MODE_NATURAL,
|
||||
|
||||
//
|
||||
// Text is measured using glyph display compatible metrics whose values tuned for the current display resolution.
|
||||
//
|
||||
DWRITE_MEASURING_MODE_GDI_CLASSIC,
|
||||
|
||||
//
|
||||
// Text is measured using the same glyph display metrics as text measured by GDI using a font
|
||||
// created with CLEARTYPE_NATURAL_QUALITY.
|
||||
//
|
||||
DWRITE_MEASURING_MODE_GDI_NATURAL
|
||||
|
||||
} DWRITE_MEASURING_MODE;
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Enum:
|
||||
// D2D1_ALPHA_MODE
|
||||
//
|
||||
// Synopsis:
|
||||
// Qualifies how alpha is to be treated in a bitmap or render target containing
|
||||
// alpha.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef enum D2D1_ALPHA_MODE
|
||||
{
|
||||
|
||||
//
|
||||
// Alpha mode should be determined implicitly. Some target surfaces do not supply
|
||||
// or imply this information in which case alpha must be specified.
|
||||
//
|
||||
D2D1_ALPHA_MODE_UNKNOWN = 0,
|
||||
|
||||
//
|
||||
// Treat the alpha as premultipled.
|
||||
//
|
||||
D2D1_ALPHA_MODE_PREMULTIPLIED = 1,
|
||||
|
||||
//
|
||||
// Opacity is in the 'A' component only.
|
||||
//
|
||||
D2D1_ALPHA_MODE_STRAIGHT = 2,
|
||||
|
||||
//
|
||||
// Ignore any alpha channel information.
|
||||
//
|
||||
D2D1_ALPHA_MODE_IGNORE = 3,
|
||||
|
||||
D2D1_ALPHA_MODE_FORCE_DWORD = 0xffffffff
|
||||
|
||||
} D2D1_ALPHA_MODE;
|
||||
|
||||
//+-----------------------------------------------------------------------------
|
||||
//
|
||||
// Struct:
|
||||
// D2D1_PIXEL_FORMAT
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct D2D1_PIXEL_FORMAT
|
||||
{
|
||||
DXGI_FORMAT format;
|
||||
D2D1_ALPHA_MODE alphaMode;
|
||||
|
||||
} D2D1_PIXEL_FORMAT;
|
||||
|
||||
#endif /* DCOMMON_H_INCLUDED */
|
||||
Vendored
+5090
File diff suppressed because it is too large
Load Diff
Vendored
+1922
File diff suppressed because it is too large
Load Diff
Vendored
+965
@@ -0,0 +1,965 @@
|
||||
//+--------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// Abstract:
|
||||
// DirectX Typography Services public API definitions.
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#ifndef DWRITE_2_H_INCLUDED
|
||||
#define DWRITE_2_H_INCLUDED
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <DWrite_1.h>
|
||||
|
||||
|
||||
interface IDWriteFontFallback;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// How to align glyphs to the margin.
|
||||
/// </summary>
|
||||
enum DWRITE_OPTICAL_ALIGNMENT
|
||||
{
|
||||
/// <summary>
|
||||
/// Align to the default metrics of the glyph.
|
||||
/// </summary>
|
||||
DWRITE_OPTICAL_ALIGNMENT_NONE,
|
||||
|
||||
/// <summary>
|
||||
/// Align glyphs to the margins. Without this, some small whitespace
|
||||
/// may be present between the text and the margin from the glyph's side
|
||||
/// bearing values. Note that glyphs may still overhang outside the
|
||||
/// margin, such as flourishes or italic slants.
|
||||
/// </summary>
|
||||
DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS,
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Whether to enable grid-fitting of glyph outlines (a.k.a. hinting).
|
||||
/// </summary>
|
||||
enum DWRITE_GRID_FIT_MODE
|
||||
{
|
||||
/// <summary>
|
||||
/// Choose grid fitting base on the font's gasp table information.
|
||||
/// </summary>
|
||||
DWRITE_GRID_FIT_MODE_DEFAULT,
|
||||
|
||||
/// <summary>
|
||||
/// Always disable grid fitting, using the ideal glyph outlines.
|
||||
/// </summary>
|
||||
DWRITE_GRID_FIT_MODE_DISABLED,
|
||||
|
||||
/// <summary>
|
||||
/// Enable grid fitting, adjusting glyph outlines for device pixel display.
|
||||
/// </summary>
|
||||
DWRITE_GRID_FIT_MODE_ENABLED
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Overall metrics associated with text after layout.
|
||||
/// All coordinates are in device independent pixels (DIPs).
|
||||
/// </summary>
|
||||
struct DWRITE_TEXT_METRICS1 : DWRITE_TEXT_METRICS
|
||||
{
|
||||
/// <summary>
|
||||
/// The height of the formatted text taking into account the
|
||||
/// trailing whitespace at the end of each line, which will
|
||||
/// matter for vertical reading directions.
|
||||
/// </summary>
|
||||
FLOAT heightIncludingTrailingWhitespace;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The text renderer interface represents a set of application-defined
|
||||
/// callbacks that perform rendering of text, inline objects, and decorations
|
||||
/// such as underlines.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("D3E0E934-22A0-427E-AAE4-7D9574B59DB1") IDWriteTextRenderer1 : public IDWriteTextRenderer
|
||||
{
|
||||
/// <summary>
|
||||
/// IDWriteTextLayout::Draw calls this function to instruct the client to
|
||||
/// render a run of glyphs.
|
||||
/// </summary>
|
||||
/// <param name="clientDrawingContext">The context passed to
|
||||
/// IDWriteTextLayout::Draw.</param>
|
||||
/// <param name="baselineOriginX">X-coordinate of the baseline.</param>
|
||||
/// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
|
||||
/// <param name="orientationAngle">Orientation of the glyph run.</param>
|
||||
/// <param name="measuringMode">Specifies measuring method for glyphs in
|
||||
/// the run. Renderer implementations may choose different rendering
|
||||
/// modes for given measuring methods, but best results are seen when
|
||||
/// the rendering mode matches the corresponding measuring mode:
|
||||
/// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
|
||||
/// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
|
||||
/// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
|
||||
/// </param>
|
||||
/// <param name="glyphRun">The glyph run to draw.</param>
|
||||
/// <param name="glyphRunDescription">Properties of the characters
|
||||
/// associated with this run.</param>
|
||||
/// <param name="clientDrawingEffect">The drawing effect set in
|
||||
/// IDWriteTextLayout::SetDrawingEffect.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// If a non-identity orientation is passed, the glyph run should be
|
||||
/// rotated around the given baseline x and y coordinates. The function
|
||||
/// IDWriteAnalyzer2::GetGlyphOrientationTransform will return the
|
||||
/// necessary transform for you, which can be combined with any existing
|
||||
/// world transform on the drawing context.
|
||||
/// </remarks>
|
||||
STDMETHOD(DrawGlyphRun)(
|
||||
_In_opt_ void* clientDrawingContext,
|
||||
FLOAT baselineOriginX,
|
||||
FLOAT baselineOriginY,
|
||||
DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
|
||||
DWRITE_MEASURING_MODE measuringMode,
|
||||
_In_ DWRITE_GLYPH_RUN const* glyphRun,
|
||||
_In_ DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
|
||||
_In_opt_ IUnknown* clientDrawingEffect
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// IDWriteTextLayout::Draw calls this function to instruct the client to draw
|
||||
/// an underline.
|
||||
/// </summary>
|
||||
/// <param name="clientDrawingContext">The context passed to
|
||||
/// IDWriteTextLayout::Draw.</param>
|
||||
/// <param name="baselineOriginX">X-coordinate of the baseline.</param>
|
||||
/// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
|
||||
/// <param name="orientationAngle">Orientation of the underline.</param>
|
||||
/// <param name="underline">Underline logical information.</param>
|
||||
/// <param name="clientDrawingEffect">The drawing effect set in
|
||||
/// IDWriteTextLayout::SetDrawingEffect.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// A single underline can be broken into multiple calls, depending on
|
||||
/// how the formatting changes attributes. If font sizes/styles change
|
||||
/// within an underline, the thickness and offset will be averaged
|
||||
/// weighted according to characters.
|
||||
///
|
||||
/// To get the correct top coordinate of the underline rect, add
|
||||
/// underline::offset to the baseline's Y. Otherwise the underline will
|
||||
/// be immediately under the text. The x coordinate will always be passed
|
||||
/// as the left side, regardless of text directionality. This simplifies
|
||||
/// drawing and reduces the problem of round-off that could potentially
|
||||
/// cause gaps or a double stamped alpha blend. To avoid alpha overlap,
|
||||
/// round the end points to the nearest device pixel.
|
||||
/// </remarks>
|
||||
STDMETHOD(DrawUnderline)(
|
||||
_In_opt_ void* clientDrawingContext,
|
||||
FLOAT baselineOriginX,
|
||||
FLOAT baselineOriginY,
|
||||
DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
|
||||
_In_ DWRITE_UNDERLINE const* underline,
|
||||
_In_opt_ IUnknown* clientDrawingEffect
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// IDWriteTextLayout::Draw calls this function to instruct the client to draw
|
||||
/// a strikethrough.
|
||||
/// </summary>
|
||||
/// <param name="clientDrawingContext">The context passed to
|
||||
/// IDWriteTextLayout::Draw.</param>
|
||||
/// <param name="baselineOriginX">X-coordinate of the baseline.</param>
|
||||
/// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
|
||||
/// <param name="orientationAngle">Orientation of the strikethrough.</param>
|
||||
/// <param name="strikethrough">Strikethrough logical information.</param>
|
||||
/// <param name="clientDrawingEffect">The drawing effect set in
|
||||
/// IDWriteTextLayout::SetDrawingEffect.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// A single strikethrough can be broken into multiple calls, depending on
|
||||
/// how the formatting changes attributes. Strikethrough is not averaged
|
||||
/// across font sizes/styles changes.
|
||||
/// To get the correct top coordinate of the strikethrough rect,
|
||||
/// add strikethrough::offset to the baseline's Y.
|
||||
/// Like underlines, the x coordinate will always be passed as the left side,
|
||||
/// regardless of text directionality.
|
||||
/// </remarks>
|
||||
STDMETHOD(DrawStrikethrough)(
|
||||
_In_opt_ void* clientDrawingContext,
|
||||
FLOAT baselineOriginX,
|
||||
FLOAT baselineOriginY,
|
||||
DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
|
||||
_In_ DWRITE_STRIKETHROUGH const* strikethrough,
|
||||
_In_opt_ IUnknown* clientDrawingEffect
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// IDWriteTextLayout::Draw calls this application callback when it needs to
|
||||
/// draw an inline object.
|
||||
/// </summary>
|
||||
/// <param name="clientDrawingContext">The context passed to
|
||||
/// IDWriteTextLayout::Draw.</param>
|
||||
/// <param name="originX">X-coordinate at the top-left corner of the
|
||||
/// inline object.</param>
|
||||
/// <param name="originY">Y-coordinate at the top-left corner of the
|
||||
/// inline object.</param>
|
||||
/// <param name="orientationAngle">Orientation of the inline object.</param>
|
||||
/// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>
|
||||
/// <param name="isSideways">The object should be drawn on its side.</param>
|
||||
/// <param name="isRightToLeft">The object is in an right-to-left context
|
||||
/// and should be drawn flipped.</param>
|
||||
/// <param name="clientDrawingEffect">The drawing effect set in
|
||||
/// IDWriteTextLayout::SetDrawingEffect.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// The right-to-left flag is a hint to draw the appropriate visual for
|
||||
/// that reading direction. For example, it would look strange to draw an
|
||||
/// arrow pointing to the right to indicate a submenu. The sideways flag
|
||||
/// similarly hints that the object is drawn in a different orientation.
|
||||
/// If a non-identity orientation is passed, the top left of the inline
|
||||
/// object should be rotated around the given x and y coordinates.
|
||||
/// IDWriteAnalyzer2::GetGlyphOrientationTransform returns the necessary
|
||||
/// transform for this.
|
||||
/// </remarks>
|
||||
STDMETHOD(DrawInlineObject)(
|
||||
_In_opt_ void* clientDrawingContext,
|
||||
FLOAT originX,
|
||||
FLOAT originY,
|
||||
DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
|
||||
_In_ IDWriteInlineObject* inlineObject,
|
||||
BOOL isSideways,
|
||||
BOOL isRightToLeft,
|
||||
_In_opt_ IUnknown* clientDrawingEffect
|
||||
) PURE;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The format of text used for text layout.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This object may not be thread-safe and it may carry the state of text format change.
|
||||
/// </remarks>
|
||||
interface DWRITE_DECLARE_INTERFACE("5F174B49-0D8B-4CFB-8BCA-F1CCE9D06C67") IDWriteTextFormat1 : public IDWriteTextFormat
|
||||
{
|
||||
/// <summary>
|
||||
/// Set the preferred orientation of glyphs when using a vertical reading direction.
|
||||
/// </summary>
|
||||
/// <param name="glyphOrientation">Preferred glyph orientation.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetVerticalGlyphOrientation)(
|
||||
DWRITE_VERTICAL_GLYPH_ORIENTATION glyphOrientation
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get the preferred orientation of glyphs when using a vertical reading
|
||||
/// direction.
|
||||
/// </summary>
|
||||
STDMETHOD_(DWRITE_VERTICAL_GLYPH_ORIENTATION, GetVerticalGlyphOrientation)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Set whether or not the last word on the last line is wrapped.
|
||||
/// </summary>
|
||||
/// <param name="isLastLineWrappingEnabled">Line wrapping option.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetLastLineWrapping)(
|
||||
BOOL isLastLineWrappingEnabled
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get whether or not the last word on the last line is wrapped.
|
||||
/// </summary>
|
||||
STDMETHOD_(BOOL, GetLastLineWrapping)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Set how the glyphs align to the edges the margin. Default behavior is
|
||||
/// to align glyphs using their default glyphs metrics which include side
|
||||
/// bearings.
|
||||
/// </summary>
|
||||
/// <param name="opticalAlignment">Optical alignment option.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetOpticalAlignment)(
|
||||
DWRITE_OPTICAL_ALIGNMENT opticalAlignment
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get how the glyphs align to the edges the margin.
|
||||
/// </summary>
|
||||
STDMETHOD_(DWRITE_OPTICAL_ALIGNMENT, GetOpticalAlignment)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Apply a custom font fallback onto layout. If none is specified,
|
||||
/// layout uses the system fallback list.
|
||||
/// </summary>
|
||||
/// <param name="fontFallback">Custom font fallback created from
|
||||
/// IDWriteFontFallbackBuilder::CreateFontFallback or from
|
||||
/// IDWriteFactory2::GetSystemFontFallback.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetFontFallback)(
|
||||
IDWriteFontFallback* fontFallback
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get the current font fallback object.
|
||||
/// </summary>
|
||||
STDMETHOD(GetFontFallback)(
|
||||
__out IDWriteFontFallback** fontFallback
|
||||
) PURE;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The text layout interface represents a block of text after it has
|
||||
/// been fully analyzed and formatted.
|
||||
///
|
||||
/// All coordinates are in device independent pixels (DIPs).
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("1093C18F-8D5E-43F0-B064-0917311B525E") IDWriteTextLayout2 : public IDWriteTextLayout1
|
||||
{
|
||||
/// <summary>
|
||||
/// GetMetrics retrieves overall metrics for the formatted string.
|
||||
/// </summary>
|
||||
/// <param name="textMetrics">The returned metrics.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// Drawing effects like underline and strikethrough do not contribute
|
||||
/// to the text size, which is essentially the sum of advance widths and
|
||||
/// line heights. Additionally, visible swashes and other graphic
|
||||
/// adornments may extend outside the returned width and height.
|
||||
/// </remarks>
|
||||
STDMETHOD(GetMetrics)(
|
||||
_Out_ DWRITE_TEXT_METRICS1* textMetrics
|
||||
) PURE;
|
||||
|
||||
using IDWriteTextLayout::GetMetrics;
|
||||
|
||||
/// <summary>
|
||||
/// Set the preferred orientation of glyphs when using a vertical reading direction.
|
||||
/// </summary>
|
||||
/// <param name="glyphOrientation">Preferred glyph orientation.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetVerticalGlyphOrientation)(
|
||||
DWRITE_VERTICAL_GLYPH_ORIENTATION glyphOrientation
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get the preferred orientation of glyphs when using a vertical reading
|
||||
/// direction.
|
||||
/// </summary>
|
||||
STDMETHOD_(DWRITE_VERTICAL_GLYPH_ORIENTATION, GetVerticalGlyphOrientation)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Set whether or not the last word on the last line is wrapped.
|
||||
/// </summary>
|
||||
/// <param name="isLastLineWrappingEnabled">Line wrapping option.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetLastLineWrapping)(
|
||||
BOOL isLastLineWrappingEnabled
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get whether or not the last word on the last line is wrapped.
|
||||
/// </summary>
|
||||
STDMETHOD_(BOOL, GetLastLineWrapping)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Set how the glyphs align to the edges the margin. Default behavior is
|
||||
/// to align glyphs using their default glyphs metrics which include side
|
||||
/// bearings.
|
||||
/// </summary>
|
||||
/// <param name="opticalAlignment">Optical alignment option.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetOpticalAlignment)(
|
||||
DWRITE_OPTICAL_ALIGNMENT opticalAlignment
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get how the glyphs align to the edges the margin.
|
||||
/// </summary>
|
||||
STDMETHOD_(DWRITE_OPTICAL_ALIGNMENT, GetOpticalAlignment)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Apply a custom font fallback onto layout. If none is specified,
|
||||
/// layout uses the system fallback list.
|
||||
/// </summary>
|
||||
/// <param name="fontFallback">Custom font fallback created from
|
||||
/// IDWriteFontFallbackBuilder::CreateFontFallback or
|
||||
/// IDWriteFactory2::GetSystemFontFallback.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(SetFontFallback)(
|
||||
IDWriteFontFallback* fontFallback
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Get the current font fallback object.
|
||||
/// </summary>
|
||||
STDMETHOD(GetFontFallback)(
|
||||
__out IDWriteFontFallback** fontFallback
|
||||
) PURE;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The text analyzer interface represents a set of application-defined
|
||||
/// callbacks that perform rendering of text, inline objects, and decorations
|
||||
/// such as underlines.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("553A9FF3-5693-4DF7-B52B-74806F7F2EB9") IDWriteTextAnalyzer2 : public IDWriteTextAnalyzer1
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns 2x3 transform matrix for the respective angle to draw the
|
||||
/// glyph run or other object.
|
||||
/// </summary>
|
||||
/// <param name="glyphOrientationAngle">The angle reported to one of the application callbacks,
|
||||
/// including IDWriteTextAnalysisSink1::SetGlyphOrientation and IDWriteTextRenderer1::Draw*.</param>
|
||||
/// <param name="isSideways">Whether the run's glyphs are sideways or not.</param>
|
||||
/// <param name="originX">X origin of the element, be it a glyph run or underline or other.</param>
|
||||
/// <param name="originY">Y origin of the element, be it a glyph run or underline or other.</param>
|
||||
/// <param name="transform">Returned transform.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// This rotates around the given origin x and y, returning a translation component
|
||||
/// such that the glyph run, text decoration, or inline object is drawn with the
|
||||
/// right orientation at the expected coordinate.
|
||||
/// </remarks>
|
||||
STDMETHOD(GetGlyphOrientationTransform)(
|
||||
DWRITE_GLYPH_ORIENTATION_ANGLE glyphOrientationAngle,
|
||||
BOOL isSideways,
|
||||
FLOAT originX,
|
||||
FLOAT originY,
|
||||
_Out_ DWRITE_MATRIX* transform
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of typographic feature tags for the given script and language.
|
||||
/// </summary>
|
||||
/// <param name="fontFace">The font face to get features from.</param>
|
||||
/// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
|
||||
/// <param name="localeName">The locale to use when selecting the feature,
|
||||
/// such en-us or ja-jp.</param>
|
||||
/// <param name="maxTagCount">Maximum tag count.</param>
|
||||
/// <param name="actualTagCount">Actual tag count. If greater than
|
||||
/// maxTagCount, E_NOT_SUFFICIENT_BUFFER is returned, and the call
|
||||
/// should be retried with a larger buffer.</param>
|
||||
/// <param name="tags">Feature tag list.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(GetTypographicFeatures)(
|
||||
IDWriteFontFace* fontFace,
|
||||
DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
|
||||
_In_opt_z_ WCHAR const* localeName,
|
||||
UINT32 maxTagCount,
|
||||
_Out_ UINT32* actualTagCount,
|
||||
_Out_writes_(maxTagCount) DWRITE_FONT_FEATURE_TAG* tags
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Returns an array of which glyphs are affected by a given feature.
|
||||
/// </summary>
|
||||
/// <param name="fontFace">The font face to read glyph information from.</param>
|
||||
/// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
|
||||
/// <param name="localeName">The locale to use when selecting the feature,
|
||||
/// such en-us or ja-jp.</param>
|
||||
/// <param name="featureTag">OpenType feature name to use, which may be one
|
||||
/// of the DWRITE_FONT_FEATURE_TAG values or a custom feature using
|
||||
/// DWRITE_MAKE_OPENTYPE_TAG.</param>
|
||||
/// <param name="glyphCount">Number of glyph indices to check.</param>
|
||||
/// <param name="glyphIndices">Glyph indices to check for feature application.</param>
|
||||
/// <param name="featureApplies">Output of which glyphs are affected by the
|
||||
/// feature, where for each glyph affected, the respective array index
|
||||
/// will be 1. The result is returned per-glyph without regard to
|
||||
/// neighboring context of adjacent glyphs.</param>
|
||||
/// </remarks>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(CheckTypographicFeature)(
|
||||
IDWriteFontFace* fontFace,
|
||||
DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
|
||||
_In_opt_z_ WCHAR const* localeName,
|
||||
DWRITE_FONT_FEATURE_TAG featureTag,
|
||||
UINT32 glyphCount,
|
||||
_In_reads_(glyphCount) UINT16 const* glyphIndices,
|
||||
_Out_writes_(glyphCount) UINT8* featureApplies
|
||||
) PURE;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A font fallback definition used for mapping characters to fonts capable of
|
||||
/// supporting them.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("EFA008F9-F7A1-48BF-B05C-F224713CC0FF") IDWriteFontFallback : public IUnknown
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines an appropriate font to use to render the range of text.
|
||||
/// </summary>
|
||||
/// <param name="source">The text source implementation holds the text and
|
||||
/// locale.</param>
|
||||
/// <param name="textLength">Length of the text to analyze.</param>
|
||||
/// <param name="baseFontCollection">Default font collection to use.</param>
|
||||
/// <param name="baseFont">Base font to check (optional).</param>
|
||||
/// <param name="baseFamilyName">Family name of the base font. If you pass
|
||||
/// null, no matching will be done against the family.</param>
|
||||
/// <param name="baseWeight">Desired weight.</param>
|
||||
/// <param name="baseStyle">Desired style.</param>
|
||||
/// <param name="baseStretch">Desired stretch.</param>
|
||||
/// <param name="mappedLength">Length of text mapped to the mapped font.
|
||||
/// This will always be less or equal to the input text length and
|
||||
/// greater than zero (if the text length is non-zero) so that the
|
||||
/// caller advances at least one character each call.</param>
|
||||
/// <param name="mappedFont">The font that should be used to render the
|
||||
/// first mappedLength characters of the text. If it returns NULL,
|
||||
/// then no known font can render the text, and mappedLength is the
|
||||
/// number of unsupported characters to skip.</param>
|
||||
/// <param name="scale">Scale factor to multiply the em size of the
|
||||
/// returned font by.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(MapCharacters)(
|
||||
IDWriteTextAnalysisSource* analysisSource,
|
||||
UINT32 textPosition,
|
||||
UINT32 textLength,
|
||||
_In_opt_ IDWriteFontCollection* baseFontCollection,
|
||||
_In_opt_z_ wchar_t const* baseFamilyName,
|
||||
DWRITE_FONT_WEIGHT baseWeight,
|
||||
DWRITE_FONT_STYLE baseStyle,
|
||||
DWRITE_FONT_STRETCH baseStretch,
|
||||
_Deref_out_range_(0, textLength) UINT32* mappedLength,
|
||||
_COM_Outptr_ IDWriteFont** mappedFont,
|
||||
_Out_ FLOAT* scale
|
||||
) PURE;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builder used to create a font fallback definition by appending a series of
|
||||
/// fallback mappings, followed by a creation call.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This object may not be thread-safe.
|
||||
/// </remarks>
|
||||
interface DWRITE_DECLARE_INTERFACE("FD882D06-8ABA-4FB8-B849-8BE8B73E14DE") IDWriteFontFallbackBuilder : public IUnknown
|
||||
{
|
||||
/// <summary>
|
||||
/// Appends a single mapping to the list. Call this once for each additional mapping.
|
||||
/// </summary>
|
||||
/// <param name="ranges">Unicode ranges that apply to this mapping.</param>
|
||||
/// <param name="rangesCount">Number of Unicode ranges.</param>
|
||||
/// <param name="localeName">Locale of the context (e.g. document locale).</param>
|
||||
/// <param name="baseFamilyName">Base family name to match against, if applicable.</param>
|
||||
/// <param name="fontCollection">Explicit font collection for this mapping (optional).</param>
|
||||
/// <param name="targetFamilyNames">List of target family name strings.</param>
|
||||
/// <param name="targetFamilyNamesCount">Number of target family names.</param>
|
||||
/// <param name="scale">Scale factor to multiply the result target font by.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(AddMapping)(
|
||||
_In_reads_(rangesCount) DWRITE_UNICODE_RANGE const* ranges,
|
||||
UINT32 rangesCount,
|
||||
_In_reads_(targetFamilyNamesCount) WCHAR const** targetFamilyNames,
|
||||
UINT32 targetFamilyNamesCount,
|
||||
_In_opt_ IDWriteFontCollection* fontCollection = NULL,
|
||||
_In_opt_z_ WCHAR const* localeName = NULL,
|
||||
_In_opt_z_ WCHAR const* baseFamilyName = NULL,
|
||||
FLOAT scale = 1.0f
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Appends all the mappings from an existing font fallback object.
|
||||
/// </summary>
|
||||
/// <param name="fontFallback">Font fallback to read mappings from.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(AddMappings)(
|
||||
IDWriteFontFallback* fontFallback
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Creates the finalized fallback object from the mappings added.
|
||||
/// </summary>
|
||||
/// <param name="fontFallback">Created fallback list.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(CreateFontFallback)(
|
||||
_COM_Outptr_ IDWriteFontFallback** fontFallback
|
||||
) PURE;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// DWRITE_COLOR_F
|
||||
/// </summary>
|
||||
#ifndef D3DCOLORVALUE_DEFINED
|
||||
|
||||
typedef struct _D3DCOLORVALUE {
|
||||
union {
|
||||
FLOAT r;
|
||||
FLOAT dvR;
|
||||
};
|
||||
union {
|
||||
FLOAT g;
|
||||
FLOAT dvG;
|
||||
};
|
||||
union {
|
||||
FLOAT b;
|
||||
FLOAT dvB;
|
||||
};
|
||||
union {
|
||||
FLOAT a;
|
||||
FLOAT dvA;
|
||||
};
|
||||
} D3DCOLORVALUE;
|
||||
|
||||
#define D3DCOLORVALUE_DEFINED
|
||||
#endif D3DCOLORVALUE_DEFINED
|
||||
|
||||
typedef D3DCOLORVALUE DWRITE_COLOR_F;
|
||||
|
||||
/// <summary>
|
||||
/// The IDWriteFont interface represents a physical font in a font collection.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("29748ed6-8c9c-4a6a-be0b-d912e8538944") IDWriteFont2 : public IDWriteFont1
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns TRUE if the font contains color information (COLR and CPAL tables),
|
||||
/// or FALSE if not.
|
||||
/// </summary>
|
||||
STDMETHOD_(BOOL, IsColorFont)() PURE;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The interface that represents an absolute reference to a font face.
|
||||
/// It contains font face type, appropriate file references and face identification data.
|
||||
/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("d8b768ff-64bc-4e66-982b-ec8e87f693f7") IDWriteFontFace2 : public IDWriteFontFace1
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns TRUE if the font contains color information (COLR and CPAL tables),
|
||||
/// or FALSE if not.
|
||||
/// </summary>
|
||||
STDMETHOD_(BOOL, IsColorFont)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Returns the number of color palettes defined by the font. The return
|
||||
/// value is zero if the font has no color information. Color fonts must
|
||||
/// have at least one palette, with palette index zero being the default.
|
||||
/// </summary>
|
||||
STDMETHOD_(UINT32, GetColorPaletteCount)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Returns the number of entries in each color palette. All color palettes
|
||||
/// in a font have the same number of palette entries. The return value is
|
||||
/// zero if the font has no color information.
|
||||
/// </summary>
|
||||
STDMETHOD_(UINT32, GetPaletteEntryCount)() PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Reads color values from the font's color palette.
|
||||
/// </summary>
|
||||
/// <param name="colorPaletteIndex">Zero-based index of the color palette. If the
|
||||
/// font does not have a palette with the specified index, the method returns
|
||||
/// DWRITE_E_NOCOLOR.<param>
|
||||
/// <param name="firstEntryIndex">Zero-based index of the first palette entry
|
||||
/// to read.</param>
|
||||
/// <param name="entryCount">Number of palette entries to read.</param>
|
||||
/// <param name="paletteEntries">Array that receives the color values.<param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// The return value is E_INVALIDARG if firstEntryIndex + entryCount is greater
|
||||
/// than the actual number of palette entries as returned by GetPaletteEntryCount.
|
||||
/// The return value is DWRITE_E_NOCOLOR if the font does not have a palette
|
||||
/// with the specified palette index.
|
||||
/// </returns>
|
||||
STDMETHOD(GetPaletteEntries)(
|
||||
UINT32 colorPaletteIndex,
|
||||
UINT32 firstEntryIndex,
|
||||
UINT32 entryCount,
|
||||
_Out_writes_(entryCount) DWRITE_COLOR_F* paletteEntries
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Determines the recommended text rendering and grid-fit mode to be used based on the
|
||||
/// font, size, world transform, and measuring mode.
|
||||
/// </summary>
|
||||
/// <param name="fontEmSize">Logical font size in DIPs.</param>
|
||||
/// <param name="dpiX">Number of pixels per logical inch in the horizontal direction.</param>
|
||||
/// <param name="dpiY">Number of pixels per logical inch in the vertical direction.</param>
|
||||
/// <param name="transform">Specifies the world transform.</param>
|
||||
/// <param name="outlineThreshold">Specifies the quality of the graphics system's outline rendering,
|
||||
/// affects the size threshold above which outline rendering is used.</param>
|
||||
/// <param name="measuringMode">Specifies the method used to measure during text layout. For proper
|
||||
/// glyph spacing, the function returns a rendering mode that is compatible with the specified
|
||||
/// measuring mode.</param>
|
||||
/// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters
|
||||
/// object overrides the rendering mode.</param>
|
||||
/// <param name="renderingMode">Receives the recommended rendering mode.</param>
|
||||
/// <param name="gridFitMode">Receives the recommended grid-fit mode.</param>
|
||||
/// <remarks>
|
||||
/// This method should be used to determine the actual rendering mode in cases where the rendering
|
||||
/// mode of the rendering params object is DWRITE_RENDERING_MODE_DEFAULT, and the actual grid-fit
|
||||
/// mode when the rendering params object is DWRITE_GRID_FIT_MODE_DEFAULT.
|
||||
/// </remarks>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(GetRecommendedRenderingMode)(
|
||||
FLOAT fontEmSize,
|
||||
FLOAT dpiX,
|
||||
FLOAT dpiY,
|
||||
_In_opt_ DWRITE_MATRIX const* transform,
|
||||
BOOL isSideways,
|
||||
DWRITE_OUTLINE_THRESHOLD outlineThreshold,
|
||||
DWRITE_MEASURING_MODE measuringMode,
|
||||
_In_opt_ IDWriteRenderingParams* renderingParams,
|
||||
_Out_ DWRITE_RENDERING_MODE* renderingMode,
|
||||
_Out_ DWRITE_GRID_FIT_MODE* gridFitMode
|
||||
) PURE;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Represents a color glyph run. The IDWriteFactory2::TranslateColorGlyphRun
|
||||
/// method returns an ordered collection of color glyph runs, which can be
|
||||
/// layered on top of each other to produce a color representation of the
|
||||
/// given base glyph run.
|
||||
/// </summary>
|
||||
struct DWRITE_COLOR_GLYPH_RUN
|
||||
{
|
||||
/// <summary>
|
||||
/// Glyph run to render.
|
||||
/// </summary>
|
||||
DWRITE_GLYPH_RUN glyphRun;
|
||||
|
||||
/// <summary>
|
||||
/// Optional glyph run description.
|
||||
/// </summary>
|
||||
_Maybenull_ DWRITE_GLYPH_RUN_DESCRIPTION* glyphRunDescription;
|
||||
|
||||
/// <summary>
|
||||
/// Location at which to draw this glyph run.
|
||||
/// </summary>
|
||||
FLOAT baselineOriginX;
|
||||
FLOAT baselineOriginY;
|
||||
|
||||
/// <summary>
|
||||
/// Color to use for this layer, if any. This is the same color that
|
||||
/// IDWriteFontFace2::GetPaletteEntries would return for the current
|
||||
/// palette index if the paletteIndex member is less than 0xFFFF. If
|
||||
/// the paletteIndex member is 0xFFFF then there is no associated
|
||||
/// palette entry, this member is set to { 0, 0, 0, 0 }, and the client
|
||||
/// should use the current foreground brush.
|
||||
/// </summary>
|
||||
DWRITE_COLOR_F runColor;
|
||||
|
||||
/// <summary>
|
||||
/// Zero-based index of this layer's color entry in the current color
|
||||
/// palette, or 0xFFFF if this layer is to be rendered using
|
||||
/// the current foreground brush.
|
||||
/// </summary>
|
||||
UINT16 paletteIndex;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Enumerator for an ordered collection of color glyph runs.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("d31fbe17-f157-41a2-8d24-cb779e0560e8") IDWriteColorGlyphRunEnumerator : public IUnknown
|
||||
{
|
||||
/// <summary>
|
||||
/// Advances to the first or next color run. The runs are enumerated
|
||||
/// in order from back to front.
|
||||
/// </summary>
|
||||
/// <param name="hasRun">Receives TRUE if there is a current run or
|
||||
/// FALSE if the end of the sequence has been reached.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(MoveNext)(
|
||||
_Out_ BOOL* hasRun
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current color glyph run.
|
||||
/// </summary>
|
||||
/// <param name="colorGlyphRun">Receives a pointer to the color
|
||||
/// glyph run. The pointer remains valid until the next call to
|
||||
/// MoveNext or until the interface is released.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code. An error is returned if there is
|
||||
/// no current glyph run, i.e., if MoveNext has not yet been called
|
||||
/// or if the end of the sequence has been reached.
|
||||
/// </returns>
|
||||
STDMETHOD(GetCurrentRun)(
|
||||
_Outptr_ DWRITE_COLOR_GLYPH_RUN const** colorGlyphRun
|
||||
) PURE;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The interface that represents text rendering settings for glyph rasterization and filtering.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("F9D711C3-9777-40AE-87E8-3E5AF9BF0948") IDWriteRenderingParams2 : public IDWriteRenderingParams1
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the grid fitting mode.
|
||||
/// </summary>
|
||||
STDMETHOD_(DWRITE_GRID_FIT_MODE, GetGridFitMode)() PURE;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The root factory interface for all DWrite objects.
|
||||
/// </summary>
|
||||
interface DWRITE_DECLARE_INTERFACE("0439fc60-ca44-4994-8dee-3a9af7b732ec") IDWriteFactory2 : public IDWriteFactory1
|
||||
{
|
||||
/// <summary>
|
||||
/// Get the system-appropriate font fallback mapping list.
|
||||
/// </summary>
|
||||
/// <param name="fontFallback">The system fallback list.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(GetSystemFontFallback)(
|
||||
_COM_Outptr_ IDWriteFontFallback** fontFallback
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Create a custom font fallback builder.
|
||||
/// </summary>
|
||||
/// <param name="fontFallbackBuilder">Empty font fallback builder.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(CreateFontFallbackBuilder)(
|
||||
_COM_Outptr_ IDWriteFontFallbackBuilder** fontFallbackBuilder
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Translates a glyph run to a sequence of color glyph runs, which can be
|
||||
/// rendered to produce a color representation of the original "base" run.
|
||||
/// </summary>
|
||||
/// <param name="baselineOriginX">Horizontal origin of the base glyph run in
|
||||
/// pre-transform coordinates.</param>
|
||||
/// <param name="baselineOriginY">Vertical origin of the base glyph run in
|
||||
/// pre-transform coordinates.</param>
|
||||
/// <param name="glyphRun">Pointer to the original "base" glyph run.</param>
|
||||
/// <param name="glyphRunDescription">Optional glyph run description.</param>
|
||||
/// <param name="measuringMode">Measuring mode, needed to compute the origins
|
||||
/// of each glyph.</param>
|
||||
/// <param name="worldToDeviceTransform">Matrix converting from the client's
|
||||
/// coordinate space to device coordinates (pixels), i.e., the world transform
|
||||
/// multiplied by any DPI scaling.</param>
|
||||
/// <param name="colorPaletteIndex">Zero-based index of the color palette to use.
|
||||
/// Valid indices are less than the number of palettes in the font, as returned
|
||||
/// by IDWriteFontFace2::GetColorPaletteCount.</param>
|
||||
/// <param name="colorLayers">If the function succeeds, receives a pointer
|
||||
/// to an enumerator object that can be used to obtain the color glyph runs.
|
||||
/// If the base run has no color glyphs, then the output pointer is NULL
|
||||
/// and the method returns DWRITE_E_NOCOLOR.</param>
|
||||
/// <returns>
|
||||
/// Returns DWRITE_E_NOCOLOR if the font has no color information, the base
|
||||
/// glyph run does not contain any color glyphs, or the specified color palette
|
||||
/// index is out of range. In this case, the client should render the base glyph
|
||||
/// run. Otherwise, returns a standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(TranslateColorGlyphRun)(
|
||||
FLOAT baselineOriginX,
|
||||
FLOAT baselineOriginY,
|
||||
_In_ DWRITE_GLYPH_RUN const* glyphRun,
|
||||
_In_opt_ DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
|
||||
DWRITE_MEASURING_MODE measuringMode,
|
||||
_In_opt_ DWRITE_MATRIX const* worldToDeviceTransform,
|
||||
UINT32 colorPaletteIndex,
|
||||
_COM_Outptr_ IDWriteColorGlyphRunEnumerator** colorLayers
|
||||
) PURE;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a rendering parameters object with the specified properties.
|
||||
/// </summary>
|
||||
/// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>
|
||||
/// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>
|
||||
/// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>
|
||||
/// <param name="pixelGeometry">The geometry of a device pixel.</param>
|
||||
/// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>
|
||||
/// <param name="gridFitMode">How to grid fit glyph outlines. In most cases, this should be DWRITE_GRID_FIT_DEFAULT to automatically choose an appropriate mode.</param>
|
||||
/// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(CreateCustomRenderingParams)(
|
||||
FLOAT gamma,
|
||||
FLOAT enhancedContrast,
|
||||
FLOAT grayscaleEnhancedContrast,
|
||||
FLOAT clearTypeLevel,
|
||||
DWRITE_PIXEL_GEOMETRY pixelGeometry,
|
||||
DWRITE_RENDERING_MODE renderingMode,
|
||||
DWRITE_GRID_FIT_MODE gridFitMode,
|
||||
_COM_Outptr_ IDWriteRenderingParams2** renderingParams
|
||||
) PURE;
|
||||
|
||||
using IDWriteFactory::CreateCustomRenderingParams;
|
||||
using IDWriteFactory1::CreateCustomRenderingParams;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a glyph run analysis object, which encapsulates information
|
||||
/// used to render a glyph run.
|
||||
/// </summary>
|
||||
/// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>
|
||||
/// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
|
||||
/// scaling specified by the emSize and pixelsPerDip.</param>
|
||||
/// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default
|
||||
/// and not outline).</param>
|
||||
/// <param name="measuringMode">Specifies the method to measure glyphs.</param>
|
||||
/// <param name="gridFitMode">How to grid-fit glyph outlines. This must be non-default.</param>
|
||||
/// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>
|
||||
/// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>
|
||||
/// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>
|
||||
/// <returns>
|
||||
/// Standard HRESULT error code.
|
||||
/// </returns>
|
||||
STDMETHOD(CreateGlyphRunAnalysis)(
|
||||
_In_ DWRITE_GLYPH_RUN const* glyphRun,
|
||||
_In_opt_ DWRITE_MATRIX const* transform,
|
||||
DWRITE_RENDERING_MODE renderingMode,
|
||||
DWRITE_MEASURING_MODE measuringMode,
|
||||
DWRITE_GRID_FIT_MODE gridFitMode,
|
||||
DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
|
||||
FLOAT baselineOriginX,
|
||||
FLOAT baselineOriginY,
|
||||
_COM_Outptr_ IDWriteGlyphRunAnalysis** glyphRunAnalysis
|
||||
) PURE;
|
||||
|
||||
using IDWriteFactory::CreateGlyphRunAnalysis;
|
||||
};
|
||||
|
||||
|
||||
#endif /* DWRITE_2_H_INCLUDED */
|
||||
Vendored
+1743
File diff suppressed because it is too large
Load Diff
Vendored
+2951
File diff suppressed because it is too large
Load Diff
Vendored
+2474
File diff suppressed because it is too large
Load Diff
Vendored
+2121
File diff suppressed because it is too large
Load Diff
Vendored
+1494
File diff suppressed because it is too large
Load Diff
+137
@@ -0,0 +1,137 @@
|
||||
//
|
||||
// Copyright (C) Microsoft. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef __dxgiformat_h__
|
||||
#define __dxgiformat_h__
|
||||
|
||||
#define DXGI_FORMAT_DEFINED 1
|
||||
|
||||
typedef enum DXGI_FORMAT
|
||||
{
|
||||
DXGI_FORMAT_UNKNOWN = 0,
|
||||
DXGI_FORMAT_R32G32B32A32_TYPELESS = 1,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT = 2,
|
||||
DXGI_FORMAT_R32G32B32A32_UINT = 3,
|
||||
DXGI_FORMAT_R32G32B32A32_SINT = 4,
|
||||
DXGI_FORMAT_R32G32B32_TYPELESS = 5,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT = 6,
|
||||
DXGI_FORMAT_R32G32B32_UINT = 7,
|
||||
DXGI_FORMAT_R32G32B32_SINT = 8,
|
||||
DXGI_FORMAT_R16G16B16A16_TYPELESS = 9,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT = 10,
|
||||
DXGI_FORMAT_R16G16B16A16_UNORM = 11,
|
||||
DXGI_FORMAT_R16G16B16A16_UINT = 12,
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM = 13,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT = 14,
|
||||
DXGI_FORMAT_R32G32_TYPELESS = 15,
|
||||
DXGI_FORMAT_R32G32_FLOAT = 16,
|
||||
DXGI_FORMAT_R32G32_UINT = 17,
|
||||
DXGI_FORMAT_R32G32_SINT = 18,
|
||||
DXGI_FORMAT_R32G8X24_TYPELESS = 19,
|
||||
DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20,
|
||||
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21,
|
||||
DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22,
|
||||
DXGI_FORMAT_R10G10B10A2_TYPELESS = 23,
|
||||
DXGI_FORMAT_R10G10B10A2_UNORM = 24,
|
||||
DXGI_FORMAT_R10G10B10A2_UINT = 25,
|
||||
DXGI_FORMAT_R11G11B10_FLOAT = 26,
|
||||
DXGI_FORMAT_R8G8B8A8_TYPELESS = 27,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM = 28,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT = 30,
|
||||
DXGI_FORMAT_R8G8B8A8_SNORM = 31,
|
||||
DXGI_FORMAT_R8G8B8A8_SINT = 32,
|
||||
DXGI_FORMAT_R16G16_TYPELESS = 33,
|
||||
DXGI_FORMAT_R16G16_FLOAT = 34,
|
||||
DXGI_FORMAT_R16G16_UNORM = 35,
|
||||
DXGI_FORMAT_R16G16_UINT = 36,
|
||||
DXGI_FORMAT_R16G16_SNORM = 37,
|
||||
DXGI_FORMAT_R16G16_SINT = 38,
|
||||
DXGI_FORMAT_R32_TYPELESS = 39,
|
||||
DXGI_FORMAT_D32_FLOAT = 40,
|
||||
DXGI_FORMAT_R32_FLOAT = 41,
|
||||
DXGI_FORMAT_R32_UINT = 42,
|
||||
DXGI_FORMAT_R32_SINT = 43,
|
||||
DXGI_FORMAT_R24G8_TYPELESS = 44,
|
||||
DXGI_FORMAT_D24_UNORM_S8_UINT = 45,
|
||||
DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46,
|
||||
DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47,
|
||||
DXGI_FORMAT_R8G8_TYPELESS = 48,
|
||||
DXGI_FORMAT_R8G8_UNORM = 49,
|
||||
DXGI_FORMAT_R8G8_UINT = 50,
|
||||
DXGI_FORMAT_R8G8_SNORM = 51,
|
||||
DXGI_FORMAT_R8G8_SINT = 52,
|
||||
DXGI_FORMAT_R16_TYPELESS = 53,
|
||||
DXGI_FORMAT_R16_FLOAT = 54,
|
||||
DXGI_FORMAT_D16_UNORM = 55,
|
||||
DXGI_FORMAT_R16_UNORM = 56,
|
||||
DXGI_FORMAT_R16_UINT = 57,
|
||||
DXGI_FORMAT_R16_SNORM = 58,
|
||||
DXGI_FORMAT_R16_SINT = 59,
|
||||
DXGI_FORMAT_R8_TYPELESS = 60,
|
||||
DXGI_FORMAT_R8_UNORM = 61,
|
||||
DXGI_FORMAT_R8_UINT = 62,
|
||||
DXGI_FORMAT_R8_SNORM = 63,
|
||||
DXGI_FORMAT_R8_SINT = 64,
|
||||
DXGI_FORMAT_A8_UNORM = 65,
|
||||
DXGI_FORMAT_R1_UNORM = 66,
|
||||
DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67,
|
||||
DXGI_FORMAT_R8G8_B8G8_UNORM = 68,
|
||||
DXGI_FORMAT_G8R8_G8B8_UNORM = 69,
|
||||
DXGI_FORMAT_BC1_TYPELESS = 70,
|
||||
DXGI_FORMAT_BC1_UNORM = 71,
|
||||
DXGI_FORMAT_BC1_UNORM_SRGB = 72,
|
||||
DXGI_FORMAT_BC2_TYPELESS = 73,
|
||||
DXGI_FORMAT_BC2_UNORM = 74,
|
||||
DXGI_FORMAT_BC2_UNORM_SRGB = 75,
|
||||
DXGI_FORMAT_BC3_TYPELESS = 76,
|
||||
DXGI_FORMAT_BC3_UNORM = 77,
|
||||
DXGI_FORMAT_BC3_UNORM_SRGB = 78,
|
||||
DXGI_FORMAT_BC4_TYPELESS = 79,
|
||||
DXGI_FORMAT_BC4_UNORM = 80,
|
||||
DXGI_FORMAT_BC4_SNORM = 81,
|
||||
DXGI_FORMAT_BC5_TYPELESS = 82,
|
||||
DXGI_FORMAT_BC5_UNORM = 83,
|
||||
DXGI_FORMAT_BC5_SNORM = 84,
|
||||
DXGI_FORMAT_B5G6R5_UNORM = 85,
|
||||
DXGI_FORMAT_B5G5R5A1_UNORM = 86,
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM = 87,
|
||||
DXGI_FORMAT_B8G8R8X8_UNORM = 88,
|
||||
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89,
|
||||
DXGI_FORMAT_B8G8R8A8_TYPELESS = 90,
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91,
|
||||
DXGI_FORMAT_B8G8R8X8_TYPELESS = 92,
|
||||
DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93,
|
||||
DXGI_FORMAT_BC6H_TYPELESS = 94,
|
||||
DXGI_FORMAT_BC6H_UF16 = 95,
|
||||
DXGI_FORMAT_BC6H_SF16 = 96,
|
||||
DXGI_FORMAT_BC7_TYPELESS = 97,
|
||||
DXGI_FORMAT_BC7_UNORM = 98,
|
||||
DXGI_FORMAT_BC7_UNORM_SRGB = 99,
|
||||
DXGI_FORMAT_AYUV = 100,
|
||||
DXGI_FORMAT_Y410 = 101,
|
||||
DXGI_FORMAT_Y416 = 102,
|
||||
DXGI_FORMAT_NV12 = 103,
|
||||
DXGI_FORMAT_P010 = 104,
|
||||
DXGI_FORMAT_P016 = 105,
|
||||
DXGI_FORMAT_420_OPAQUE = 106,
|
||||
DXGI_FORMAT_YUY2 = 107,
|
||||
DXGI_FORMAT_Y210 = 108,
|
||||
DXGI_FORMAT_Y216 = 109,
|
||||
DXGI_FORMAT_NV11 = 110,
|
||||
DXGI_FORMAT_AI44 = 111,
|
||||
DXGI_FORMAT_IA44 = 112,
|
||||
DXGI_FORMAT_P8 = 113,
|
||||
DXGI_FORMAT_A8P8 = 114,
|
||||
DXGI_FORMAT_B4G4R4A4_UNORM = 115,
|
||||
|
||||
DXGI_FORMAT_P208 = 130,
|
||||
DXGI_FORMAT_V208 = 131,
|
||||
DXGI_FORMAT_V408 = 132,
|
||||
|
||||
|
||||
DXGI_FORMAT_FORCE_UINT = 0xffffffff
|
||||
} DXGI_FORMAT;
|
||||
|
||||
#endif // __dxgiformat_h__
|
||||
Vendored
+143
@@ -0,0 +1,143 @@
|
||||
//
|
||||
// Copyright (C) Microsoft. All rights reserved.
|
||||
//
|
||||
#ifndef __dxgitype_h__
|
||||
#define __dxgitype_h__
|
||||
|
||||
#include "dxgiformat.h"
|
||||
|
||||
#define _FACDXGI 0x87a
|
||||
#define MAKE_DXGI_HRESULT(code) MAKE_HRESULT(1, _FACDXGI, code)
|
||||
#define MAKE_DXGI_STATUS(code) MAKE_HRESULT(0, _FACDXGI, code)
|
||||
|
||||
// DXGI error messages have moved to winerror.h
|
||||
|
||||
#define DXGI_CPU_ACCESS_NONE ( 0 )
|
||||
#define DXGI_CPU_ACCESS_DYNAMIC ( 1 )
|
||||
#define DXGI_CPU_ACCESS_READ_WRITE ( 2 )
|
||||
#define DXGI_CPU_ACCESS_SCRATCH ( 3 )
|
||||
#define DXGI_CPU_ACCESS_FIELD 15
|
||||
|
||||
|
||||
typedef struct DXGI_RGB
|
||||
{
|
||||
float Red;
|
||||
float Green;
|
||||
float Blue;
|
||||
} DXGI_RGB;
|
||||
|
||||
#ifndef D3DCOLORVALUE_DEFINED
|
||||
typedef struct _D3DCOLORVALUE {
|
||||
float r;
|
||||
float g;
|
||||
float b;
|
||||
float a;
|
||||
} D3DCOLORVALUE;
|
||||
|
||||
#define D3DCOLORVALUE_DEFINED
|
||||
#endif
|
||||
|
||||
typedef D3DCOLORVALUE DXGI_RGBA;
|
||||
|
||||
typedef struct DXGI_GAMMA_CONTROL
|
||||
{
|
||||
DXGI_RGB Scale;
|
||||
DXGI_RGB Offset;
|
||||
DXGI_RGB GammaCurve[ 1025 ];
|
||||
} DXGI_GAMMA_CONTROL;
|
||||
|
||||
typedef struct DXGI_GAMMA_CONTROL_CAPABILITIES
|
||||
{
|
||||
BOOL ScaleAndOffsetSupported;
|
||||
float MaxConvertedValue;
|
||||
float MinConvertedValue;
|
||||
UINT NumGammaControlPoints;
|
||||
float ControlPointPositions[1025];
|
||||
} DXGI_GAMMA_CONTROL_CAPABILITIES;
|
||||
|
||||
typedef struct DXGI_RATIONAL
|
||||
{
|
||||
UINT Numerator;
|
||||
UINT Denominator;
|
||||
} DXGI_RATIONAL;
|
||||
|
||||
typedef enum DXGI_MODE_SCANLINE_ORDER
|
||||
{
|
||||
DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED = 0,
|
||||
DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE = 1,
|
||||
DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST = 2,
|
||||
DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST = 3
|
||||
} DXGI_MODE_SCANLINE_ORDER;
|
||||
|
||||
typedef enum DXGI_MODE_SCALING
|
||||
{
|
||||
DXGI_MODE_SCALING_UNSPECIFIED = 0,
|
||||
DXGI_MODE_SCALING_CENTERED = 1,
|
||||
DXGI_MODE_SCALING_STRETCHED = 2
|
||||
} DXGI_MODE_SCALING;
|
||||
|
||||
typedef enum DXGI_MODE_ROTATION
|
||||
{
|
||||
DXGI_MODE_ROTATION_UNSPECIFIED = 0,
|
||||
DXGI_MODE_ROTATION_IDENTITY = 1,
|
||||
DXGI_MODE_ROTATION_ROTATE90 = 2,
|
||||
DXGI_MODE_ROTATION_ROTATE180 = 3,
|
||||
DXGI_MODE_ROTATION_ROTATE270 = 4
|
||||
} DXGI_MODE_ROTATION;
|
||||
|
||||
typedef struct DXGI_MODE_DESC
|
||||
{
|
||||
UINT Width;
|
||||
UINT Height;
|
||||
DXGI_RATIONAL RefreshRate;
|
||||
DXGI_FORMAT Format;
|
||||
DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;
|
||||
DXGI_MODE_SCALING Scaling;
|
||||
} DXGI_MODE_DESC;
|
||||
|
||||
// The following values are used with DXGI_SAMPLE_DESC::Quality:
|
||||
#define DXGI_STANDARD_MULTISAMPLE_QUALITY_PATTERN 0xffffffff
|
||||
#define DXGI_CENTER_MULTISAMPLE_QUALITY_PATTERN 0xfffffffe
|
||||
|
||||
typedef struct DXGI_SAMPLE_DESC
|
||||
{
|
||||
UINT Count;
|
||||
UINT Quality;
|
||||
} DXGI_SAMPLE_DESC;
|
||||
|
||||
typedef enum DXGI_COLOR_SPACE_TYPE
|
||||
{
|
||||
DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0,
|
||||
DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1,
|
||||
DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2,
|
||||
DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3,
|
||||
DXGI_COLOR_SPACE_RESERVED = 4,
|
||||
DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5,
|
||||
DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6,
|
||||
DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7,
|
||||
DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8,
|
||||
DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9,
|
||||
DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10,
|
||||
DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11,
|
||||
DXGI_COLOR_SPACE_CUSTOM = 0xFFFFFFFF
|
||||
} DXGI_COLOR_SPACE_TYPE;
|
||||
|
||||
typedef struct DXGI_JPEG_DC_HUFFMAN_TABLE
|
||||
{
|
||||
BYTE CodeCounts[12];
|
||||
BYTE CodeValues[12];
|
||||
} DXGI_JPEG_DC_HUFFMAN_TABLE;
|
||||
|
||||
typedef struct DXGI_JPEG_AC_HUFFMAN_TABLE
|
||||
{
|
||||
BYTE CodeCounts[16];
|
||||
BYTE CodeValues[162];
|
||||
} DXGI_JPEG_AC_HUFFMAN_TABLE;
|
||||
|
||||
typedef struct DXGI_JPEG_QUANTIZATION_TABLE
|
||||
{
|
||||
BYTE Elements[64];
|
||||
} DXGI_JPEG_QUANTIZATION_TABLE;
|
||||
|
||||
#endif // __dxgitype_h__
|
||||
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
+1
Submodule 3rdparty/pugixml added at f205aaf6e1
Vendored
+6698
File diff suppressed because it is too large
Load Diff
Vendored
+3301
File diff suppressed because it is too large
Load Diff
+26
-2
@@ -1,6 +1,30 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
cmake_minimum_required(VERSION 2.8.12)
|
||||
|
||||
set(ASMJIT_STATIC TRUE)
|
||||
|
||||
add_subdirectory( asmjit )
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
message(STATUS "No build type selected, default to Release")
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
message( FATAL_ERROR "RPCS3 can only be compiled on 64-bit platforms." )
|
||||
endif()
|
||||
|
||||
add_definitions(-DCMAKE_BUILD)
|
||||
|
||||
# We use libpng's static library and don't need to build the shared library and run the tests
|
||||
set(PNG_SHARED OFF CACHE BOOL "Build shared lib." FORCE)
|
||||
set(PNG_TESTS OFF CACHE BOOL "Build tests." FORCE)
|
||||
|
||||
# Select the version of libpng to use, default is builtin
|
||||
if (NOT USE_SYSTEM_LIBPNG)
|
||||
add_subdirectory( 3rdparty/libpng )
|
||||
endif()
|
||||
|
||||
# TODO: do real installation, including copying directory structure
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/bin")
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/bin")
|
||||
add_subdirectory( Vulkan )
|
||||
add_subdirectory( rpcs3 )
|
||||
add_subdirectory( rsx_program_decompiler )
|
||||
|
||||
Binary file not shown.
@@ -1,36 +1,60 @@
|
||||
RPCS3
|
||||
=====
|
||||
|
||||
[](https://travis-ci.org/DHrpcs3/rpcs3)
|
||||
[](https://travis-ci.org/RPCS3/rpcs3)
|
||||
[](https://ci.appveyor.com/project/rpcs3/rpcs3/branch/master)
|
||||
[](https://scan.coverity.com/projects/3960)
|
||||
[](https://coveralls.io/r/RPCS3/rpcs3)
|
||||
|
||||
An open-source PlayStation 3 emulator/debugger written in C++.
|
||||
|
||||
You can find some basic information in the [FAQ](https://github.com/DHrpcs3/rpcs3/wiki/FAQ). For discussion about this emulator and PS3 emulation please visit the [official forums](http://www.emunewz.net/forum/forumdisplay.php?fid=162).
|
||||
You can find some basic information in the [FAQ](https://github.com/RPCS3/rpcs3/wiki/FAQ). For discussion about this emulator and PS3 emulation please visit the [official forums](http://www.emunewz.net/forum/forumdisplay.php?fid=162).
|
||||
|
||||
|
||||
### Development
|
||||
|
||||
If you want to contribute please take a took at the [Coding Style](https://github.com/DHrpcs3/rpcs3/wiki/Coding-Style), [Roadmap](https://github.com/DHrpcs3/rpcs3/wiki/Roadmap) and [Developer Information](https://github.com/DHrpcs3/rpcs3/wiki/Developer-Information) pages. You should as well contact any of the developers in the forum in order to know about the current situation of the emulator.
|
||||
If you want to contribute please take a look at the [Coding Style](https://github.com/RPCS3/rpcs3/wiki/Coding-Style), [Roadmap](https://github.com/RPCS3/rpcs3/wiki/Roadmap) and [Developer Information](https://github.com/RPCS3/rpcs3/wiki/Developer-Information) pages. You should as well contact any of the developers in the forum in order to know about the current situation of the emulator.
|
||||
|
||||
|
||||
### Dependencies
|
||||
|
||||
__Windows__
|
||||
* [Visual C++ Redistributable Packages for Visual Studio 2013](http://www.microsoft.com/en-us/download/details.aspx?id=40784)
|
||||
* [OpenAL binaries](http://kcat.strangesoft.net/openal.html): download and copy `Win64\soft_oal.dll` to `rpcs3\bin\`
|
||||
* [Visual Studio 2015](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx)
|
||||
* [Visual C++ Redistributable Packages for Visual Studio 2015](http://www.microsoft.com/en-us/download/details.aspx?id=48145)
|
||||
* [Cmake 3.1.0+](http://www.cmake.org/download/) (required; add to PATH)
|
||||
* [Python 3.3+](https://www.python.org/downloads/) (required; add to PATH)
|
||||
|
||||
__Linux__
|
||||
* Debian & Ubuntu: `sudo apt-get install libopenal-dev libwxgtk3.0-dev build-essential`
|
||||
* GCC 5.1+ or Clang 3.5.0+
|
||||
* Debian & Ubuntu: `sudo apt-get install cmake build-essential libopenal-dev libwxgtk3.0-dev libglew-dev zlib1g-dev libedit-dev libvulkan-dev`
|
||||
* Arch: `sudo pacman -S glew openal wxgtk cmake llvm`
|
||||
|
||||
__Mac OSX__
|
||||
* Xcode 6+ (tested with Xcode 6.4)
|
||||
* Install with Homebrew: `brew install glew wxwidgets`
|
||||
* Remove '-framework QuickTime' from '_ldflags' in /usr/local/bin/wx-config
|
||||
|
||||
|
||||
### Building
|
||||
|
||||
To initialize the repository don't forget to execute `git submodule update --init` to pull the wxWidgets source.
|
||||
* __Windows__: Install *Visual Studio 2013*. Then open the *.SLN* file, and press *Build* > *Rebuild Solution*.
|
||||
To initialize the repository don't forget to execute `git submodule update --init` to pull the submodules.
|
||||
* __Windows__:
|
||||
1) Open the *.SLN* file.
|
||||
2) Build the projects in *__BUILD_BEFORE* folder: right-click on every project > *Build*.
|
||||
3) Press *BUILD* > *Build Solution* or *Rebuild Solution*.
|
||||
* __Linux & Mac OSX__:
|
||||
`cd rpcs3 && cmake CMakeLists.txt && make && cd ../` Then run with `cd bin && ./rpcs3`
|
||||
If you want to build with LLVM, then LLVM 3.8 is required.
|
||||
`cd rpcs3 && cmake CMakeLists.txt && make && cd ../` then run with `cd bin && ./rpcs3`.
|
||||
If you are on OSX and want to build with llvm don't forget to add `-DLLVM_DIR=...` (or wherever llvm brew was installed) to cmake invocation.
|
||||
When using GDB, configure it to ignore SIGSEGV signal (`handle SIGSEGV nostop noprint`).
|
||||
|
||||
##### CMake Build Options (Linux & Mac OSX)
|
||||
|
||||
- ```-DUSE_SYSTEM_LIBPNG=ON/OFF``` (default = *OFF*) </br>
|
||||
Build against the shared libpng instead of using the builtin one. libpng 1.6+ highly recommended. Try this option if you get version conflict errors or only see black game icons.
|
||||
|
||||
- ```-DUSE_SYSTEM_FFMPEG=ON/OFF``` (default = *OFF*) </br>
|
||||
Build against the shared ffmpeg libraries instead of using the builtin patched version. Try this if the builtin version breaks the OpenGL renderer for you.
|
||||
|
||||
### Support
|
||||
* [Donate by PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MPJ3S9XQXCE3G)
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
template<typename T, size_t size> class SizedStack
|
||||
{
|
||||
T m_ptr[size];
|
||||
uint m_count;
|
||||
|
||||
public:
|
||||
SizedStack()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
~SizedStack()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
bool Pop(T& dst)
|
||||
{
|
||||
if(!m_count)
|
||||
return false;
|
||||
|
||||
dst = m_ptr[--m_count];
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Push(const T& src)
|
||||
{
|
||||
if(m_count + 1 > size)
|
||||
return false;
|
||||
|
||||
m_ptr[m_count++] = src;
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t GetFreeCount() const
|
||||
{
|
||||
return size - m_count;
|
||||
}
|
||||
|
||||
size_t GetCount() const
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
size_t GetMaxCount() const
|
||||
{
|
||||
return size;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T> struct ScopedPtr
|
||||
{
|
||||
private:
|
||||
T* m_ptr;
|
||||
|
||||
public:
|
||||
ScopedPtr() : m_ptr(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
ScopedPtr(T* ptr) : m_ptr(ptr)
|
||||
{
|
||||
}
|
||||
|
||||
~ScopedPtr()
|
||||
{
|
||||
Swap(nullptr);
|
||||
}
|
||||
|
||||
operator T*() { return m_ptr; }
|
||||
operator const T*() const { return m_ptr; }
|
||||
|
||||
T* operator ->() { return m_ptr; }
|
||||
const T* operator ->() const { return m_ptr; }
|
||||
|
||||
void Swap(T* ptr)
|
||||
{
|
||||
delete m_ptr;
|
||||
m_ptr = ptr;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,993 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
#include "Platform.h"
|
||||
|
||||
// Helper class, provides access to compiler-specific atomic intrinsics
|
||||
template<typename T, std::size_t Size>
|
||||
struct atomic_storage
|
||||
{
|
||||
static_assert(sizeof(T) <= 16 && sizeof(T) == alignof(T), "atomic_storage<> error: invalid type");
|
||||
|
||||
/* First part: Non-MSVC intrinsics */
|
||||
|
||||
#ifndef _MSC_VER
|
||||
static inline bool compare_exchange(T& dest, T& comp, T exch)
|
||||
{
|
||||
return __atomic_compare_exchange(&dest, &comp, &exch, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T load(const T& dest)
|
||||
{
|
||||
T result;
|
||||
__atomic_load(&dest, &result, __ATOMIC_SEQ_CST);
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline void store(T& dest, T value)
|
||||
{
|
||||
__atomic_store(&dest, &value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T exchange(T& dest, T value)
|
||||
{
|
||||
T result;
|
||||
__atomic_exchange(&dest, &value, &result, __ATOMIC_SEQ_CST);
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline T fetch_add(T& dest, T value)
|
||||
{
|
||||
return __atomic_fetch_add(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T add_fetch(T& dest, T value)
|
||||
{
|
||||
return __atomic_add_fetch(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T fetch_sub(T& dest, T value)
|
||||
{
|
||||
return __atomic_fetch_sub(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T sub_fetch(T& dest, T value)
|
||||
{
|
||||
return __atomic_sub_fetch(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T fetch_and(T& dest, T value)
|
||||
{
|
||||
return __atomic_fetch_and(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T and_fetch(T& dest, T value)
|
||||
{
|
||||
return __atomic_and_fetch(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T fetch_xor(T& dest, T value)
|
||||
{
|
||||
return __atomic_fetch_xor(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T xor_fetch(T& dest, T value)
|
||||
{
|
||||
return __atomic_xor_fetch(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T fetch_or(T& dest, T value)
|
||||
{
|
||||
return __atomic_fetch_or(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline T or_fetch(T& dest, T value)
|
||||
{
|
||||
return __atomic_or_fetch(&dest, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Second part: MSVC-specific */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
static inline T add_fetch(T& dest, T value)
|
||||
{
|
||||
return atomic_storage<T>::fetch_add(dest, value) + value;
|
||||
}
|
||||
|
||||
static inline T fetch_sub(T& dest, T value)
|
||||
{
|
||||
return atomic_storage<T>::fetch_add(dest, 0 - value);
|
||||
}
|
||||
|
||||
static inline T sub_fetch(T& dest, T value)
|
||||
{
|
||||
return atomic_storage<T>::fetch_add(dest, 0 - value) - value;
|
||||
}
|
||||
|
||||
static inline T and_fetch(T& dest, T value)
|
||||
{
|
||||
return atomic_storage<T>::fetch_and(dest, value) & value;
|
||||
}
|
||||
|
||||
static inline T or_fetch(T& dest, T value)
|
||||
{
|
||||
return atomic_storage<T>::fetch_or(dest, value) | value;
|
||||
}
|
||||
|
||||
static inline T xor_fetch(T& dest, T value)
|
||||
{
|
||||
return atomic_storage<T>::fetch_xor(dest, value) ^ value;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Third part: fallbacks, may be hidden by subsequent atomic_storage<> specializations */
|
||||
|
||||
static inline T fetch_inc(T& dest)
|
||||
{
|
||||
return atomic_storage<T>::fetch_add(dest, 1);
|
||||
}
|
||||
|
||||
static inline T inc_fetch(T& dest)
|
||||
{
|
||||
return atomic_storage<T>::add_fetch(dest, 1);
|
||||
}
|
||||
|
||||
static inline T fetch_dec(T& dest)
|
||||
{
|
||||
return atomic_storage<T>::fetch_sub(dest, 1);
|
||||
}
|
||||
|
||||
static inline T dec_fetch(T& dest)
|
||||
{
|
||||
return atomic_storage<T>::sub_fetch(dest, 1);
|
||||
}
|
||||
|
||||
static inline bool bts(T& dest, uint bit)
|
||||
{
|
||||
const T mask = static_cast<T>(1) << bit;
|
||||
return (atomic_storage<T>::fetch_or(dest, mask) & mask) != 0;
|
||||
}
|
||||
|
||||
static inline bool btr(T& dest, uint bit)
|
||||
{
|
||||
const T mask = static_cast<T>(1) << bit;
|
||||
return (atomic_storage<T>::fetch_and(dest, ~mask) & mask) != 0;
|
||||
}
|
||||
|
||||
static inline bool btc(T& dest, uint bit)
|
||||
{
|
||||
const T mask = static_cast<T>(1) << bit;
|
||||
return (atomic_storage<T>::fetch_xor(dest, mask) & mask) != 0;
|
||||
}
|
||||
};
|
||||
|
||||
/* The rest: ugly MSVC intrinsics + possibly __asm__ implementations (TODO) */
|
||||
|
||||
template<typename T>
|
||||
struct atomic_storage<T, 1> : atomic_storage<T, 0>
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
static inline bool compare_exchange(T& dest, T& comp, T exch)
|
||||
{
|
||||
char v = *(char*)∁
|
||||
char r = _InterlockedCompareExchange8((volatile char*)&dest, (char&)exch, v);
|
||||
comp = (T&)r;
|
||||
return r == v;
|
||||
}
|
||||
|
||||
static inline T load(const T& dest)
|
||||
{
|
||||
char value = *(const volatile char*)&dest;
|
||||
_ReadWriteBarrier();
|
||||
return (T&)value;
|
||||
}
|
||||
|
||||
static inline void store(T& dest, T value)
|
||||
{
|
||||
_InterlockedExchange8((volatile char*)&dest, (char&)value);
|
||||
}
|
||||
|
||||
static inline T exchange(T& dest, T value)
|
||||
{
|
||||
char r = _InterlockedExchange8((volatile char*)&dest, (char&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_add(T& dest, T value)
|
||||
{
|
||||
char r = _InterlockedExchangeAdd8((volatile char*)&dest, (char&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_and(T& dest, T value)
|
||||
{
|
||||
char r = _InterlockedAnd8((volatile char*)&dest, (char&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_or(T& dest, T value)
|
||||
{
|
||||
char r = _InterlockedOr8((volatile char*)&dest, (char&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_xor(T& dest, T value)
|
||||
{
|
||||
char r = _InterlockedXor8((volatile char*)&dest, (char&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_storage<T, 2> : atomic_storage<T, 0>
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
static inline bool compare_exchange(T& dest, T& comp, T exch)
|
||||
{
|
||||
short v = *(short*)∁
|
||||
short r = _InterlockedCompareExchange16((volatile short*)&dest, (short&)exch, v);
|
||||
comp = (T&)r;
|
||||
return r == v;
|
||||
}
|
||||
|
||||
static inline T load(const T& dest)
|
||||
{
|
||||
short value = *(const volatile short*)&dest;
|
||||
_ReadWriteBarrier();
|
||||
return (T&)value;
|
||||
}
|
||||
|
||||
static inline void store(T& dest, T value)
|
||||
{
|
||||
_InterlockedExchange16((volatile short*)&dest, (short&)value);
|
||||
}
|
||||
|
||||
static inline T exchange(T& dest, T value)
|
||||
{
|
||||
short r = _InterlockedExchange16((volatile short*)&dest, (short&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_add(T& dest, T value)
|
||||
{
|
||||
short r = _InterlockedExchangeAdd16((volatile short*)&dest, (short&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_and(T& dest, T value)
|
||||
{
|
||||
short r = _InterlockedAnd16((volatile short*)&dest, (short&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_or(T& dest, T value)
|
||||
{
|
||||
short r = _InterlockedOr16((volatile short*)&dest, (short&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_xor(T& dest, T value)
|
||||
{
|
||||
short r = _InterlockedXor16((volatile short*)&dest, (short&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T inc_fetch(T& dest)
|
||||
{
|
||||
short r = _InterlockedIncrement16((volatile short*)&dest);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T dec_fetch(T& dest)
|
||||
{
|
||||
short r = _InterlockedDecrement16((volatile short*)&dest);
|
||||
return (T&)r;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_storage<T, 4> : atomic_storage<T, 0>
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
static inline bool compare_exchange(T& dest, T& comp, T exch)
|
||||
{
|
||||
long v = *(long*)∁
|
||||
long r = _InterlockedCompareExchange((volatile long*)&dest, (long&)exch, v);
|
||||
comp = (T&)r;
|
||||
return r == v;
|
||||
}
|
||||
|
||||
static inline T load(const T& dest)
|
||||
{
|
||||
long value = *(const volatile long*)&dest;
|
||||
_ReadWriteBarrier();
|
||||
return (T&)value;
|
||||
}
|
||||
|
||||
static inline void store(T& dest, T value)
|
||||
{
|
||||
_InterlockedExchange((volatile long*)&dest, (long&)value);
|
||||
}
|
||||
|
||||
static inline T exchange(T& dest, T value)
|
||||
{
|
||||
long r = _InterlockedExchange((volatile long*)&dest, (long&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_add(T& dest, T value)
|
||||
{
|
||||
long r = _InterlockedExchangeAdd((volatile long*)&dest, (long&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_and(T& dest, T value)
|
||||
{
|
||||
long r = _InterlockedAnd((volatile long*)&dest, (long&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_or(T& dest, T value)
|
||||
{
|
||||
long r = _InterlockedOr((volatile long*)&dest, (long&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_xor(T& dest, T value)
|
||||
{
|
||||
long r = _InterlockedXor((volatile long*)&dest, (long&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T inc_fetch(T& dest)
|
||||
{
|
||||
long r = _InterlockedIncrement((volatile long*)&dest);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T dec_fetch(T& dest)
|
||||
{
|
||||
long r = _InterlockedDecrement((volatile long*)&dest);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline bool bts(T& dest, uint bit)
|
||||
{
|
||||
return _interlockedbittestandset((volatile long*)&dest, bit) != 0;
|
||||
}
|
||||
|
||||
static inline bool btr(T& dest, uint bit)
|
||||
{
|
||||
return _interlockedbittestandreset((volatile long*)&dest, bit) != 0;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_storage<T, 8> : atomic_storage<T, 0>
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
static inline bool compare_exchange(T& dest, T& comp, T exch)
|
||||
{
|
||||
llong v = *(llong*)∁
|
||||
llong r = _InterlockedCompareExchange64((volatile llong*)&dest, (llong&)exch, v);
|
||||
comp = (T&)r;
|
||||
return r == v;
|
||||
}
|
||||
|
||||
static inline T load(const T& dest)
|
||||
{
|
||||
llong value = *(const volatile llong*)&dest;
|
||||
_ReadWriteBarrier();
|
||||
return (T&)value;
|
||||
}
|
||||
|
||||
static inline void store(T& dest, T value)
|
||||
{
|
||||
_InterlockedExchange64((volatile llong*)&dest, (llong&)value);
|
||||
}
|
||||
|
||||
static inline T exchange(T& dest, T value)
|
||||
{
|
||||
llong r = _InterlockedExchange64((volatile llong*)&dest, (llong&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_add(T& dest, T value)
|
||||
{
|
||||
llong r = _InterlockedExchangeAdd64((volatile llong*)&dest, (llong&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_and(T& dest, T value)
|
||||
{
|
||||
llong r = _InterlockedAnd64((volatile llong*)&dest, (llong&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_or(T& dest, T value)
|
||||
{
|
||||
llong r = _InterlockedOr64((volatile llong*)&dest, (llong&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T fetch_xor(T& dest, T value)
|
||||
{
|
||||
llong r = _InterlockedXor64((volatile llong*)&dest, (llong&)value);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T inc_fetch(T& dest)
|
||||
{
|
||||
llong r = _InterlockedIncrement64((volatile llong*)&dest);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline T dec_fetch(T& dest)
|
||||
{
|
||||
llong r = _InterlockedDecrement64((volatile llong*)&dest);
|
||||
return (T&)r;
|
||||
}
|
||||
|
||||
static inline bool bts(T& dest, uint bit)
|
||||
{
|
||||
return _interlockedbittestandset64((volatile llong*)&dest, bit) != 0;
|
||||
}
|
||||
|
||||
static inline bool btr(T& dest, uint bit)
|
||||
{
|
||||
return _interlockedbittestandreset64((volatile llong*)&dest, bit) != 0;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_storage<T, 16> : atomic_storage<T, 0>
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
static inline bool compare_exchange(T& dest, T& comp, T exch)
|
||||
{
|
||||
llong* _exch = (llong*)&exch;
|
||||
return _InterlockedCompareExchange128((volatile llong*)&dest, _exch[1], _exch[0], (llong*)&comp) != 0;
|
||||
}
|
||||
|
||||
static inline T load(const T& dest)
|
||||
{
|
||||
llong result[2];
|
||||
_InterlockedCompareExchange128((volatile llong*)&dest, 0, 0, result);
|
||||
return *(T*)+result;
|
||||
}
|
||||
|
||||
static inline void store(T& dest, T value)
|
||||
{
|
||||
llong lo = *(llong*)&value;
|
||||
llong hi = *((llong*)&value + 1);
|
||||
llong cmp[2]{ *(volatile llong*)&dest, *((volatile llong*)&dest + 1) };
|
||||
while (!_InterlockedCompareExchange128((volatile llong*)&dest, hi, lo, cmp));
|
||||
}
|
||||
|
||||
static inline T exchange(T& dest, T value)
|
||||
{
|
||||
llong lo = *(llong*)&value;
|
||||
llong hi = *((llong*)&value + 1);
|
||||
llong cmp[2]{ *(volatile llong*)&dest, *((volatile llong*)&dest + 1) };
|
||||
while (!_InterlockedCompareExchange128((volatile llong*)&dest, hi, lo, cmp));
|
||||
return *(T*)+cmp;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_add
|
||||
{
|
||||
auto operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs += rhs;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_add<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static constexpr auto fetch_op = &atomic_storage<T1>::fetch_add;
|
||||
static constexpr auto op_fetch = &atomic_storage<T1>::add_fetch;
|
||||
static constexpr auto atomic_op = &atomic_storage<T1>::add_fetch;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_sub
|
||||
{
|
||||
auto operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs -= rhs;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_sub<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static constexpr auto fetch_op = &atomic_storage<T1>::fetch_sub;
|
||||
static constexpr auto op_fetch = &atomic_storage<T1>::sub_fetch;
|
||||
static constexpr auto atomic_op = &atomic_storage<T1>::sub_fetch;
|
||||
};
|
||||
|
||||
template<typename T, typename>
|
||||
struct atomic_pre_inc
|
||||
{
|
||||
auto operator()(T& v) const
|
||||
{
|
||||
return ++v;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_pre_inc<T, std::enable_if_t<std::is_integral<T>::value>>
|
||||
{
|
||||
static constexpr auto atomic_op = &atomic_storage<T>::inc_fetch;
|
||||
};
|
||||
|
||||
template<typename T, typename>
|
||||
struct atomic_post_inc
|
||||
{
|
||||
auto operator()(T& v) const
|
||||
{
|
||||
return v++;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_post_inc<T, std::enable_if_t<std::is_integral<T>::value>>
|
||||
{
|
||||
static constexpr auto atomic_op = &atomic_storage<T>::fetch_inc;
|
||||
};
|
||||
|
||||
template<typename T, typename>
|
||||
struct atomic_pre_dec
|
||||
{
|
||||
auto operator()(T& v) const
|
||||
{
|
||||
return --v;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_pre_dec<T, std::enable_if_t<std::is_integral<T>::value>>
|
||||
{
|
||||
static constexpr auto atomic_op = &atomic_storage<T>::dec_fetch;
|
||||
};
|
||||
|
||||
template<typename T, typename>
|
||||
struct atomic_post_dec
|
||||
{
|
||||
auto operator()(T& v) const
|
||||
{
|
||||
return v--;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_post_dec<T, std::enable_if_t<std::is_integral<T>::value>>
|
||||
{
|
||||
static constexpr auto atomic_op = &atomic_storage<T>::fetch_dec;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_and
|
||||
{
|
||||
auto operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs &= rhs;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_and<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static constexpr auto fetch_op = &atomic_storage<T1>::fetch_and;
|
||||
static constexpr auto op_fetch = &atomic_storage<T1>::and_fetch;
|
||||
static constexpr auto atomic_op = &atomic_storage<T1>::and_fetch;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_or
|
||||
{
|
||||
auto operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs |= rhs;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_or<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static constexpr auto fetch_op = &atomic_storage<T1>::fetch_or;
|
||||
static constexpr auto op_fetch = &atomic_storage<T1>::or_fetch;
|
||||
static constexpr auto atomic_op = &atomic_storage<T1>::or_fetch;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_xor
|
||||
{
|
||||
auto operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs ^= rhs;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_xor<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static constexpr auto fetch_op = &atomic_storage<T1>::fetch_xor;
|
||||
static constexpr auto op_fetch = &atomic_storage<T1>::xor_fetch;
|
||||
static constexpr auto atomic_op = &atomic_storage<T1>::xor_fetch;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_test_and_set
|
||||
{
|
||||
bool operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs.test_and_set(rhs);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_test_and_set<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static inline bool op(T1& lhs, const T2& rhs)
|
||||
{
|
||||
return (atomic_storage<T1>::fetch_or(lhs, rhs) & rhs) != 0;
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op;
|
||||
static constexpr auto op_fetch = &op;
|
||||
static constexpr auto atomic_op = &op;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_test_and_reset
|
||||
{
|
||||
bool operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs.test_and_reset(rhs);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_test_and_reset<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static inline bool op(T1& lhs, const T2& rhs)
|
||||
{
|
||||
return (atomic_storage<T1>::fetch_and(lhs, ~rhs) & rhs) != 0;
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op;
|
||||
static constexpr auto op_fetch = &op;
|
||||
static constexpr auto atomic_op = &op;
|
||||
};
|
||||
|
||||
template<typename T1, typename T2, typename>
|
||||
struct atomic_test_and_complement
|
||||
{
|
||||
bool operator()(T1& lhs, const T2& rhs) const
|
||||
{
|
||||
return lhs.test_and_complement(rhs);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T1, typename T2>
|
||||
struct atomic_test_and_complement<T1, T2, std::enable_if_t<std::is_integral<T1>::value && std::is_convertible<T2, T1>::value>>
|
||||
{
|
||||
static inline bool op(T1& lhs, const T2& rhs)
|
||||
{
|
||||
return (atomic_storage<T1>::fetch_xor(lhs, rhs) & rhs) != 0;
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op;
|
||||
static constexpr auto op_fetch = &op;
|
||||
static constexpr auto atomic_op = &op;
|
||||
};
|
||||
|
||||
// Atomic type with lock-free and standard layout guarantees (and appropriate limitations)
|
||||
template<typename T>
|
||||
class atomic_t
|
||||
{
|
||||
using type = typename std::remove_cv<T>::type;
|
||||
|
||||
static_assert(alignof(type) == sizeof(type), "atomic_t<> error: unexpected alignment, use alignas() if necessary");
|
||||
|
||||
type m_data;
|
||||
|
||||
public:
|
||||
atomic_t() = default;
|
||||
|
||||
atomic_t(const atomic_t&) = delete;
|
||||
|
||||
atomic_t& operator =(const atomic_t&) = delete;
|
||||
|
||||
// Define simple type
|
||||
using simple_type = simple_t<T>;
|
||||
|
||||
explicit constexpr atomic_t(const type& value)
|
||||
: m_data(value)
|
||||
{
|
||||
}
|
||||
|
||||
// Unsafe direct access
|
||||
type& raw()
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
// Atomically compare data with cmp, replace with exch if equal, return previous data value anyway
|
||||
simple_type compare_and_swap(const type& cmp, const type& exch)
|
||||
{
|
||||
type old = cmp;
|
||||
atomic_storage<type>::compare_exchange(m_data, old, exch);
|
||||
return old;
|
||||
}
|
||||
|
||||
// Atomically compare data with cmp, replace with exch if equal, return true if data was replaced
|
||||
bool compare_and_swap_test(const type& cmp, const type& exch)
|
||||
{
|
||||
type old = cmp;
|
||||
return atomic_storage<type>::compare_exchange(m_data, old, exch);
|
||||
}
|
||||
|
||||
// Atomic operation; returns old value, discards function result value
|
||||
template<typename F, typename... Args, typename RT = std::result_of_t<F(T&, const Args&...)>>
|
||||
type fetch_op(F&& func, const Args&... args)
|
||||
{
|
||||
type _new, old = atomic_storage<type>::load(m_data);
|
||||
|
||||
while (true)
|
||||
{
|
||||
func((_new = old), args...);
|
||||
|
||||
if (LIKELY(atomic_storage<type>::compare_exchange(m_data, old, _new))) return old;
|
||||
}
|
||||
}
|
||||
|
||||
// Helper overload for calling optimized implementation
|
||||
template<typename F, typename... Args, typename FT = decltype(F::fetch_op), typename RT = std::result_of_t<FT(T&, const Args&...)>>
|
||||
type fetch_op(F&&, const Args&... args)
|
||||
{
|
||||
return F::fetch_op(m_data, args...);
|
||||
}
|
||||
|
||||
// Atomic operation; returns new value, discards function result value
|
||||
template<typename F, typename... Args, typename RT = std::result_of_t<F(T&, const Args&...)>>
|
||||
type op_fetch(F&& func, const Args&... args)
|
||||
{
|
||||
type _new, old = atomic_storage<type>::load(m_data);
|
||||
|
||||
while (true)
|
||||
{
|
||||
func((_new = old), args...);
|
||||
|
||||
if (LIKELY(atomic_storage<type>::compare_exchange(m_data, old, _new))) return _new;
|
||||
}
|
||||
}
|
||||
|
||||
// Helper overload for calling optimized implementation
|
||||
template<typename F, typename... Args, typename FT = decltype(F::op_fetch), typename RT = std::result_of_t<FT(T&, const Args&...)>>
|
||||
type op_fetch(F&&, const Args&... args)
|
||||
{
|
||||
return F::op_fetch(m_data, args...);
|
||||
}
|
||||
|
||||
// Atomic operation; returns function result value
|
||||
template<typename F, typename... Args, typename RT = std::result_of_t<F(T&, const Args&...)>, typename = std::enable_if_t<!std::is_void<RT>::value>>
|
||||
RT atomic_op(F&& func, const Args&... args)
|
||||
{
|
||||
type _new, old = atomic_storage<type>::load(m_data);
|
||||
|
||||
while (true)
|
||||
{
|
||||
RT&& result = func((_new = old), args...);
|
||||
|
||||
if (LIKELY(atomic_storage<type>::compare_exchange(m_data, old, _new))) return std::move(result);
|
||||
}
|
||||
}
|
||||
|
||||
// Overload for void return type
|
||||
template<typename F, typename... Args, typename RT = std::result_of_t<F(T&, const Args&...)>, typename = std::enable_if_t<std::is_void<RT>::value>>
|
||||
void atomic_op(F&& func, const Args&... args)
|
||||
{
|
||||
type _new, old = atomic_storage<type>::load(m_data);
|
||||
|
||||
while (true)
|
||||
{
|
||||
func((_new = old), args...);
|
||||
|
||||
if (LIKELY(atomic_storage<type>::compare_exchange(m_data, old, _new))) return;
|
||||
}
|
||||
}
|
||||
|
||||
// Helper overload for calling optimized implementation
|
||||
template<typename F, typename... Args, typename FT = decltype(F::atomic_op), typename RT = std::result_of_t<FT(T&, const Args&...)>>
|
||||
auto atomic_op(F&&, const Args&... args)
|
||||
{
|
||||
return F::atomic_op(m_data, args...);
|
||||
}
|
||||
|
||||
// Atomically read data
|
||||
type load() const
|
||||
{
|
||||
return atomic_storage<type>::load(m_data);
|
||||
}
|
||||
|
||||
// Atomically read data
|
||||
operator simple_type() const
|
||||
{
|
||||
return atomic_storage<type>::load(m_data);
|
||||
}
|
||||
|
||||
// Atomically write data
|
||||
void store(const type& rhs)
|
||||
{
|
||||
atomic_storage<type>::store(m_data, rhs);
|
||||
}
|
||||
|
||||
type operator =(const type& rhs)
|
||||
{
|
||||
atomic_storage<type>::store(m_data, rhs);
|
||||
return rhs;
|
||||
}
|
||||
|
||||
// Atomically replace data with value, return previous data value
|
||||
type exchange(const type& rhs)
|
||||
{
|
||||
return atomic_storage<type>::exchange(m_data, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type fetch_add(const T2& rhs)
|
||||
{
|
||||
return fetch_op(atomic_add<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type add_fetch(const T2& rhs)
|
||||
{
|
||||
return op_fetch(atomic_add<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
auto operator +=(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_add<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type fetch_sub(const T2& rhs)
|
||||
{
|
||||
return fetch_op(atomic_sub<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type sub_fetch(const T2& rhs)
|
||||
{
|
||||
return op_fetch(atomic_sub<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
auto operator -=(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_sub<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type fetch_and(const T2& rhs)
|
||||
{
|
||||
return fetch_op(atomic_and<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type and_fetch(const T2& rhs)
|
||||
{
|
||||
return op_fetch(atomic_and<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
auto operator &=(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_and<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type fetch_or(const T2& rhs)
|
||||
{
|
||||
return fetch_op(atomic_or<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type or_fetch(const T2& rhs)
|
||||
{
|
||||
return op_fetch(atomic_or<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
auto operator |=(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_or<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type fetch_xor(const T2& rhs)
|
||||
{
|
||||
return fetch_op(atomic_xor<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
type xor_fetch(const T2& rhs)
|
||||
{
|
||||
return op_fetch(atomic_xor<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2>
|
||||
auto operator ^=(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_xor<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
auto operator ++()
|
||||
{
|
||||
return atomic_op(atomic_pre_inc<type>{});
|
||||
}
|
||||
|
||||
auto operator --()
|
||||
{
|
||||
return atomic_op(atomic_pre_dec<type>{});
|
||||
}
|
||||
|
||||
auto operator ++(int)
|
||||
{
|
||||
return atomic_op(atomic_post_inc<type>{});
|
||||
}
|
||||
|
||||
auto operator --(int)
|
||||
{
|
||||
return atomic_op(atomic_post_dec<type>{});
|
||||
}
|
||||
|
||||
template<typename T2 = T>
|
||||
auto test(const T2& rhs) const
|
||||
{
|
||||
return load().test(rhs);
|
||||
}
|
||||
|
||||
template<typename T2 = T>
|
||||
auto test_and_set(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_test_and_set<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2 = T>
|
||||
auto test_and_reset(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_test_and_reset<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
template<typename T2 = T>
|
||||
auto test_and_complement(const T2& rhs)
|
||||
{
|
||||
return atomic_op(atomic_test_and_complement<type, T2>{}, rhs);
|
||||
}
|
||||
|
||||
// Minimal pointer support (TODO: must forward operator ->())
|
||||
type operator ->() const
|
||||
{
|
||||
return load();
|
||||
}
|
||||
|
||||
// Minimal array support
|
||||
template<typename I = std::size_t>
|
||||
auto operator [](const I& index) const -> decltype(std::declval<const type>()[std::declval<I>()])
|
||||
{
|
||||
return load()[index];
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,150 @@
|
||||
#pragma once
|
||||
|
||||
#include "Atomic.h"
|
||||
#include <memory>
|
||||
|
||||
// Unfinished. Only std::default_delete will work as expected.
|
||||
template<typename T, typename D>
|
||||
class atomic_ptr_base : D
|
||||
{
|
||||
protected:
|
||||
atomic_t<T*> m_ptr;
|
||||
|
||||
constexpr atomic_ptr_base(T* ptr)
|
||||
: m_ptr(ptr)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
~atomic_ptr_base()
|
||||
{
|
||||
if (m_ptr)
|
||||
{
|
||||
(*this)(m_ptr.load());
|
||||
}
|
||||
}
|
||||
|
||||
D& get_deleter()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
const D& get_deleter() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
// Simple atomic pointer with unique ownership. Draft, unfinished.
|
||||
template<typename T, typename D = std::default_delete<T>>
|
||||
class atomic_ptr final : atomic_ptr_base<T, D>
|
||||
{
|
||||
using base = atomic_ptr_base<T, D>;
|
||||
|
||||
static_assert(sizeof(T*) == sizeof(base), "atomic_ptr<> error: invalid deleter (empty class expected)");
|
||||
|
||||
public:
|
||||
constexpr atomic_ptr()
|
||||
: base(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
constexpr atomic_ptr(std::nullptr_t)
|
||||
: base(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
explicit atomic_ptr(T* ptr)
|
||||
: base(ptr)
|
||||
{
|
||||
}
|
||||
|
||||
template<typename T2, typename = std::enable_if_t<std::is_convertible<T2, T>::value>>
|
||||
atomic_ptr(std::unique_ptr<T2, D>&& ptr)
|
||||
: base(ptr.release())
|
||||
{
|
||||
}
|
||||
|
||||
atomic_ptr& operator =(std::nullptr_t)
|
||||
{
|
||||
if (T* old = base::m_ptr.exchange(nullptr))
|
||||
{
|
||||
this->get_deleter()(old);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T2, typename = std::enable_if_t<std::is_convertible<T2, T>::value>>
|
||||
atomic_ptr& operator =(std::unique_ptr<T2, D>&& ptr)
|
||||
{
|
||||
if (T* old = base::m_ptr.exchange(ptr.release()))
|
||||
{
|
||||
this->get_deleter()(old);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void swap(std::unique_ptr<T, D>& ptr)
|
||||
{
|
||||
ptr.reset(base::m_ptr.exchange(ptr.release()));
|
||||
}
|
||||
|
||||
std::add_lvalue_reference_t<T> operator *() const
|
||||
{
|
||||
return *base::m_ptr;
|
||||
}
|
||||
|
||||
T* operator ->() const
|
||||
{
|
||||
return base::m_ptr;
|
||||
}
|
||||
|
||||
T* get() const
|
||||
{
|
||||
return base::m_ptr;
|
||||
}
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return base::m_ptr != nullptr;
|
||||
}
|
||||
|
||||
T* release() const
|
||||
{
|
||||
return base::m_ptr.exchange(0);
|
||||
}
|
||||
|
||||
void reset(T* ptr = nullptr)
|
||||
{
|
||||
if (T* old = base::m_ptr.exchange(ptr))
|
||||
{
|
||||
this->get_deleter()(old);
|
||||
}
|
||||
}
|
||||
|
||||
// Steal the pointer from `ptr`, convert old value to unique_ptr
|
||||
std::unique_ptr<T, D> exchange(std::unique_ptr<T, D>&& ptr)
|
||||
{
|
||||
return std::unique_ptr<T, D>(base::m_ptr.exchange(ptr.release()));
|
||||
}
|
||||
|
||||
// If pointer is null, steal it from `ptr`
|
||||
bool test_and_swap(std::unique_ptr<T, D>&& ptr)
|
||||
{
|
||||
if (base::m_ptr.compare_and_swap_test(nullptr, ptr.get()))
|
||||
{
|
||||
ptr.release();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename D>
|
||||
class atomic_ptr<T[], D> final : atomic_ptr_base<T[], D>
|
||||
{
|
||||
// TODO
|
||||
};
|
||||
@@ -0,0 +1,73 @@
|
||||
#include "stdafx.h"
|
||||
#include "Config.h"
|
||||
#include "Emu/System.h"
|
||||
#include "AutoPause.h"
|
||||
|
||||
cfg::bool_entry g_cfg_debug_autopause_syscall(cfg::root.misc, "Auto Pause at System Call");
|
||||
cfg::bool_entry g_cfg_debug_autopause_func_call(cfg::root.misc, "Auto Pause at Function Call");
|
||||
|
||||
debug::autopause& debug::autopause::get_instance()
|
||||
{
|
||||
// Use magic static
|
||||
static autopause instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
// Load Auto Pause Configuration from file "pause.bin"
|
||||
void debug::autopause::reload(void)
|
||||
{
|
||||
auto& instance = get_instance();
|
||||
|
||||
instance.m_pause_function.clear();
|
||||
instance.m_pause_syscall.clear();
|
||||
|
||||
// TODO: better format, possibly a config entry
|
||||
if (fs::file list{ fs::get_config_dir() + "pause.bin" })
|
||||
{
|
||||
u32 num;
|
||||
size_t fmax = list.size();
|
||||
size_t fcur = 0;
|
||||
list.seek(0);
|
||||
while (fcur <= fmax - sizeof(u32))
|
||||
{
|
||||
list.read(&num, sizeof(u32));
|
||||
fcur += sizeof(u32);
|
||||
if (num == 0xFFFFFFFF) break;
|
||||
|
||||
if (num < 1024)
|
||||
{
|
||||
instance.m_pause_syscall.emplace(num);
|
||||
LOG_WARNING(HLE, "Set autopause at syscall %lld", num);
|
||||
}
|
||||
else
|
||||
{
|
||||
instance.m_pause_function.emplace(num);
|
||||
LOG_WARNING(HLE, "Set autopause at function 0x%08x", num);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool debug::autopause::pause_syscall(u64 code)
|
||||
{
|
||||
if (g_cfg_debug_autopause_syscall && get_instance().m_pause_syscall.count(code) != 0)
|
||||
{
|
||||
Emu.Pause();
|
||||
LOG_SUCCESS(HLE, "Autopause triggered at syscall %lld", code);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool debug::autopause::pause_function(u32 code)
|
||||
{
|
||||
if (g_cfg_debug_autopause_func_call && get_instance().m_pause_function.count(code) != 0)
|
||||
{
|
||||
Emu.Pause();
|
||||
LOG_SUCCESS(HLE, "Autopause triggered at function 0x%08x", code);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
// Regarded as a Debugger Enchantment
|
||||
namespace debug
|
||||
{
|
||||
// To store the pause function/call id, and let those pause there.
|
||||
// Would be with a GUI to configure those.
|
||||
class autopause
|
||||
{
|
||||
std::unordered_set<u64> m_pause_syscall;
|
||||
std::unordered_set<u32> m_pause_function;
|
||||
|
||||
static autopause& get_instance();
|
||||
public:
|
||||
|
||||
static void reload();
|
||||
static bool pause_syscall(u64 code);
|
||||
static bool pause_function(u32 code);
|
||||
};
|
||||
}
|
||||
+884
-154
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,244 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
|
||||
template<typename T, uint N>
|
||||
struct bf_base
|
||||
{
|
||||
using type = T;
|
||||
using vtype = simple_t<type>;
|
||||
|
||||
// Datatype bitsize
|
||||
static constexpr uint bitmax = sizeof(T) * CHAR_BIT; static_assert(N - 1 < bitmax, "bf_base<> error: N out of bounds");
|
||||
|
||||
// Field bitsize
|
||||
static constexpr uint bitsize = N;
|
||||
|
||||
// Value mask
|
||||
static constexpr vtype vmask = static_cast<vtype>(~std::make_unsigned_t<vtype>{} >> (bitmax - bitsize));
|
||||
|
||||
protected:
|
||||
type m_data;
|
||||
};
|
||||
|
||||
// Bitfield accessor (N bits from I position, 0 is LSB)
|
||||
template<typename T, uint I, uint N>
|
||||
struct bf_t : bf_base<T, N>
|
||||
{
|
||||
using type = typename bf_t::type;
|
||||
using vtype = typename bf_t::vtype;
|
||||
|
||||
// Field offset
|
||||
static constexpr uint bitpos = I; static_assert(bitpos + N <= bf_t::bitmax, "bf_t<> error: I out of bounds");
|
||||
|
||||
// Get bitmask of size N, at I pos
|
||||
static constexpr vtype data_mask()
|
||||
{
|
||||
return bf_t::vmask << bitpos;
|
||||
}
|
||||
|
||||
// Bitfield extraction helper
|
||||
template<typename T2, typename = void>
|
||||
struct extract_impl
|
||||
{
|
||||
static_assert(!sizeof(T2), "bf_t<> error: Invalid type");
|
||||
};
|
||||
|
||||
template<typename T2>
|
||||
struct extract_impl<T2, std::enable_if_t<std::is_unsigned<T2>::value>>
|
||||
{
|
||||
// Load unsigned value
|
||||
static constexpr T2 extract(const T& data)
|
||||
{
|
||||
return (data >> bitpos) & bf_t::vmask;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T2>
|
||||
struct extract_impl<T2, std::enable_if_t<std::is_signed<T2>::value>>
|
||||
{
|
||||
// Load signed value (sign-extended)
|
||||
static constexpr T2 extract(const T& data)
|
||||
{
|
||||
return data << (bf_t::bitmax - bitpos - N) >> (bf_t::bitmax - N);
|
||||
}
|
||||
};
|
||||
|
||||
// Bitfield extraction
|
||||
static constexpr vtype extract(const T& data)
|
||||
{
|
||||
return extract_impl<vtype>::extract(data);
|
||||
}
|
||||
|
||||
// Bitfield insertion
|
||||
static constexpr vtype insert(vtype value)
|
||||
{
|
||||
return (value & bf_t::vmask) << bitpos;
|
||||
}
|
||||
|
||||
// Load bitfield value
|
||||
constexpr operator vtype() const
|
||||
{
|
||||
return extract(this->m_data);
|
||||
}
|
||||
|
||||
// Load raw data with mask applied
|
||||
constexpr T unshifted() const
|
||||
{
|
||||
return this->m_data & data_mask();
|
||||
}
|
||||
|
||||
// Optimized bool conversion (must be removed if inappropriate)
|
||||
explicit constexpr operator bool() const
|
||||
{
|
||||
return unshifted() != 0;
|
||||
}
|
||||
|
||||
// Store bitfield value
|
||||
bf_t& operator =(vtype value)
|
||||
{
|
||||
this->m_data = (this->m_data & ~data_mask()) | insert(value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
vtype operator ++(int)
|
||||
{
|
||||
vtype result = *this;
|
||||
*this = result + 1;
|
||||
return result;
|
||||
}
|
||||
|
||||
bf_t& operator ++()
|
||||
{
|
||||
return *this = *this + 1;
|
||||
}
|
||||
|
||||
vtype operator --(int)
|
||||
{
|
||||
vtype result = *this;
|
||||
*this = result - 1;
|
||||
return result;
|
||||
}
|
||||
|
||||
bf_t& operator --()
|
||||
{
|
||||
return *this = *this - 1;
|
||||
}
|
||||
|
||||
bf_t& operator +=(vtype right)
|
||||
{
|
||||
return *this = *this + right;
|
||||
}
|
||||
|
||||
bf_t& operator -=(vtype right)
|
||||
{
|
||||
return *this = *this - right;
|
||||
}
|
||||
|
||||
bf_t& operator *=(vtype right)
|
||||
{
|
||||
return *this = *this * right;
|
||||
}
|
||||
|
||||
bf_t& operator &=(vtype right)
|
||||
{
|
||||
this->m_data &= (right & bf_t::vmask) << bitpos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bf_t& operator |=(vtype right)
|
||||
{
|
||||
this->m_data |= (right & bf_t::vmask) << bitpos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bf_t& operator ^=(vtype right)
|
||||
{
|
||||
this->m_data ^= (right & bf_t::vmask) << bitpos;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
// Field pack (concatenated from left to right)
|
||||
template<typename F = void, typename... Fields>
|
||||
struct cf_t : bf_base<typename F::type, F::bitsize + cf_t<Fields...>::bitsize>
|
||||
{
|
||||
using type = typename cf_t::type;
|
||||
using vtype = typename cf_t::vtype;
|
||||
|
||||
// Get disjunction of all "data" masks of concatenated values
|
||||
static constexpr vtype data_mask()
|
||||
{
|
||||
return F::data_mask() | cf_t<Fields...>::data_mask();
|
||||
}
|
||||
|
||||
// Extract all bitfields and concatenate
|
||||
static constexpr vtype extract(const type& data)
|
||||
{
|
||||
return F::extract(data) << cf_t<Fields...>::bitsize | cf_t<Fields...>::extract(data);
|
||||
}
|
||||
|
||||
// Split bitfields and insert them
|
||||
static constexpr vtype insert(vtype value)
|
||||
{
|
||||
return F::insert(value >> cf_t<Fields...>::bitsize) | cf_t<Fields...>::insert(value);
|
||||
}
|
||||
|
||||
// Load value
|
||||
constexpr operator vtype() const
|
||||
{
|
||||
return extract(this->m_data);
|
||||
}
|
||||
|
||||
// Store value
|
||||
cf_t& operator =(vtype value)
|
||||
{
|
||||
this->m_data = (this->m_data & ~data_mask()) | insert(value);
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
// Empty field pack (recursion terminator)
|
||||
template<>
|
||||
struct cf_t<void>
|
||||
{
|
||||
static constexpr uint bitsize = 0;
|
||||
|
||||
static constexpr uint data_mask()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static constexpr auto extract(const T& data) -> decltype(+T())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static constexpr T insert(T value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
// Fixed field (provides constant values in field pack)
|
||||
template<typename T, T V, uint N>
|
||||
struct ff_t : bf_base<T, N>
|
||||
{
|
||||
using type = typename ff_t::type;
|
||||
using vtype = typename ff_t::vtype;
|
||||
|
||||
// Return constant value
|
||||
static constexpr vtype extract(const type& data)
|
||||
{
|
||||
static_assert((V & ff_t::vmask) == V, "ff_t<> error: V out of bounds");
|
||||
return V;
|
||||
}
|
||||
|
||||
// Get value
|
||||
operator vtype() const
|
||||
{
|
||||
return V;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,258 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
|
||||
// Small bitset for enum class types with available values [0, BitSize).
|
||||
// T must be either enum type or convertible to (registered with via simple_t<T>).
|
||||
// Internal representation is single value of type T.
|
||||
template<typename T, std::size_t BitSize = sizeof(T) * CHAR_BIT>
|
||||
struct bitset_t
|
||||
{
|
||||
using type = simple_t<T>;
|
||||
using under = std::underlying_type_t<type>;
|
||||
enum class raw_type : under {};
|
||||
|
||||
static constexpr auto bitsize = BitSize;
|
||||
|
||||
bitset_t() = default;
|
||||
|
||||
constexpr bitset_t(type _enum_const)
|
||||
: m_value(static_cast<type>(shift(_enum_const)))
|
||||
{
|
||||
}
|
||||
|
||||
constexpr bitset_t(raw_type raw_value)
|
||||
: m_value(static_cast<T>(static_cast<under>(raw_value)))
|
||||
{
|
||||
}
|
||||
|
||||
// Get underlying value
|
||||
constexpr under _value() const
|
||||
{
|
||||
return static_cast<under>(m_value);
|
||||
}
|
||||
|
||||
explicit constexpr operator bool() const
|
||||
{
|
||||
return _value() ? true : false;
|
||||
}
|
||||
|
||||
bitset_t& operator +=(bitset_t rhs)
|
||||
{
|
||||
return *this = static_cast<raw_type>(_value() | rhs._value());
|
||||
}
|
||||
|
||||
bitset_t& operator -=(bitset_t rhs)
|
||||
{
|
||||
return *this = static_cast<raw_type>(_value() & ~rhs._value());
|
||||
}
|
||||
|
||||
bitset_t& operator &=(bitset_t rhs)
|
||||
{
|
||||
return *this = static_cast<raw_type>(_value() & rhs._value());
|
||||
}
|
||||
|
||||
bitset_t& operator ^=(bitset_t rhs)
|
||||
{
|
||||
return *this = static_cast<raw_type>(_value() ^ rhs._value());
|
||||
}
|
||||
|
||||
friend constexpr bitset_t operator +(bitset_t lhs, bitset_t rhs)
|
||||
{
|
||||
return static_cast<raw_type>(lhs._value() | rhs._value());
|
||||
}
|
||||
|
||||
friend constexpr bitset_t operator -(bitset_t lhs, bitset_t rhs)
|
||||
{
|
||||
return static_cast<raw_type>(lhs._value() & ~rhs._value());
|
||||
}
|
||||
|
||||
friend constexpr bitset_t operator &(bitset_t lhs, bitset_t rhs)
|
||||
{
|
||||
return static_cast<raw_type>(lhs._value() & rhs._value());
|
||||
}
|
||||
|
||||
friend constexpr bitset_t operator ^(bitset_t lhs, bitset_t rhs)
|
||||
{
|
||||
return static_cast<raw_type>(lhs._value() ^ rhs._value());
|
||||
}
|
||||
|
||||
bool test(bitset_t rhs) const
|
||||
{
|
||||
const under v = _value();
|
||||
const under s = rhs._value();
|
||||
return (v & s) != 0;
|
||||
}
|
||||
|
||||
bool test_and_set(bitset_t rhs)
|
||||
{
|
||||
const under v = _value();
|
||||
const under s = rhs._value();
|
||||
*this = static_cast<raw_type>(v | s);
|
||||
return (v & s) != 0;
|
||||
}
|
||||
|
||||
bool test_and_reset(bitset_t rhs)
|
||||
{
|
||||
const under v = _value();
|
||||
const under s = rhs._value();
|
||||
*this = static_cast<raw_type>(v & ~s);
|
||||
return (v & s) != 0;
|
||||
}
|
||||
|
||||
bool test_and_complement(bitset_t rhs)
|
||||
{
|
||||
const under v = _value();
|
||||
const under s = rhs._value();
|
||||
*this = static_cast<raw_type>(v ^ s);
|
||||
return (v & s) != 0;
|
||||
}
|
||||
|
||||
private:
|
||||
static constexpr under shift(const T& value)
|
||||
{
|
||||
return static_cast<under>(value) < BitSize ? static_cast<under>(1) << static_cast<under>(value) : throw value;
|
||||
}
|
||||
|
||||
T m_value;
|
||||
};
|
||||
|
||||
template<typename T, typename RT = T>
|
||||
constexpr RT make_bitset()
|
||||
{
|
||||
return RT{};
|
||||
}
|
||||
|
||||
// Fold enum constants into bitset_t<> (must be implemented with constexpr initializer_list constructor instead)
|
||||
template<typename T = void, typename Arg, typename... Args, typename RT = std::conditional_t<std::is_void<T>::value, bitset_t<Arg>, T>>
|
||||
constexpr RT make_bitset(Arg&& _enum_const, Args&&... args)
|
||||
{
|
||||
return RT{ std::forward<Arg>(_enum_const) } + make_bitset<RT>(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
template<typename T, typename CT>
|
||||
struct atomic_add<bitset_t<T>, CT, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
using raw_type = typename bitset_t<T>::raw_type;
|
||||
|
||||
static inline bitset_t<T> op1(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::fetch_or(reinterpret_cast<under&>(left), right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op1;
|
||||
|
||||
static inline bitset_t<T> op2(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::or_fetch(reinterpret_cast<under&>(left), right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto op_fetch = &op2;
|
||||
static constexpr auto atomic_op = &op2;
|
||||
};
|
||||
|
||||
template<typename T, typename CT>
|
||||
struct atomic_sub<bitset_t<T>, CT, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
using raw_type = typename bitset_t<T>::raw_type;
|
||||
|
||||
static inline bitset_t<T> op1(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::fetch_and(reinterpret_cast<under&>(left), ~right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op1;
|
||||
|
||||
static inline bitset_t<T> op2(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::and_fetch(reinterpret_cast<under&>(left), ~right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto op_fetch = &op2;
|
||||
static constexpr auto atomic_op = &op2;
|
||||
};
|
||||
|
||||
template<typename T, typename CT>
|
||||
struct atomic_and<bitset_t<T>, CT, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
using raw_type = typename bitset_t<T>::raw_type;
|
||||
|
||||
static inline bitset_t<T> op1(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::fetch_and(reinterpret_cast<under&>(left), right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op1;
|
||||
|
||||
static inline bitset_t<T> op2(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::and_fetch(reinterpret_cast<under&>(left), right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto op_fetch = &op2;
|
||||
static constexpr auto atomic_op = &op2;
|
||||
};
|
||||
|
||||
template<typename T, typename CT>
|
||||
struct atomic_xor<bitset_t<T>, CT, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
using raw_type = typename bitset_t<T>::raw_type;
|
||||
|
||||
static inline bitset_t<T> op1(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::fetch_xor(reinterpret_cast<under&>(left), right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto fetch_op = &op1;
|
||||
|
||||
static inline bitset_t<T> op2(bitset_t<T>& left, bitset_t<T> right)
|
||||
{
|
||||
return static_cast<raw_type>(atomic_storage<under>::xor_fetch(reinterpret_cast<under&>(left), right._value()));
|
||||
}
|
||||
|
||||
static constexpr auto op_fetch = &op2;
|
||||
static constexpr auto atomic_op = &op2;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_test_and_set<bitset_t<T>, T, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
|
||||
static inline bool _op(bitset_t<T>& left, const T& value)
|
||||
{
|
||||
return atomic_storage<under>::bts(reinterpret_cast<under&>(left), static_cast<uint>(value));
|
||||
}
|
||||
|
||||
static constexpr auto atomic_op = &_op;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_test_and_reset<bitset_t<T>, T, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
|
||||
static inline bool _op(bitset_t<T>& left, const T& value)
|
||||
{
|
||||
return atomic_storage<under>::btr(reinterpret_cast<under&>(left), static_cast<uint>(value));
|
||||
}
|
||||
|
||||
static constexpr auto atomic_op = &_op;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct atomic_test_and_complement<bitset_t<T>, T, std::enable_if_t<std::is_enum<T>::value>>
|
||||
{
|
||||
using under = typename bitset_t<T>::under;
|
||||
|
||||
static inline bool _op(bitset_t<T>& left, const T& value)
|
||||
{
|
||||
return atomic_storage<under>::btc(reinterpret_cast<under&>(left), static_cast<uint>(value));
|
||||
}
|
||||
|
||||
static constexpr auto atomic_op = &_op;
|
||||
};
|
||||
@@ -0,0 +1,203 @@
|
||||
#include "stdafx.h"
|
||||
#include "Config.h"
|
||||
|
||||
#include "yaml-cpp/yaml.h"
|
||||
|
||||
namespace cfg
|
||||
{
|
||||
logs::channel cfg("CFG", logs::level::notice);
|
||||
|
||||
entry_base::entry_base(type _type)
|
||||
: m_type(_type)
|
||||
{
|
||||
if (_type != type::node)
|
||||
{
|
||||
throw std::logic_error("Invalid root node");
|
||||
}
|
||||
}
|
||||
|
||||
entry_base::entry_base(type _type, node& owner, const std::string& name)
|
||||
: m_type(_type)
|
||||
{
|
||||
if (!owner.m_nodes.emplace(name, this).second)
|
||||
{
|
||||
throw std::logic_error("Node already exists");
|
||||
}
|
||||
}
|
||||
|
||||
entry_base& entry_base::operator[](const std::string& name) const
|
||||
{
|
||||
if (m_type == type::node)
|
||||
{
|
||||
return *static_cast<const node&>(*this).m_nodes.at(name);
|
||||
}
|
||||
|
||||
throw std::logic_error("Invalid node type");
|
||||
}
|
||||
|
||||
entry_base& entry_base::operator[](const char* name) const
|
||||
{
|
||||
if (m_type == type::node)
|
||||
{
|
||||
return *static_cast<const node&>(*this).m_nodes.at(name);
|
||||
}
|
||||
|
||||
throw std::logic_error("Invalid node type");
|
||||
}
|
||||
|
||||
// Emit YAML
|
||||
static void encode(YAML::Emitter& out, const class entry_base& rhs);
|
||||
|
||||
// Incrementally load config entries from YAML::Node.
|
||||
// The config value is preserved if the corresponding YAML node doesn't exist.
|
||||
static void decode(const YAML::Node& data, class entry_base& rhs);
|
||||
}
|
||||
|
||||
bool cfg::try_to_int64(s64* out, const std::string& value, s64 min, s64 max)
|
||||
{
|
||||
// TODO: this could be rewritten without exceptions (but it should be as safe as possible and provide logs)
|
||||
s64 result;
|
||||
std::size_t pos;
|
||||
|
||||
try
|
||||
{
|
||||
result = std::stoll(value, &pos, 0 /* Auto-detect numeric base */);
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
if (out) cfg.error("cfg::try_to_int('%s'): exception: %s", value, e.what());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pos != value.size())
|
||||
{
|
||||
if (out) cfg.error("cfg::try_to_int('%s'): unexpected characters (pos=%zu)", value, pos);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (result < min || result > max)
|
||||
{
|
||||
if (out) cfg.error("cfg::try_to_int('%s'): out of bounds (%lld..%lld)", value, min, max);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (out) *out = result;
|
||||
return true;
|
||||
}
|
||||
|
||||
void cfg::encode(YAML::Emitter& out, const cfg::entry_base& rhs)
|
||||
{
|
||||
switch (rhs.get_type())
|
||||
{
|
||||
case type::node:
|
||||
{
|
||||
out << YAML::BeginMap;
|
||||
for (const auto& np : static_cast<const node&>(rhs).get_nodes())
|
||||
{
|
||||
out << YAML::Key << np.first;
|
||||
out << YAML::Value; encode(out, *np.second);
|
||||
}
|
||||
|
||||
out << YAML::EndMap;
|
||||
return;
|
||||
}
|
||||
case type::set:
|
||||
{
|
||||
out << YAML::BeginSeq;
|
||||
for (const auto& str : static_cast<const set_entry&>(rhs).get_set())
|
||||
{
|
||||
out << str;
|
||||
}
|
||||
|
||||
out << YAML::EndSeq;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
out << rhs.to_string();
|
||||
}
|
||||
|
||||
void cfg::decode(const YAML::Node& data, cfg::entry_base& rhs)
|
||||
{
|
||||
switch (rhs.get_type())
|
||||
{
|
||||
case type::node:
|
||||
{
|
||||
if (data.IsScalar() || data.IsSequence())
|
||||
{
|
||||
return; // ???
|
||||
}
|
||||
|
||||
for (const auto& pair : data)
|
||||
{
|
||||
if (!pair.first.IsScalar()) continue;
|
||||
|
||||
// Find the key among existing nodes
|
||||
const auto name = pair.first.Scalar();
|
||||
const auto found = static_cast<node&>(rhs).get_nodes().find(name);
|
||||
|
||||
if (found != static_cast<node&>(rhs).get_nodes().cend())
|
||||
{
|
||||
decode(pair.second, *found->second);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ???
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case type::set:
|
||||
{
|
||||
std::vector<std::string> values;
|
||||
|
||||
if (YAML::convert<decltype(values)>::decode(data, values))
|
||||
{
|
||||
rhs.from_list(std::move(values));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
std::string value;
|
||||
|
||||
if (YAML::convert<std::string>::decode(data, value))
|
||||
{
|
||||
rhs.from_string(value);
|
||||
}
|
||||
|
||||
break; // ???
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string cfg::node::to_string() const
|
||||
{
|
||||
YAML::Emitter out;
|
||||
cfg::encode(out, *this);
|
||||
|
||||
return{ out.c_str(), out.size() };
|
||||
}
|
||||
|
||||
bool cfg::node::from_string(const std::string& value)
|
||||
{
|
||||
cfg::decode(YAML::Load(value), *this);
|
||||
return true;
|
||||
}
|
||||
|
||||
void cfg::node::from_default()
|
||||
{
|
||||
for (auto& node : m_nodes)
|
||||
{
|
||||
node.second->from_default();
|
||||
}
|
||||
}
|
||||
|
||||
cfg::root_node& cfg::get_root()
|
||||
{
|
||||
// Magic static
|
||||
static root_node root;
|
||||
return root;
|
||||
}
|
||||
@@ -0,0 +1,532 @@
|
||||
#pragma once
|
||||
|
||||
#include "Utilities/types.h"
|
||||
#include "Utilities/Atomic.h"
|
||||
|
||||
#include <initializer_list>
|
||||
#include <exception>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
|
||||
namespace cfg
|
||||
{
|
||||
// Convert string to signed integer
|
||||
bool try_to_int64(s64* out, const std::string& value, s64 min, s64 max);
|
||||
|
||||
// Config tree entry type.
|
||||
enum class type : uint
|
||||
{
|
||||
node = 0, // cfg::node type
|
||||
boolean, // cfg::bool_entry type
|
||||
fixed_map, // cfg::map_entry type
|
||||
enumeration, // cfg::enum_entry type
|
||||
integer, // cfg::int_entry type
|
||||
string, // cfg::string_entry type
|
||||
set, // cfg::set_entry type
|
||||
};
|
||||
|
||||
// Config tree entry abstract base class
|
||||
class entry_base
|
||||
{
|
||||
const type m_type;
|
||||
|
||||
protected:
|
||||
// Ownerless entry constructor
|
||||
entry_base(type _type);
|
||||
|
||||
// Owned entry constructor
|
||||
entry_base(type _type, class node& owner, const std::string& name);
|
||||
|
||||
public:
|
||||
// Disallow copy/move constructors and assignments
|
||||
entry_base(const entry_base&) = delete;
|
||||
|
||||
// Get type
|
||||
type get_type() const { return m_type; }
|
||||
|
||||
// Access child node (must exist)
|
||||
entry_base& operator [](const std::string& name) const; entry_base& operator [](const char* name) const;
|
||||
|
||||
// Reset defaults
|
||||
virtual void from_default() = 0;
|
||||
|
||||
// Convert to string (optional)
|
||||
virtual std::string to_string() const
|
||||
{
|
||||
return{};
|
||||
}
|
||||
|
||||
// Try to convert from string (optional)
|
||||
virtual bool from_string(const std::string&)
|
||||
{
|
||||
throw std::logic_error("from_string() not specified");
|
||||
}
|
||||
|
||||
// Get string list (optional)
|
||||
virtual std::vector<std::string> to_list() const
|
||||
{
|
||||
return{};
|
||||
}
|
||||
|
||||
// Set multiple values. Implementation-specific, optional.
|
||||
virtual bool from_list(std::vector<std::string>&&)
|
||||
{
|
||||
throw std::logic_error("from_list() not specified");
|
||||
}
|
||||
};
|
||||
|
||||
// Config tree node which contains another nodes
|
||||
class node : public entry_base
|
||||
{
|
||||
std::map<std::string, entry_base*> m_nodes;
|
||||
|
||||
friend class entry_base;
|
||||
|
||||
public:
|
||||
// Root node constructor
|
||||
node()
|
||||
: entry_base(type::node)
|
||||
{
|
||||
}
|
||||
|
||||
// Registered node constructor
|
||||
node(node& owner, const std::string& name)
|
||||
: entry_base(type::node, owner, name)
|
||||
{
|
||||
}
|
||||
|
||||
// Get child nodes
|
||||
const std::map<std::string, entry_base*>& get_nodes() const
|
||||
{
|
||||
return m_nodes;
|
||||
}
|
||||
|
||||
// Serialize node
|
||||
std::string to_string() const override;
|
||||
|
||||
// Deserialize node
|
||||
bool from_string(const std::string& value) override;
|
||||
|
||||
// Set default values
|
||||
void from_default() override;
|
||||
};
|
||||
|
||||
struct bool_entry final : public entry_base
|
||||
{
|
||||
atomic_t<bool> value;
|
||||
|
||||
const bool def;
|
||||
|
||||
bool_entry(node& owner, const std::string& name, bool def = false)
|
||||
: entry_base(type::boolean, owner, name)
|
||||
, value(def)
|
||||
, def(def)
|
||||
{
|
||||
}
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return value.load();
|
||||
}
|
||||
|
||||
bool_entry& operator =(bool value)
|
||||
{
|
||||
value = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void from_default() override
|
||||
{
|
||||
value = def;
|
||||
}
|
||||
|
||||
std::string to_string() const override
|
||||
{
|
||||
return value.load() ? "true" : "false";
|
||||
}
|
||||
|
||||
bool from_string(const std::string& value) override
|
||||
{
|
||||
if (value == "false")
|
||||
this->value = false;
|
||||
else if (value == "true")
|
||||
this->value = true;
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// Value node with fixed set of possible values, each maps to a value of type T.
|
||||
template<typename T>
|
||||
struct map_entry final : public entry_base
|
||||
{
|
||||
using init_type = std::initializer_list<std::pair<std::string, T>>;
|
||||
using map_type = std::unordered_map<std::string, T>;
|
||||
using list_type = std::vector<std::string>;
|
||||
using value_type = typename map_type::value_type;
|
||||
|
||||
static map_type make_map(init_type init)
|
||||
{
|
||||
map_type map(init.size());
|
||||
|
||||
for (const auto& v : init)
|
||||
{
|
||||
// Ensure elements are unique
|
||||
VERIFY(map.emplace(v.first, v.second).second);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
static list_type make_list(init_type init)
|
||||
{
|
||||
list_type list; list.reserve(init.size());
|
||||
|
||||
for (const auto& v : init)
|
||||
{
|
||||
list.emplace_back(v.first);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public:
|
||||
const map_type map;
|
||||
const list_type list; // Element list sorted in original order
|
||||
const value_type& def; // Pointer to the default value
|
||||
|
||||
private:
|
||||
atomic_t<const value_type*> m_value;
|
||||
|
||||
public:
|
||||
map_entry(node& owner, const std::string& name, const std::string& def, init_type init)
|
||||
: entry_base(type::fixed_map, owner, name)
|
||||
, map(make_map(init))
|
||||
, list(make_list(init))
|
||||
, def(*map.find(def))
|
||||
, m_value(&this->def)
|
||||
{
|
||||
}
|
||||
|
||||
map_entry(node& owner, const std::string& name, std::size_t def_index, init_type init)
|
||||
: map_entry(owner, name, def_index < init.size() ? (init.begin() + def_index)->first : throw std::logic_error("Invalid default value index"), init)
|
||||
{
|
||||
}
|
||||
|
||||
map_entry(node& owner, const std::string& name, init_type init)
|
||||
: map_entry(owner, name, 0, init)
|
||||
{
|
||||
}
|
||||
|
||||
const T& get() const
|
||||
{
|
||||
return m_value.load()->second;
|
||||
}
|
||||
|
||||
void from_default() override
|
||||
{
|
||||
m_value = &def;
|
||||
}
|
||||
|
||||
std::string to_string() const override
|
||||
{
|
||||
return m_value.load()->first;
|
||||
}
|
||||
|
||||
bool from_string(const std::string& value) override
|
||||
{
|
||||
const auto found = map.find(value);
|
||||
|
||||
if (found == map.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_value = &*found;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string> to_list() const override
|
||||
{
|
||||
return list;
|
||||
}
|
||||
};
|
||||
|
||||
// Value node with fixed set of possible values, each maps to an enum value of type T.
|
||||
template<typename T, bool External = false>
|
||||
class enum_entry final : public entry_base
|
||||
{
|
||||
// Value or reference
|
||||
std::conditional_t<External, atomic_t<T>&, atomic_t<T>> m_value;
|
||||
|
||||
public:
|
||||
const T def;
|
||||
|
||||
enum_entry(node& owner, const std::string& name, std::conditional_t<External, atomic_t<T>&, T> value)
|
||||
: entry_base(type::enumeration, owner, name)
|
||||
, m_value(value)
|
||||
, def(value)
|
||||
{
|
||||
}
|
||||
|
||||
operator T() const
|
||||
{
|
||||
return m_value.load();
|
||||
}
|
||||
|
||||
enum_entry& operator =(T value)
|
||||
{
|
||||
m_value = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void from_default() override
|
||||
{
|
||||
m_value = def;
|
||||
}
|
||||
|
||||
std::string to_string() const override
|
||||
{
|
||||
for (std::size_t i = 0; i < sizeof(bijective<T, const char*>::map) / sizeof(bijective_pair<T, const char*>); i++)
|
||||
{
|
||||
if (bijective<T, const char*>::map[i].v1 == m_value)
|
||||
{
|
||||
return bijective<T, const char*>::map[i].v2;
|
||||
}
|
||||
}
|
||||
|
||||
return{}; // TODO: ???
|
||||
}
|
||||
|
||||
bool from_string(const std::string& value) override
|
||||
{
|
||||
for (std::size_t i = 0; i < sizeof(bijective<T, const char*>::map) / sizeof(bijective_pair<T, const char*>); i++)
|
||||
{
|
||||
if (bijective<T, const char*>::map[i].v2 == value)
|
||||
{
|
||||
m_value = bijective<T, const char*>::map[i].v1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<std::string> to_list() const override
|
||||
{
|
||||
std::vector<std::string> result;
|
||||
|
||||
for (std::size_t i = 0; i < sizeof(bijective<T, const char*>::map) / sizeof(bijective_pair<T, const char*>); i++)
|
||||
{
|
||||
result.emplace_back(bijective<T, const char*>::map[i].v2);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
// Signed 32/64-bit integer entry with custom Min/Max range.
|
||||
template<s64 Min, s64 Max>
|
||||
class int_entry final : public entry_base
|
||||
{
|
||||
static_assert(Min < Max, "Invalid cfg::int_entry range");
|
||||
|
||||
// Prefer 32 bit type if possible
|
||||
using int_type = std::conditional_t<Min >= INT32_MIN && Max <= INT32_MAX, s32, s64>;
|
||||
|
||||
atomic_t<int_type> m_value;
|
||||
|
||||
public:
|
||||
const int_type def;
|
||||
|
||||
int_entry(node& owner, const std::string& name, int_type def = std::min<int_type>(Max, std::max<int_type>(Min, 0)))
|
||||
: entry_base(type::integer, owner, name)
|
||||
, m_value(def)
|
||||
, def(def)
|
||||
{
|
||||
}
|
||||
|
||||
operator int_type() const
|
||||
{
|
||||
return m_value.load();
|
||||
}
|
||||
|
||||
int_entry& operator =(int_type value)
|
||||
{
|
||||
if (value < Min || value > Max)
|
||||
{
|
||||
throw fmt::exception("Value out of the valid range: %lld" HERE, s64{ value });
|
||||
}
|
||||
|
||||
m_value = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void from_default() override
|
||||
{
|
||||
m_value = def;
|
||||
}
|
||||
|
||||
std::string to_string() const override
|
||||
{
|
||||
return std::to_string(m_value.load());
|
||||
}
|
||||
|
||||
bool from_string(const std::string& value) override
|
||||
{
|
||||
s64 result;
|
||||
if (try_to_int64(&result, value, Min, Max))
|
||||
{
|
||||
m_value = static_cast<int_type>(result);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// Alias for 32 bit int
|
||||
using int32_entry = int_entry<INT32_MIN, INT32_MAX>;
|
||||
|
||||
// Alias for 64 bit int
|
||||
using int64_entry = int_entry<INT64_MIN, INT64_MAX>;
|
||||
|
||||
// Simple string entry with mutex
|
||||
class string_entry final : public entry_base
|
||||
{
|
||||
mutable std::mutex m_mutex;
|
||||
std::string m_value;
|
||||
|
||||
public:
|
||||
const std::string def;
|
||||
|
||||
string_entry(node& owner, const std::string& name, const std::string& def = {})
|
||||
: entry_base(type::string, owner, name)
|
||||
, m_value(def)
|
||||
, def(def)
|
||||
{
|
||||
}
|
||||
|
||||
operator std::string() const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
return m_value;
|
||||
}
|
||||
|
||||
std::string get() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
string_entry& operator =(const std::string& value)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_value = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::size_t size() const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
return m_value.size();
|
||||
}
|
||||
|
||||
void from_default() override
|
||||
{
|
||||
*this = def;
|
||||
}
|
||||
|
||||
std::string to_string() const override
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
return m_value;
|
||||
}
|
||||
|
||||
bool from_string(const std::string& value) override
|
||||
{
|
||||
*this = value;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// Simple set entry with mutex (TODO: template for various types)
|
||||
class set_entry final : public entry_base
|
||||
{
|
||||
mutable std::mutex m_mutex;
|
||||
|
||||
std::set<std::string> m_set;
|
||||
|
||||
public:
|
||||
// Default value is empty list in current implementation
|
||||
set_entry(node& owner, const std::string& name)
|
||||
: entry_base(type::set, owner, name)
|
||||
{
|
||||
}
|
||||
|
||||
std::set<std::string> get_set() const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
||||
return m_set;
|
||||
}
|
||||
|
||||
void set_set(std::set<std::string>&& set)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_set = std::move(set);
|
||||
}
|
||||
|
||||
void from_default() override
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_set = {};
|
||||
}
|
||||
|
||||
std::vector<std::string> to_list() const override
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
||||
return{ m_set.begin(), m_set.end() };
|
||||
}
|
||||
|
||||
bool from_list(std::vector<std::string>&& list) override
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_set = { std::make_move_iterator(list.begin()), std::make_move_iterator(list.end()) };
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// Root type with some predefined nodes. Don't change it, this is not mandatory for adding nodes.
|
||||
struct root_node : node
|
||||
{
|
||||
node core { *this, "Core" };
|
||||
node vfs { *this, "VFS" };
|
||||
node log { *this, "Log" };
|
||||
node video { *this, "Video" };
|
||||
node audio { *this, "Audio" };
|
||||
node io { *this, "Input/Output" };
|
||||
node sys { *this, "System" };
|
||||
node net { *this, "Net" };
|
||||
node misc { *this, "Miscellaneous" };
|
||||
};
|
||||
|
||||
// Get global configuration root instance
|
||||
extern root_node& get_root();
|
||||
|
||||
// Global configuration root instance (cached reference)
|
||||
static root_node& root = get_root();
|
||||
}
|
||||
|
||||
// Registered log channel
|
||||
#define LOG_CHANNEL(name) extern logs::channel name; namespace logs { static cfg::enum_entry<logs::level, true> name(cfg::root.log, #name, ::name.enabled); }
|
||||
+1259
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,459 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <type_traits>
|
||||
|
||||
#include "types.h"
|
||||
#include "BitSet.h"
|
||||
|
||||
namespace fs
|
||||
{
|
||||
// File open mode flags
|
||||
enum struct open_mode : u32
|
||||
{
|
||||
read,
|
||||
write,
|
||||
append,
|
||||
create,
|
||||
trunc,
|
||||
excl,
|
||||
};
|
||||
|
||||
constexpr bitset_t<open_mode> read = open_mode::read; // Enable reading
|
||||
constexpr bitset_t<open_mode> write = open_mode::write; // Enable writing
|
||||
constexpr bitset_t<open_mode> append = open_mode::append; // Always append to the end of the file
|
||||
constexpr bitset_t<open_mode> create = open_mode::create; // Create file if it doesn't exist
|
||||
constexpr bitset_t<open_mode> trunc = open_mode::trunc; // Clear opened file if it's not empty
|
||||
constexpr bitset_t<open_mode> excl = open_mode::excl; // Failure if the file already exists (used with `create`)
|
||||
|
||||
constexpr bitset_t<open_mode> rewrite = write + create + trunc;
|
||||
|
||||
// File seek mode
|
||||
enum class seek_mode : u32
|
||||
{
|
||||
seek_set,
|
||||
seek_cur,
|
||||
seek_end,
|
||||
};
|
||||
|
||||
constexpr auto seek_set = seek_mode::seek_set; // From beginning
|
||||
constexpr auto seek_cur = seek_mode::seek_cur; // From current position
|
||||
constexpr auto seek_end = seek_mode::seek_end; // From end
|
||||
|
||||
// File attributes (TODO)
|
||||
struct stat_t
|
||||
{
|
||||
bool is_directory;
|
||||
bool is_writable;
|
||||
u64 size;
|
||||
s64 atime;
|
||||
s64 mtime;
|
||||
s64 ctime;
|
||||
};
|
||||
|
||||
// File handle base
|
||||
struct file_base
|
||||
{
|
||||
virtual ~file_base() = default;
|
||||
|
||||
virtual stat_t stat() = 0;
|
||||
virtual bool trunc(u64 length) = 0;
|
||||
virtual u64 read(void* buffer, u64 size) = 0;
|
||||
virtual u64 write(const void* buffer, u64 size) = 0;
|
||||
virtual u64 seek(s64 offset, seek_mode whence) = 0;
|
||||
virtual u64 size() = 0;
|
||||
};
|
||||
|
||||
// Directory entry (TODO)
|
||||
struct dir_entry : stat_t
|
||||
{
|
||||
std::string name;
|
||||
};
|
||||
|
||||
// Directory handle base
|
||||
struct dir_base
|
||||
{
|
||||
virtual ~dir_base() = default;
|
||||
|
||||
virtual bool read(dir_entry&) = 0;
|
||||
virtual void rewind() = 0;
|
||||
};
|
||||
|
||||
// Virtual device
|
||||
struct device_base
|
||||
{
|
||||
virtual ~device_base() = default;
|
||||
|
||||
virtual bool stat(const std::string& path, stat_t& info) = 0;
|
||||
virtual bool remove_dir(const std::string& path) = 0;
|
||||
virtual bool create_dir(const std::string& path) = 0;
|
||||
virtual bool rename(const std::string& from, const std::string& to) = 0;
|
||||
virtual bool remove(const std::string& path) = 0;
|
||||
virtual bool trunc(const std::string& path, u64 length) = 0;
|
||||
|
||||
virtual std::unique_ptr<file_base> open(const std::string& path, bitset_t<open_mode> mode) = 0;
|
||||
virtual std::unique_ptr<dir_base> open_dir(const std::string& path) = 0;
|
||||
};
|
||||
|
||||
// Get virtual device for specified path (nullptr for real path)
|
||||
std::shared_ptr<device_base> get_virtual_device(const std::string& path);
|
||||
|
||||
// Set virtual device with specified name (nullptr for deletion)
|
||||
std::shared_ptr<device_base> set_virtual_device(const std::string& root_name, const std::shared_ptr<device_base>&);
|
||||
|
||||
// Try to get parent directory (returns empty string on failure)
|
||||
std::string get_parent_dir(const std::string& path);
|
||||
|
||||
// Get file information
|
||||
bool stat(const std::string& path, stat_t& info);
|
||||
|
||||
// Check whether a file or a directory exists (not recommended, use is_file() or is_dir() instead)
|
||||
bool exists(const std::string& path);
|
||||
|
||||
// Check whether the file exists and is NOT a directory
|
||||
bool is_file(const std::string& path);
|
||||
|
||||
// Check whether the directory exists and is NOT a file
|
||||
bool is_dir(const std::string& path);
|
||||
|
||||
// Delete empty directory
|
||||
bool remove_dir(const std::string& path);
|
||||
|
||||
// Create directory
|
||||
bool create_dir(const std::string& path);
|
||||
|
||||
// Create directories
|
||||
bool create_path(const std::string& path);
|
||||
|
||||
// Rename (move) file or directory
|
||||
bool rename(const std::string& from, const std::string& to);
|
||||
|
||||
// Copy file contents
|
||||
bool copy_file(const std::string& from, const std::string& to, bool overwrite);
|
||||
|
||||
// Delete file
|
||||
bool remove_file(const std::string& path);
|
||||
|
||||
// Change file size (possibly appending zeros)
|
||||
bool truncate_file(const std::string& path, u64 length);
|
||||
|
||||
class file final
|
||||
{
|
||||
std::unique_ptr<file_base> m_file;
|
||||
|
||||
[[noreturn]] void xnull() const;
|
||||
[[noreturn]] void xfail() const;
|
||||
|
||||
public:
|
||||
// Default constructor
|
||||
file() = default;
|
||||
|
||||
// Open file with specified mode
|
||||
explicit file(const std::string& path, bitset_t<open_mode> mode = ::fs::read)
|
||||
{
|
||||
open(path, mode);
|
||||
}
|
||||
|
||||
// Open file with specified mode
|
||||
bool open(const std::string& path, bitset_t<open_mode> mode = ::fs::read);
|
||||
|
||||
// Open memory for read
|
||||
explicit file(const void* ptr, std::size_t size);
|
||||
|
||||
// Check whether the handle is valid (opened file)
|
||||
explicit operator bool() const
|
||||
{
|
||||
return m_file.operator bool();
|
||||
}
|
||||
|
||||
// Close the file explicitly
|
||||
void close()
|
||||
{
|
||||
m_file.reset();
|
||||
}
|
||||
|
||||
void reset(std::unique_ptr<file_base>&& ptr)
|
||||
{
|
||||
m_file = std::move(ptr);
|
||||
}
|
||||
|
||||
std::unique_ptr<file_base> release()
|
||||
{
|
||||
return std::move(m_file);
|
||||
}
|
||||
|
||||
// Change file size (possibly appending zero bytes)
|
||||
bool trunc(u64 length) const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->trunc(length);
|
||||
}
|
||||
|
||||
// Get file information
|
||||
stat_t stat() const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->stat();
|
||||
}
|
||||
|
||||
// Read the data from the file and return the amount of data written in buffer
|
||||
u64 read(void* buffer, u64 count) const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->read(buffer, count);
|
||||
}
|
||||
|
||||
// Write the data to the file and return the amount of data actually written
|
||||
u64 write(const void* buffer, u64 count) const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->write(buffer, count);
|
||||
}
|
||||
|
||||
// Change current position, returns resulting position
|
||||
u64 seek(s64 offset, seek_mode whence = seek_set) const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->seek(offset, whence);
|
||||
}
|
||||
|
||||
// Get file size
|
||||
u64 size() const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->size();
|
||||
}
|
||||
|
||||
// Get current position
|
||||
u64 pos() const
|
||||
{
|
||||
if (!m_file) xnull();
|
||||
return m_file->seek(0, seek_cur);
|
||||
}
|
||||
|
||||
// Write std::string unconditionally
|
||||
const file& write(const std::string& str) const
|
||||
{
|
||||
if (write(str.data(), str.size()) != str.size()) xfail();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Write POD unconditionally
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, const file&> write(const T& data) const
|
||||
{
|
||||
if (write(std::addressof(data), sizeof(T)) != sizeof(T)) xfail();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Write POD std::vector unconditionally
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, const file&> write(const std::vector<T>& vec) const
|
||||
{
|
||||
if (write(vec.data(), vec.size() * sizeof(T)) != vec.size() * sizeof(T)) xfail();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Read std::string, size must be set by resize() method
|
||||
bool read(std::string& str) const
|
||||
{
|
||||
return read(&str[0], str.size()) == str.size();
|
||||
}
|
||||
|
||||
// Read std::string
|
||||
bool read(std::string& str, std::size_t size) const
|
||||
{
|
||||
str.resize(size);
|
||||
return read(&str[0], size) == size;
|
||||
}
|
||||
|
||||
// Read POD, sizeof(T) is used
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, bool> read(T& data) const
|
||||
{
|
||||
return read(&data, sizeof(T)) == sizeof(T);
|
||||
}
|
||||
|
||||
// Read POD std::vector, size must be set by resize() method
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, bool> read(std::vector<T>& vec) const
|
||||
{
|
||||
return read(vec.data(), sizeof(T) * vec.size()) == sizeof(T) * vec.size();
|
||||
}
|
||||
|
||||
// Read POD std::vector
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, bool> read(std::vector<T>& vec, std::size_t size) const
|
||||
{
|
||||
vec.resize(size);
|
||||
return read(vec.data(), sizeof(T) * size) == sizeof(T) * size;
|
||||
}
|
||||
|
||||
// Read POD (experimental)
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, T> read() const
|
||||
{
|
||||
T result;
|
||||
if (!read(result)) xfail();
|
||||
return result;
|
||||
}
|
||||
|
||||
// Read full file to std::string
|
||||
std::string to_string() const
|
||||
{
|
||||
std::string result;
|
||||
result.resize(size());
|
||||
if (seek(0), !read(result)) xfail();
|
||||
return result;
|
||||
}
|
||||
|
||||
// Read full file to std::vector
|
||||
template<typename T>
|
||||
std::enable_if_t<std::is_pod<T>::value && !std::is_pointer<T>::value, std::vector<T>> to_vector() const
|
||||
{
|
||||
std::vector<T> result;
|
||||
result.resize(size() / sizeof(T));
|
||||
if (seek(0), !read(result)) xfail();
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
class dir final
|
||||
{
|
||||
std::unique_ptr<dir_base> m_dir;
|
||||
|
||||
[[noreturn]] void xnull() const;
|
||||
|
||||
public:
|
||||
dir() = default;
|
||||
|
||||
// Open dir handle
|
||||
explicit dir(const std::string& path)
|
||||
{
|
||||
open(path);
|
||||
}
|
||||
|
||||
// Open specified directory
|
||||
bool open(const std::string& path);
|
||||
|
||||
// Check whether the handle is valid (opened directory)
|
||||
explicit operator bool() const
|
||||
{
|
||||
return m_dir.operator bool();
|
||||
}
|
||||
|
||||
// Close the directory explicitly
|
||||
void close()
|
||||
{
|
||||
m_dir.reset();
|
||||
}
|
||||
|
||||
void reset(std::unique_ptr<dir_base>&& ptr)
|
||||
{
|
||||
m_dir = std::move(ptr);
|
||||
}
|
||||
|
||||
std::unique_ptr<dir_base> release()
|
||||
{
|
||||
return std::move(m_dir);
|
||||
}
|
||||
|
||||
// Get next directory entry
|
||||
bool read(dir_entry& out) const
|
||||
{
|
||||
if (!m_dir) xnull();
|
||||
return m_dir->read(out);
|
||||
}
|
||||
|
||||
// Reset to the beginning
|
||||
void rewind() const
|
||||
{
|
||||
if (!m_dir) xnull();
|
||||
return m_dir->rewind();
|
||||
}
|
||||
|
||||
class iterator
|
||||
{
|
||||
dir* m_parent;
|
||||
dir_entry m_entry;
|
||||
|
||||
public:
|
||||
enum class mode
|
||||
{
|
||||
from_first,
|
||||
from_current
|
||||
};
|
||||
|
||||
iterator(dir* parent, mode mode_ = mode::from_first)
|
||||
: m_parent(parent)
|
||||
{
|
||||
if (!m_parent)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mode_ == mode::from_first)
|
||||
{
|
||||
m_parent->rewind();
|
||||
}
|
||||
|
||||
if (!m_parent->read(m_entry))
|
||||
{
|
||||
m_parent = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
dir_entry& operator *()
|
||||
{
|
||||
return m_entry;
|
||||
}
|
||||
|
||||
iterator& operator++()
|
||||
{
|
||||
*this = { m_parent, mode::from_current };
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool operator !=(const iterator& rhs) const
|
||||
{
|
||||
return m_parent != rhs.m_parent;
|
||||
}
|
||||
};
|
||||
|
||||
iterator begin()
|
||||
{
|
||||
return{ m_dir ? this : nullptr };
|
||||
}
|
||||
|
||||
iterator end()
|
||||
{
|
||||
return{ nullptr };
|
||||
}
|
||||
};
|
||||
|
||||
// Get configuration directory
|
||||
const std::string& get_config_dir();
|
||||
|
||||
// Get executable directory
|
||||
const std::string& get_executable_dir();
|
||||
|
||||
// Delete directory and all its contents recursively
|
||||
void remove_all(const std::string& path, bool remove_root = true);
|
||||
|
||||
// Get size of all files recursively
|
||||
u64 get_dir_size(const std::string& path);
|
||||
|
||||
enum class error : uint
|
||||
{
|
||||
ok = 0,
|
||||
|
||||
inval,
|
||||
noent,
|
||||
exist,
|
||||
};
|
||||
|
||||
// Error code returned
|
||||
extern thread_local error g_tls_error;
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include "GNU.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
void * _aligned_malloc(size_t size, size_t alignment) {
|
||||
void *buffer;
|
||||
posix_memalign(&buffer, alignment, size);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int clock_gettime(int foo, struct timespec *ts) {
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
ts->tv_sec = tv.tv_sec;
|
||||
ts->tv_nsec = tv.tv_usec * 1000;
|
||||
return(0);
|
||||
}
|
||||
#endif /* !__APPLE__ */
|
||||
@@ -1,72 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef _WIN32
|
||||
#define thread_local __declspec(thread)
|
||||
#elif __APPLE__
|
||||
#define thread_local __thread
|
||||
#endif
|
||||
|
||||
#if defined(__GNUG__)
|
||||
#include <cmath>
|
||||
#include <stdlib.h>
|
||||
#include <cstdint>
|
||||
|
||||
#ifndef __APPLE__
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
#define _fpclass(x) std::fpclassify(x)
|
||||
#define __forceinline __attribute__((always_inline))
|
||||
#define _byteswap_ushort(x) __builtin_bswap16(x)
|
||||
#define _byteswap_ulong(x) __builtin_bswap32(x)
|
||||
#define _byteswap_uint64(x) __builtin_bswap64(x)
|
||||
#define Sleep(x) usleep(x * 1000)
|
||||
#define mkdir(x) mkdir(x, 0777)
|
||||
#define INFINITE 0xFFFFFFFF
|
||||
#define _CRT_ALIGN(x) __attribute__((aligned(x)))
|
||||
#define InterlockedCompareExchange(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val)
|
||||
#define InterlockedCompareExchange64(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val)
|
||||
|
||||
inline int64_t InterlockedOr64(volatile int64_t *dest, int64_t val)
|
||||
{
|
||||
int64_t olderval;
|
||||
int64_t oldval = *dest;
|
||||
do
|
||||
{
|
||||
olderval = oldval;
|
||||
oldval = InterlockedCompareExchange64(dest, olderval | val, olderval);
|
||||
} while (olderval != oldval);
|
||||
return oldval;
|
||||
}
|
||||
|
||||
inline uint64_t __umulh(uint64_t a, uint64_t b)
|
||||
{
|
||||
uint64_t result;
|
||||
__asm__("mulq %[b]" : "=d" (result) : [a] "a" (a), [b] "rm" (b));
|
||||
return result;
|
||||
}
|
||||
|
||||
inline int64_t __mulh(int64_t a, int64_t b)
|
||||
{
|
||||
int64_t result;
|
||||
__asm__("imulq %[b]" : "=d" (result) : [a] "a" (a), [b] "rm" (b));
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifndef __APPLE__
|
||||
#define _aligned_malloc(size,alignment) memalign(alignment,size)
|
||||
#else
|
||||
void * _aligned_malloc(size_t size, size_t alignment);
|
||||
int clock_gettime(int foo, struct timespec *ts);
|
||||
#define wxIsNaN(x) ((x) != (x))
|
||||
|
||||
#ifndef CLOCK_MONOTONIC
|
||||
#define CLOCK_MONOTONIC 0
|
||||
#endif /* !CLOCK_MONOTONIC */
|
||||
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
#define _aligned_free free
|
||||
|
||||
#define DWORD int32_t
|
||||
#endif
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#define GSL_THROW_ON_CONTRACT_VIOLATION
|
||||
|
||||
#pragma push_macro("new")
|
||||
#undef new
|
||||
#include <gsl.h>
|
||||
#pragma pop_macro("new")
|
||||
#undef Expects
|
||||
#undef Ensures
|
||||
@@ -1,179 +0,0 @@
|
||||
#pragma once
|
||||
#include <unordered_map>
|
||||
|
||||
#define rID_ANY -1 // was wxID_ANY
|
||||
|
||||
typedef u32 ID_TYPE;
|
||||
|
||||
class IDData
|
||||
{
|
||||
protected:
|
||||
void* m_ptr;
|
||||
std::function<void(void*)> m_destr;
|
||||
|
||||
public:
|
||||
IDData(void* ptr, std::function<void(void*)> destr)
|
||||
: m_ptr(ptr)
|
||||
, m_destr(destr)
|
||||
{
|
||||
}
|
||||
|
||||
~IDData()
|
||||
{
|
||||
m_destr(m_ptr);
|
||||
}
|
||||
|
||||
template<typename T> T* get()
|
||||
{
|
||||
return (T*)m_ptr;
|
||||
}
|
||||
|
||||
template<typename T> const T* get() const
|
||||
{
|
||||
return (const T*)m_ptr;
|
||||
}
|
||||
};
|
||||
|
||||
struct ID
|
||||
{
|
||||
std::string m_name;
|
||||
u32 m_attr;
|
||||
IDData* m_data;
|
||||
|
||||
template<typename T>
|
||||
ID(const std::string& name, T* data, const u32 attr)
|
||||
: m_name(name)
|
||||
, m_attr(attr)
|
||||
{
|
||||
m_data = new IDData(data, [](void *ptr) -> void { delete (T*)ptr; });
|
||||
}
|
||||
|
||||
ID() : m_data(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
ID(ID&& other)
|
||||
{
|
||||
m_name = other.m_name;
|
||||
m_attr = other.m_attr;
|
||||
m_data = other.m_data;
|
||||
other.m_data = nullptr;
|
||||
}
|
||||
ID& operator=(ID&& other)
|
||||
{
|
||||
std::swap(m_name,other.m_name);
|
||||
std::swap(m_attr,other.m_attr);
|
||||
std::swap(m_data,other.m_data);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void Kill()
|
||||
{
|
||||
delete m_data;
|
||||
}
|
||||
};
|
||||
|
||||
class IdManager
|
||||
{
|
||||
static const ID_TYPE s_first_id = 1;
|
||||
static const ID_TYPE s_max_id = -1;
|
||||
|
||||
std::unordered_map<ID_TYPE, ID> m_id_map;
|
||||
std::mutex m_mtx_main;
|
||||
|
||||
ID_TYPE m_cur_id;
|
||||
|
||||
public:
|
||||
IdManager() : m_cur_id(s_first_id)
|
||||
{
|
||||
}
|
||||
|
||||
~IdManager()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
bool CheckID(const ID_TYPE id)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
return m_id_map.find(id) != m_id_map.end();
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
for(auto& i : m_id_map)
|
||||
{
|
||||
i.second.Kill();
|
||||
}
|
||||
|
||||
m_id_map.clear();
|
||||
m_cur_id = s_first_id;
|
||||
}
|
||||
|
||||
template<typename T
|
||||
#ifdef __GNUG__
|
||||
= char
|
||||
#endif
|
||||
>
|
||||
ID_TYPE GetNewID(const std::string& name = "", T* data = nullptr, const u32 attr = 0)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
m_id_map[m_cur_id] = ID(name, data, attr);
|
||||
|
||||
return m_cur_id++;
|
||||
}
|
||||
|
||||
ID& GetID(const ID_TYPE id)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
return m_id_map[id];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool GetIDData(const ID_TYPE id, T*& result)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
auto f = m_id_map.find(id);
|
||||
|
||||
if(f == m_id_map.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
result = f->second.m_data->get<T>();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HasID(const s64 id)
|
||||
{
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
if(id == rID_ANY)
|
||||
return m_id_map.begin() != m_id_map.end();
|
||||
}
|
||||
|
||||
return CheckID(id);
|
||||
}
|
||||
|
||||
bool RemoveID(const ID_TYPE id)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
|
||||
auto item = m_id_map.find(id);
|
||||
|
||||
if(item == m_id_map.end()) return false;
|
||||
|
||||
item->second.Kill();
|
||||
m_id_map.erase(item);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
+24
-34
@@ -1,42 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
template<typename T>
|
||||
struct BaseInterval
|
||||
template<typename T1, typename T2> struct range_t
|
||||
{
|
||||
static const uint64_t zero = 0ull;
|
||||
static const uint64_t notz = 0xffffffffffffffffull;
|
||||
T1 _min; // first value
|
||||
T2 _max; // second value
|
||||
};
|
||||
|
||||
T m_min, m_max;
|
||||
template<typename T1, typename T2> constexpr range_t<std::decay_t<T1>, std::decay_t<T2>> make_range(T1&& _min, T2&& _max)
|
||||
{
|
||||
return{ std::forward<T1>(_min), std::forward<T2>(_max) };
|
||||
}
|
||||
|
||||
static BaseInterval<T> make(T min_value, T max_value)
|
||||
{
|
||||
BaseInterval<T> res = { min_value, max_value };
|
||||
return res;
|
||||
}
|
||||
template<typename T1, typename T2, typename T> constexpr bool operator <(const range_t<T1, T2>& range, const T& value)
|
||||
{
|
||||
return range._min < value && range._max < value;
|
||||
}
|
||||
|
||||
static BaseInterval<T> make()
|
||||
{
|
||||
return make((T&)zero, (T&)notz);
|
||||
}
|
||||
template<typename T1, typename T2, typename T> constexpr bool operator <(const T& value, const range_t<T1, T2>& range)
|
||||
{
|
||||
return value < range._min && value < range._max;
|
||||
}
|
||||
|
||||
bool getconst(T& result)
|
||||
{
|
||||
if (m_min == m_max)
|
||||
{
|
||||
result = m_min;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
template<typename T1, typename T2, typename T> constexpr bool operator ==(const range_t<T1, T2>& range, const T& value)
|
||||
{
|
||||
return !(value < range._min) && !(range._max < value);
|
||||
}
|
||||
|
||||
bool isindef()
|
||||
{
|
||||
if (T == float)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
template<typename T1, typename T2, typename T> constexpr bool operator ==(const T& value, const range_t<T1, T2>& range)
|
||||
{
|
||||
return !(value < range._min) && !(range._max < value);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,327 @@
|
||||
#ifdef LLVM_AVAILABLE
|
||||
|
||||
#include <unordered_map>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <set>
|
||||
#include <array>
|
||||
|
||||
#include "types.h"
|
||||
#include "Macro.h"
|
||||
#include "StrFmt.h"
|
||||
#include "File.h"
|
||||
#include "Log.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 0)
|
||||
#endif
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
||||
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
|
||||
#include "llvm/ExecutionEngine/JITEventListener.h"
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#else
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include "JIT.h"
|
||||
|
||||
// Global LLVM context (thread-unsafe)
|
||||
llvm::LLVMContext g_llvm_ctx;
|
||||
|
||||
// Size of virtual memory area reserved: 512 MB
|
||||
static const u64 s_memory_size = 0x20000000;
|
||||
|
||||
// Try to reserve a portion of virtual memory in the first 2 GB address space beforehand, if possible.
|
||||
static void* const s_memory = []() -> void*
|
||||
{
|
||||
#ifdef _WIN32
|
||||
for (u64 addr = 0x1000000; addr <= 0x60000000; addr += 0x1000000)
|
||||
{
|
||||
if (VirtualAlloc((void*)addr, s_memory_size, MEM_RESERVE, PAGE_NOACCESS))
|
||||
{
|
||||
return (void*)addr;
|
||||
}
|
||||
}
|
||||
|
||||
return VirtualAlloc(NULL, s_memory_size, MEM_RESERVE, PAGE_NOACCESS);
|
||||
#else
|
||||
return ::mmap((void*)0x10000000, s_memory_size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||
#endif
|
||||
}();
|
||||
|
||||
// EH frames
|
||||
static u8* s_unwind_info;
|
||||
static u64 s_unwind_size;
|
||||
|
||||
#ifdef _WIN32
|
||||
static std::vector<RUNTIME_FUNCTION> s_unwind; // Custom .pdata section replacement
|
||||
#endif
|
||||
|
||||
// Helper class
|
||||
struct MemoryManager final : llvm::RTDyldMemoryManager
|
||||
{
|
||||
std::unordered_map<std::string, std::uintptr_t> table;
|
||||
|
||||
MemoryManager(std::unordered_map<std::string, std::uintptr_t>&& table)
|
||||
: table(std::move(table))
|
||||
{
|
||||
}
|
||||
|
||||
[[noreturn]] static void null()
|
||||
{
|
||||
throw std::runtime_error("Null function" HERE);
|
||||
}
|
||||
|
||||
virtual u64 getSymbolAddress(const std::string& name) override
|
||||
{
|
||||
if (u64 addr = RTDyldMemoryManager::getSymbolAddress(name))
|
||||
{
|
||||
// This may be bad if LLVM requests some built-in functions like fma.
|
||||
LOG_ERROR(GENERAL, "LLVM: Symbol requested %s -> 0x%016llx", name, addr);
|
||||
return addr;
|
||||
}
|
||||
|
||||
const auto found = table.find(name);
|
||||
|
||||
if (found != table.end())
|
||||
{
|
||||
return found->second;
|
||||
}
|
||||
|
||||
// It's fine if some function is never called, for example.
|
||||
LOG_ERROR(GENERAL, "LLVM: Linkage failed for %s", name);
|
||||
return (u64)null;
|
||||
}
|
||||
|
||||
virtual u8* allocateCodeSection(std::uintptr_t size, uint align, uint sec_id, llvm::StringRef sec_name) override
|
||||
{
|
||||
// Simple allocation
|
||||
const u64 next = ::align((u64)m_next + size, 4096);
|
||||
|
||||
if (next > (u64)s_memory + s_memory_size)
|
||||
{
|
||||
LOG_FATAL(GENERAL, "LLVM: Out of memory (size=0x%llx, aligned 0x%x)", size, align);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (!VirtualAlloc(m_next, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
|
||||
#else
|
||||
if (::mprotect(m_next, size, PROT_READ | PROT_WRITE | PROT_EXEC))
|
||||
#endif
|
||||
{
|
||||
LOG_FATAL(GENERAL, "LLVM: Failed to allocate memory at 0x%p", m_next);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LOG_SUCCESS(GENERAL, "LLVM: Code section %u '%s' allocated -> 0x%p (size=0x%llx, aligned 0x%x)", sec_id, sec_name.data(), m_next, size, align);
|
||||
return (u8*)std::exchange(m_next, (void*)next);
|
||||
}
|
||||
|
||||
virtual u8* allocateDataSection(std::uintptr_t size, uint align, uint sec_id, llvm::StringRef sec_name, bool is_ro) override
|
||||
{
|
||||
// Simple allocation
|
||||
const u64 next = ::align((u64)m_next + size, 4096);
|
||||
|
||||
if (next > (u64)s_memory + s_memory_size)
|
||||
{
|
||||
LOG_FATAL(GENERAL, "LLVM: Out of memory (size=0x%llx, aligned 0x%x)", size, align);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (!VirtualAlloc(m_next, size, MEM_COMMIT, PAGE_READWRITE))
|
||||
#else
|
||||
if (::mprotect(m_next, size, PROT_READ | PROT_WRITE))
|
||||
#endif
|
||||
{
|
||||
LOG_FATAL(GENERAL, "LLVM: Failed to allocate memory at 0x%p", m_next);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LOG_SUCCESS(GENERAL, "LLVM: Data section %u '%s' allocated -> 0x%p (size=0x%llx, aligned 0x%x, %s)", sec_id, sec_name.data(), m_next, size, align, is_ro ? "ro" : "rw");
|
||||
return (u8*)std::exchange(m_next, (void*)next);
|
||||
}
|
||||
|
||||
virtual bool finalizeMemory(std::string* = nullptr) override
|
||||
{
|
||||
// TODO: make sections read-only when necessary
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual void registerEHFrames(u8* addr, u64 load_addr, std::size_t size) override
|
||||
{
|
||||
s_unwind_info = addr;
|
||||
s_unwind_size = size;
|
||||
|
||||
return RTDyldMemoryManager::registerEHFrames(addr, load_addr, size);
|
||||
}
|
||||
|
||||
virtual void deregisterEHFrames(u8* addr, u64 load_addr, std::size_t size) override
|
||||
{
|
||||
LOG_ERROR(GENERAL, "deregisterEHFrames() called"); // Not expected
|
||||
|
||||
return RTDyldMemoryManager::deregisterEHFrames(addr, load_addr, size);
|
||||
}
|
||||
|
||||
~MemoryManager()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (!RtlDeleteFunctionTable(s_unwind.data()))
|
||||
{
|
||||
LOG_FATAL(GENERAL, "RtlDeleteFunctionTable(addr=0x%p) failed! Error %u", s_unwind_info, GetLastError());
|
||||
}
|
||||
|
||||
if (!VirtualFree(s_memory, 0, MEM_DECOMMIT))
|
||||
{
|
||||
LOG_FATAL(GENERAL, "VirtualFree(0x%p) failed! Error %u", s_memory, GetLastError());
|
||||
}
|
||||
#else
|
||||
if (::mprotect(s_memory, s_memory_size, PROT_NONE))
|
||||
{
|
||||
LOG_FATAL(GENERAL, "mprotect(0x%p) failed! Error %d", s_memory, errno);
|
||||
}
|
||||
|
||||
// TODO: unregister EH frames if necessary
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
void* m_next = s_memory;
|
||||
};
|
||||
|
||||
// Helper class
|
||||
struct EventListener final : llvm::JITEventListener
|
||||
{
|
||||
virtual void NotifyObjectEmitted(const llvm::object::ObjectFile& obj, const llvm::RuntimeDyld::LoadedObjectInfo& inf) override
|
||||
{
|
||||
const llvm::StringRef elf = obj.getData();
|
||||
fs::file(fs::get_config_dir() + "LLVM.obj", fs::rewrite)
|
||||
.write(elf.data(), elf.size());
|
||||
}
|
||||
};
|
||||
|
||||
static EventListener s_listener;
|
||||
|
||||
jit_compiler::jit_compiler(std::unique_ptr<llvm::Module>&& _module, std::unordered_map<std::string, std::uintptr_t>&& table)
|
||||
{
|
||||
EXPECTS(s_memory);
|
||||
|
||||
std::string result;
|
||||
|
||||
const auto module_ptr = _module.get();
|
||||
|
||||
// Initialization
|
||||
llvm::InitializeNativeTarget();
|
||||
llvm::InitializeNativeTargetAsmPrinter();
|
||||
LLVMLinkInMCJIT();
|
||||
|
||||
m_engine.reset(llvm::EngineBuilder(std::move(_module))
|
||||
.setErrorStr(&result)
|
||||
.setMCJITMemoryManager(std::make_unique<MemoryManager>(std::move(table)))
|
||||
.setOptLevel(llvm::CodeGenOpt::Aggressive)
|
||||
.setRelocationModel(llvm::Reloc::PIC_)
|
||||
.setCodeModel((u64)s_memory <= 0x60000000 ? llvm::CodeModel::Medium : llvm::CodeModel::Large) // TODO
|
||||
.setMCPU(llvm::sys::getHostCPUName())
|
||||
.create());
|
||||
|
||||
if (!m_engine)
|
||||
{
|
||||
throw fmt::exception("LLVM: Failed to create ExecutionEngine: %s", result);
|
||||
}
|
||||
|
||||
m_engine->setProcessAllSections(true); // ???
|
||||
m_engine->RegisterJITEventListener(&s_listener);
|
||||
m_engine->finalizeObject();
|
||||
|
||||
for (auto& func : module_ptr->functions())
|
||||
{
|
||||
if (!func.empty())
|
||||
{
|
||||
const std::string& name = func.getName();
|
||||
|
||||
// Register compiled function
|
||||
m_map[name] = m_engine->getFunctionAddress(name);
|
||||
}
|
||||
|
||||
// Delete IR to lower memory consumption
|
||||
func.deleteBody();
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
// Register .xdata UNWIND_INFO (.pdata section is empty for some reason)
|
||||
std::set<u64> func_set;
|
||||
|
||||
for (const auto& pair : m_map)
|
||||
{
|
||||
func_set.emplace(pair.second);
|
||||
}
|
||||
|
||||
// Hack (cannot obtain last function size)
|
||||
func_set.emplace(::align(*--func_set.end() + 4096, 4096));
|
||||
|
||||
const u64 base = (u64)s_memory;
|
||||
const u8* bits = s_unwind_info;
|
||||
|
||||
s_unwind.clear();
|
||||
s_unwind.reserve(m_map.size());
|
||||
|
||||
for (auto it = func_set.begin(), end = --func_set.end(); it != end; it++)
|
||||
{
|
||||
const u64 addr = *it;
|
||||
const u64 next = *func_set.upper_bound(addr);
|
||||
|
||||
// Generate RUNTIME_FUNCTION record
|
||||
RUNTIME_FUNCTION uw;
|
||||
uw.BeginAddress = static_cast<u32>(addr - base);
|
||||
uw.EndAddress = static_cast<u32>(next - base);
|
||||
uw.UnwindData = static_cast<u32>((u64)bits - base);
|
||||
s_unwind.emplace_back(uw);
|
||||
|
||||
// Parse .xdata UNWIND_INFO record
|
||||
const u8 flags = *bits++; // Version and flags
|
||||
const u8 prolog = *bits++; // Size of prolog
|
||||
const u8 count = *bits++; // Count of unwind codes
|
||||
const u8 frame = *bits++; // Frame Reg + Off
|
||||
bits += ::align(std::max<u8>(1, count), 2) * sizeof(u16); // UNWIND_CODE array
|
||||
|
||||
if (flags != 1)
|
||||
{
|
||||
LOG_ERROR(GENERAL, "LLVM: unsupported UNWIND_INFO version/flags (0x%02x)", flags);
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_TRACE(GENERAL, "LLVM: .xdata at 0x%llx: function 0x%x..0x%x: p0x%02x, c0x%02x, f0x%02x", uw.UnwindData + base, uw.BeginAddress + base, uw.EndAddress + base, prolog, count, frame);
|
||||
}
|
||||
|
||||
if (s_unwind_info + s_unwind_size != bits)
|
||||
{
|
||||
LOG_FATAL(GENERAL, "LLVM: .xdata analysis failed! (0x%p != 0x%p)", s_unwind_info + s_unwind_size, bits);
|
||||
}
|
||||
else if (!RtlAddFunctionTable(s_unwind.data(), (DWORD)s_unwind.size(), base))
|
||||
{
|
||||
LOG_FATAL(GENERAL, "RtlAddFunctionTable(addr=0x%p) failed! Error %u", s_unwind_info, GetLastError());
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_SUCCESS(GENERAL, "LLVM: UNWIND_INFO registered (addr=0x%p, size=0x%llx)", s_unwind_info, s_unwind_size);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
jit_compiler::~jit_compiler()
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef LLVM_AVAILABLE
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 0)
|
||||
#endif
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
extern llvm::LLVMContext g_llvm_ctx;
|
||||
|
||||
// Temporary compiler interface
|
||||
class jit_compiler final
|
||||
{
|
||||
// Execution instance
|
||||
std::unique_ptr<llvm::ExecutionEngine> m_engine;
|
||||
|
||||
// Compiled functions
|
||||
std::unordered_map<std::string, std::uintptr_t> m_map;
|
||||
|
||||
public:
|
||||
jit_compiler(std::unique_ptr<llvm::Module>&&, std::unordered_map<std::string, std::uintptr_t>&&);
|
||||
~jit_compiler();
|
||||
|
||||
// Get compiled function address
|
||||
std::uintptr_t get(const std::string& name) const
|
||||
{
|
||||
const auto found = m_map.find(name);
|
||||
|
||||
if (found != m_map.end())
|
||||
{
|
||||
return found->second;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
+127
-219
@@ -1,239 +1,147 @@
|
||||
#include "stdafx.h"
|
||||
#include "Log.h"
|
||||
#include <iostream>
|
||||
#include "Log.h"
|
||||
#include "File.h"
|
||||
#include "StrFmt.h"
|
||||
|
||||
#include <cstdarg>
|
||||
#include <string>
|
||||
#include <cinttypes>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <thread>
|
||||
#include <set>
|
||||
#include <array>
|
||||
|
||||
using namespace Log;
|
||||
// Thread-specific log prefix provider
|
||||
thread_local std::string(*g_tls_log_prefix)() = nullptr;
|
||||
|
||||
LogManager *gLogManager = nullptr;
|
||||
|
||||
u32 LogMessage::size()
|
||||
{
|
||||
//1 byte for NULL terminator
|
||||
return sizeof(LogMessage::size_type) + sizeof(LogType) + sizeof(LogSeverity) + sizeof(std::string::value_type)*mText.size() + 1;
|
||||
}
|
||||
|
||||
void LogMessage::serialize(char *output)
|
||||
{
|
||||
LogMessage::size_type size = this->size();
|
||||
memcpy(output, &size, sizeof(LogMessage::size_type));
|
||||
output += sizeof(LogMessage::size_type);
|
||||
memcpy(output, &mType, sizeof(LogType));
|
||||
output += sizeof(LogType);
|
||||
memcpy(output, &mServerity, sizeof(LogSeverity));
|
||||
output += sizeof(LogSeverity);
|
||||
memcpy(output, mText.c_str(), mText.size() );
|
||||
output += sizeof(std::string::value_type)*mText.size();
|
||||
*output = '\0';
|
||||
|
||||
}
|
||||
LogMessage LogMessage::deserialize(char *input, u32* size_out)
|
||||
{
|
||||
LogMessage msg;
|
||||
LogMessage::size_type msgSize = *(reinterpret_cast<LogMessage::size_type*>(input));
|
||||
input += sizeof(LogMessage::size_type);
|
||||
msg.mType = *(reinterpret_cast<LogType*>(input));
|
||||
input += sizeof(LogType);
|
||||
msg.mServerity = *(reinterpret_cast<LogSeverity*>(input));
|
||||
input += sizeof(LogSeverity);
|
||||
if (msgSize > 9000)
|
||||
{
|
||||
int wtf = 6;
|
||||
}
|
||||
msg.mText.append(input, msgSize - 1 - sizeof(LogSeverity) - sizeof(LogType));
|
||||
if (size_out){(*size_out) = msgSize;}
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
||||
|
||||
LogChannel::LogChannel() : LogChannel("unknown")
|
||||
{}
|
||||
|
||||
LogChannel::LogChannel(const std::string& name) :
|
||||
name(name)
|
||||
, mEnabled(true)
|
||||
, mLogLevel(Warning)
|
||||
{}
|
||||
|
||||
void LogChannel::log(LogMessage msg)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mListenerLock);
|
||||
for (auto &listener : mListeners)
|
||||
{
|
||||
listener->log(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void LogChannel::addListener(std::shared_ptr<LogListener> listener)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mListenerLock);
|
||||
mListeners.insert(listener);
|
||||
}
|
||||
void LogChannel::removeListener(std::shared_ptr<LogListener> listener)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mListenerLock);
|
||||
mListeners.erase(listener);
|
||||
}
|
||||
|
||||
struct CoutListener : LogListener
|
||||
{
|
||||
void log(LogMessage msg)
|
||||
{
|
||||
std::cerr << msg.mText << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
struct FileListener : LogListener
|
||||
{
|
||||
rFile mFile;
|
||||
bool mPrependChannelName;
|
||||
|
||||
FileListener(const std::string& name = _PRGNAME_, bool prependChannel = true)
|
||||
: mFile(name + ".log", rFile::write),
|
||||
mPrependChannelName(prependChannel)
|
||||
{
|
||||
if (!mFile.IsOpened())
|
||||
{
|
||||
rMessageBox("Can't create log file! (" + name + ".log)", rMessageBoxCaptionStr, rICON_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
void log(LogMessage msg)
|
||||
{
|
||||
if (mPrependChannelName)
|
||||
{
|
||||
msg.mText.insert(0, gTypeNameTable[static_cast<u32>(msg.mType)].mName);
|
||||
}
|
||||
mFile.Write(msg.mText);
|
||||
}
|
||||
};
|
||||
|
||||
LogManager::LogManager()
|
||||
#ifdef BUFFERED_LOGGING
|
||||
: mExiting(false), mLogConsumer()
|
||||
#ifndef _MSC_VER
|
||||
constexpr DECLARE(bijective<logs::level, const char*>::map);
|
||||
#endif
|
||||
|
||||
namespace logs
|
||||
{
|
||||
auto it = mChannels.begin();
|
||||
std::shared_ptr<LogListener> listener(new FileListener());
|
||||
for (const LogTypeName& name : gTypeNameTable)
|
||||
struct listener
|
||||
{
|
||||
it->name = name.mName;
|
||||
it->addListener(listener);
|
||||
it++;
|
||||
}
|
||||
std::shared_ptr<LogListener> TTYListener(new FileListener("TTY",false));
|
||||
getChannel(TTY).addListener(TTYListener);
|
||||
#ifdef BUFFERED_LOGGING
|
||||
mLogConsumer = std::thread(&LogManager::consumeLog, this);
|
||||
#endif
|
||||
}
|
||||
listener() = default;
|
||||
|
||||
LogManager::~LogManager()
|
||||
{
|
||||
#ifdef BUFFERED_LOGGING
|
||||
mExiting = true;
|
||||
mBufferReady.notify_all();
|
||||
mLogConsumer.join();
|
||||
}
|
||||
virtual ~listener() = default;
|
||||
|
||||
void LogManager::consumeLog()
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(mStatusMut);
|
||||
while (!mExiting)
|
||||
virtual void log(const channel& ch, level sev, const std::string& text) = 0;
|
||||
};
|
||||
|
||||
class file_writer
|
||||
{
|
||||
mBufferReady.wait(lock);
|
||||
mBuffer.lockGet();
|
||||
size_t size = mBuffer.size();
|
||||
std::vector<char> local_messages(size);
|
||||
mBuffer.popN(&local_messages.front(), size);
|
||||
mBuffer.unlockGet();
|
||||
// Could be memory-mapped file
|
||||
fs::file m_file;
|
||||
|
||||
u32 cursor = 0;
|
||||
u32 removed = 0;
|
||||
while (cursor < size)
|
||||
public:
|
||||
file_writer(const std::string& name);
|
||||
|
||||
virtual ~file_writer() = default;
|
||||
|
||||
// Append raw data
|
||||
void log(const std::string& text);
|
||||
|
||||
// Get current file size (may be used by secondary readers)
|
||||
std::size_t size() const;
|
||||
};
|
||||
|
||||
struct file_listener : public file_writer, public listener
|
||||
{
|
||||
file_listener(const std::string& name)
|
||||
: file_writer(name)
|
||||
, listener()
|
||||
{
|
||||
Log::LogMessage msg = Log::LogMessage::deserialize(local_messages.data() + cursor, &removed);
|
||||
cursor += removed;
|
||||
getChannel(msg.mType).log(msg);
|
||||
}
|
||||
|
||||
// Encode level, current thread name, channel name and write log message
|
||||
virtual void log(const channel& ch, level sev, const std::string& text) override;
|
||||
};
|
||||
|
||||
static file_listener& get_logger()
|
||||
{
|
||||
// Use magic static
|
||||
static file_listener logger("RPCS3.log");
|
||||
return logger;
|
||||
}
|
||||
|
||||
channel GENERAL(nullptr, level::notice);
|
||||
channel LOADER("LDR", level::notice);
|
||||
channel MEMORY("MEM", level::notice);
|
||||
channel RSX("RSX", level::notice);
|
||||
channel HLE("HLE", level::notice);
|
||||
channel PPU("PPU", level::notice);
|
||||
channel SPU("SPU", level::notice);
|
||||
channel ARMv7("ARMv7");
|
||||
}
|
||||
|
||||
void logs::channel::broadcast(const logs::channel& ch, logs::level sev, const char* fmt...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
get_logger().log(ch, sev, fmt::unsafe_vformat(fmt, args));
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
[[noreturn]] extern void catch_all_exceptions();
|
||||
|
||||
logs::file_writer::file_writer(const std::string& name)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!m_file.open(fs::get_config_dir() + name, fs::rewrite + fs::append))
|
||||
{
|
||||
throw fmt::exception("Can't create log file %s (error %d)", name, fs::g_tls_error);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void LogManager::log(LogMessage msg)
|
||||
{
|
||||
//don't do any formatting changes or filtering to the TTY output since we
|
||||
//use the raw output to do diffs with the output of a real PS3 and some
|
||||
//programs write text in single bytes to the console
|
||||
if (msg.mType != TTY)
|
||||
catch (...)
|
||||
{
|
||||
std::string prefix;
|
||||
switch (msg.mServerity)
|
||||
{
|
||||
case Success:
|
||||
prefix = "S ";
|
||||
break;
|
||||
case Notice:
|
||||
prefix = "! ";
|
||||
break;
|
||||
case Warning:
|
||||
prefix = "W ";
|
||||
break;
|
||||
case Error:
|
||||
prefix = "E ";
|
||||
break;
|
||||
}
|
||||
if (NamedThreadBase* thr = GetCurrentNamedThread())
|
||||
{
|
||||
prefix += thr->GetThreadName();
|
||||
}
|
||||
msg.mText.insert(0, prefix);
|
||||
msg.mText.append(1,'\n');
|
||||
}
|
||||
#ifdef BUFFERED_LOGGING
|
||||
size_t size = msg.size();
|
||||
std::vector<char> temp_buffer(size);
|
||||
msg.serialize(temp_buffer.data());
|
||||
mBuffer.pushRange(temp_buffer.begin(), temp_buffer.end());
|
||||
mBufferReady.notify_one();
|
||||
#else
|
||||
mChannels[static_cast<u32>(msg.mType)].log(msg);
|
||||
#endif
|
||||
}
|
||||
|
||||
void LogManager::addListener(std::shared_ptr<LogListener> listener)
|
||||
{
|
||||
for (auto& channel : mChannels)
|
||||
{
|
||||
channel.addListener(listener);
|
||||
}
|
||||
}
|
||||
void LogManager::removeListener(std::shared_ptr<LogListener> listener)
|
||||
{
|
||||
for (auto& channel : mChannels)
|
||||
{
|
||||
channel.removeListener(listener);
|
||||
catch_all_exceptions();
|
||||
}
|
||||
}
|
||||
|
||||
LogManager& LogManager::getInstance()
|
||||
void logs::file_writer::log(const std::string& text)
|
||||
{
|
||||
if (!gLogManager)
|
||||
{
|
||||
gLogManager = new LogManager();
|
||||
}
|
||||
return *gLogManager;
|
||||
m_file.write(text);
|
||||
}
|
||||
LogChannel &LogManager::getChannel(LogType type)
|
||||
|
||||
std::size_t logs::file_writer::size() const
|
||||
{
|
||||
return mChannels[static_cast<u32>(type)];
|
||||
}
|
||||
return m_file.pos();
|
||||
}
|
||||
|
||||
void logs::file_listener::log(const logs::channel& ch, logs::level sev, const std::string& text)
|
||||
{
|
||||
std::string msg; msg.reserve(text.size() + 200);
|
||||
|
||||
// Used character: U+00B7 (Middle Dot)
|
||||
switch (sev)
|
||||
{
|
||||
case level::always: msg = u8"·A "; break;
|
||||
case level::fatal: msg = u8"·F "; break;
|
||||
case level::error: msg = u8"·E "; break;
|
||||
case level::todo: msg = u8"·U "; break;
|
||||
case level::success: msg = u8"·S "; break;
|
||||
case level::warning: msg = u8"·W "; break;
|
||||
case level::notice: msg = u8"·! "; break;
|
||||
case level::trace: msg = u8"·T "; break;
|
||||
}
|
||||
|
||||
// TODO: print time?
|
||||
|
||||
if (auto prefix = g_tls_log_prefix)
|
||||
{
|
||||
msg += '{';
|
||||
msg += prefix();
|
||||
msg += "} ";
|
||||
}
|
||||
|
||||
if (ch.name)
|
||||
{
|
||||
msg += ch.name;
|
||||
msg += sev == level::todo ? " TODO: " : ": ";
|
||||
}
|
||||
else if (sev == level::todo)
|
||||
{
|
||||
msg += "TODO: ";
|
||||
}
|
||||
|
||||
msg += text;
|
||||
msg += '\n';
|
||||
|
||||
file_writer::log(msg);
|
||||
}
|
||||
|
||||
+86
-129
@@ -1,148 +1,105 @@
|
||||
#pragma once
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <cinttypes>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
#include <array>
|
||||
#include "Utilities/MTRingbuffer.h"
|
||||
|
||||
//#define BUFFERED_LOGGING 1
|
||||
#include "types.h"
|
||||
#include "Atomic.h"
|
||||
|
||||
//first parameter is of type Log::LogType and text is of type std::string
|
||||
|
||||
#define LOG_SUCCESS(logType, text, ...) log_message(logType, Log::Success, text, ##__VA_ARGS__)
|
||||
#define LOG_NOTICE(logType, text, ...) log_message(logType, Log::Notice, text, ##__VA_ARGS__)
|
||||
#define LOG_WARNING(logType, text, ...) log_message(logType, Log::Warning, text, ##__VA_ARGS__)
|
||||
#define LOG_ERROR(logType, text, ...) log_message(logType, Log::Error, text, ##__VA_ARGS__)
|
||||
|
||||
namespace Log
|
||||
namespace logs
|
||||
{
|
||||
const unsigned int MAX_LOG_BUFFER_LENGTH = 1024*1024;
|
||||
const unsigned int gBuffSize = 1000;
|
||||
|
||||
enum LogType : u32
|
||||
enum class level : uint
|
||||
{
|
||||
GENERAL = 0,
|
||||
LOADER,
|
||||
MEMORY,
|
||||
RSX,
|
||||
HLE,
|
||||
PPU,
|
||||
SPU,
|
||||
TTY,
|
||||
always, // highest level (unused, cannot be disabled)
|
||||
fatal,
|
||||
error,
|
||||
todo,
|
||||
success,
|
||||
warning,
|
||||
notice,
|
||||
trace, // lowest level (usually disabled)
|
||||
};
|
||||
|
||||
|
||||
struct LogTypeName
|
||||
struct channel
|
||||
{
|
||||
LogType mType;
|
||||
std::string mName;
|
||||
};
|
||||
// Channel prefix (added to every log message)
|
||||
const char* const name;
|
||||
|
||||
//well I'd love make_array() but alas manually counting is not the end of the world
|
||||
static const std::array<LogTypeName, 8> gTypeNameTable = { {
|
||||
{ GENERAL, "G: " },
|
||||
{ LOADER, "LDR: " },
|
||||
{ MEMORY, "MEM: " },
|
||||
{ RSX, "RSX: " },
|
||||
{ HLE, "HLE: " },
|
||||
{ PPU, "PPU: " },
|
||||
{ SPU, "SPU: " },
|
||||
{ TTY, "TTY: " }
|
||||
} };
|
||||
// The lowest logging level enabled for this channel (used for early filtering)
|
||||
atomic_t<level> enabled;
|
||||
|
||||
enum LogSeverity : u32
|
||||
{
|
||||
Success = 0,
|
||||
Notice,
|
||||
Warning,
|
||||
Error,
|
||||
};
|
||||
// Constant initialization: name and initial log level
|
||||
constexpr channel(const char* name, level enabled = level::trace)
|
||||
: name(name)
|
||||
, enabled(enabled)
|
||||
{
|
||||
}
|
||||
|
||||
struct LogMessage
|
||||
{
|
||||
using size_type = u32;
|
||||
LogType mType;
|
||||
LogSeverity mServerity;
|
||||
std::string mText;
|
||||
|
||||
u32 size();
|
||||
void serialize(char *output);
|
||||
static LogMessage deserialize(char *input, u32* size_out=nullptr);
|
||||
};
|
||||
|
||||
struct LogListener
|
||||
{
|
||||
virtual ~LogListener() {};
|
||||
virtual void log(LogMessage msg) = 0;
|
||||
};
|
||||
|
||||
struct LogChannel
|
||||
{
|
||||
LogChannel();
|
||||
LogChannel(const std::string& name);
|
||||
LogChannel(LogChannel& other) = delete;
|
||||
LogChannel& operator = (LogChannel& other) = delete;
|
||||
void log(LogMessage msg);
|
||||
void addListener(std::shared_ptr<LogListener> listener);
|
||||
void removeListener(std::shared_ptr<LogListener> listener);
|
||||
std::string name;
|
||||
private:
|
||||
bool mEnabled;
|
||||
LogSeverity mLogLevel;
|
||||
std::mutex mListenerLock;
|
||||
std::set<std::shared_ptr<LogListener>> mListeners;
|
||||
};
|
||||
|
||||
struct LogManager
|
||||
{
|
||||
LogManager();
|
||||
~LogManager();
|
||||
static LogManager& getInstance();
|
||||
LogChannel& getChannel(LogType type);
|
||||
void log(LogMessage msg);
|
||||
void addListener(std::shared_ptr<LogListener> listener);
|
||||
void removeListener(std::shared_ptr<LogListener> listener);
|
||||
#ifdef BUFFERED_LOGGING
|
||||
void consumeLog();
|
||||
// Formatting function
|
||||
template<typename... Args>
|
||||
void format(level sev, const char* fmt, const Args&... args) const
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
if (sev <= enabled)
|
||||
#else
|
||||
if (__builtin_expect(sev <= enabled, 0))
|
||||
#endif
|
||||
broadcast(*this, sev, fmt, ::unveil<Args>::get(args)...);
|
||||
}
|
||||
|
||||
#define GEN_LOG_METHOD(_sev)\
|
||||
template<typename... Args>\
|
||||
void _sev(const char* fmt, const Args&... args) const\
|
||||
{\
|
||||
return format<Args...>(level::_sev, fmt, args...);\
|
||||
}
|
||||
|
||||
GEN_LOG_METHOD(fatal)
|
||||
GEN_LOG_METHOD(error)
|
||||
GEN_LOG_METHOD(todo)
|
||||
GEN_LOG_METHOD(success)
|
||||
GEN_LOG_METHOD(warning)
|
||||
GEN_LOG_METHOD(notice)
|
||||
GEN_LOG_METHOD(trace)
|
||||
|
||||
#undef GEN_LOG_METHOD
|
||||
|
||||
private:
|
||||
#ifdef BUFFERED_LOGGING
|
||||
MTRingbuffer<char, MAX_LOG_BUFFER_LENGTH> mBuffer;
|
||||
std::condition_variable mBufferReady;
|
||||
std::mutex mStatusMut;
|
||||
std::atomic<bool> mExiting;
|
||||
std::thread mLogConsumer;
|
||||
#endif
|
||||
std::array<LogChannel, std::tuple_size<decltype(gTypeNameTable)>::value> mChannels;
|
||||
//std::array<LogChannel,gTypeNameTable.size()> mChannels; //TODO: use this once Microsoft sorts their shit out
|
||||
// Send log message to global logger instance
|
||||
static void broadcast(const channel& ch, level sev, const char* fmt...);
|
||||
};
|
||||
|
||||
/* Small set of predefined channels */
|
||||
|
||||
extern channel GENERAL;
|
||||
extern channel LOADER;
|
||||
extern channel MEMORY;
|
||||
extern channel RSX;
|
||||
extern channel HLE;
|
||||
extern channel PPU;
|
||||
extern channel SPU;
|
||||
extern channel ARMv7;
|
||||
}
|
||||
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::GENERAL; } } GENERAL;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::LOADER; } } LOADER;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::MEMORY; } } MEMORY;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::RSX; } } RSX;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::HLE; } } HLE;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::PPU; } } PPU;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::SPU; } } SPU;
|
||||
static struct { inline operator Log::LogType() { return Log::LogType::TTY; } } TTY;
|
||||
|
||||
inline void log_message(Log::LogType type, Log::LogSeverity sev, std::string text)
|
||||
template<>
|
||||
struct bijective<logs::level, const char*>
|
||||
{
|
||||
//another msvc bug makes this not work, uncomment this and delete everything else in this function when it's fixed
|
||||
//Log::LogManager::getInstance().log({logType, severity, text})
|
||||
static constexpr bijective_pair<logs::level, const char*> map[]
|
||||
{
|
||||
{ logs::level::always, "Nothing" },
|
||||
{ logs::level::fatal, "Fatal" },
|
||||
{ logs::level::error, "Error" },
|
||||
{ logs::level::todo, "TODO" },
|
||||
{ logs::level::success, "Success" },
|
||||
{ logs::level::warning, "Warning" },
|
||||
{ logs::level::notice, "Notice" },
|
||||
{ logs::level::trace, "Trace" },
|
||||
};
|
||||
};
|
||||
|
||||
Log::LogMessage msg{type, sev, text};
|
||||
Log::LogManager::getInstance().log(msg);
|
||||
}
|
||||
// Legacy:
|
||||
|
||||
template<typename T, typename ...Ts>
|
||||
inline void log_message(Log::LogType type, Log::LogSeverity sev, std::string text, T arg, Ts... args)
|
||||
{
|
||||
Log::LogMessage msg{type, sev, fmt::Format(text,arg,args...)};
|
||||
Log::LogManager::getInstance().log(msg);
|
||||
}
|
||||
#define LOG_SUCCESS(ch, fmt, ...) logs::ch.success(fmt, ##__VA_ARGS__)
|
||||
#define LOG_NOTICE(ch, fmt, ...) logs::ch.notice (fmt, ##__VA_ARGS__)
|
||||
#define LOG_WARNING(ch, fmt, ...) logs::ch.warning(fmt, ##__VA_ARGS__)
|
||||
#define LOG_ERROR(ch, fmt, ...) logs::ch.error (fmt, ##__VA_ARGS__)
|
||||
#define LOG_TODO(ch, fmt, ...) logs::ch.todo (fmt, ##__VA_ARGS__)
|
||||
#define LOG_TRACE(ch, fmt, ...) logs::ch.trace (fmt, ##__VA_ARGS__)
|
||||
#define LOG_FATAL(ch, fmt, ...) logs::ch.fatal (fmt, ##__VA_ARGS__)
|
||||
|
||||
@@ -61,7 +61,7 @@ public:
|
||||
Show();
|
||||
}
|
||||
|
||||
__forceinline void Update(const u8 thread_id, const u64 value, const wxString& msg)
|
||||
force_inline void Update(const u8 thread_id, const u64 value, const wxString& msg)
|
||||
{
|
||||
if(thread_id > m_cores) return;
|
||||
|
||||
|
||||
@@ -1,159 +0,0 @@
|
||||
#pragma once
|
||||
#include <thread>
|
||||
#include <array>
|
||||
#include <mutex>
|
||||
#include <algorithm>
|
||||
|
||||
//Simple non-resizable FIFO Ringbuffer that can be simultaneously be read from and written to
|
||||
//if we ever get to use boost please replace this with boost::circular_buffer, there's no reason
|
||||
//why we would have to keep this amateur attempt at such a fundamental data-structure around
|
||||
template< typename T, unsigned int MAX_MTRINGBUFFER_BUFFER_SIZE>
|
||||
class MTRingbuffer{
|
||||
std::array<T, MAX_MTRINGBUFFER_BUFFER_SIZE> mBuffer;
|
||||
//this is a recursive mutex because the get methods lock it but the only
|
||||
//way to be sure that they do not block is to check the size and the only
|
||||
//way to check the size and use get atomically is to lock this mutex,
|
||||
//so it goes:
|
||||
//lock get mutex-->check size-->call get-->lock get mutex-->unlock get mutex-->return from get-->unlock get mutex
|
||||
std::recursive_mutex mMutGet;
|
||||
std::mutex mMutPut;
|
||||
|
||||
size_t mGet;
|
||||
size_t mPut;
|
||||
size_t moveGet(size_t by = 1){ return (mGet + by) % MAX_MTRINGBUFFER_BUFFER_SIZE; }
|
||||
size_t movePut(size_t by = 1){ return (mPut + by) % MAX_MTRINGBUFFER_BUFFER_SIZE; }
|
||||
public:
|
||||
MTRingbuffer() : mGet(0), mPut(0){}
|
||||
|
||||
//blocks until there's something to get, so check "spaceLeft()" if you want to avoid blocking
|
||||
//also lock the get mutex around the spaceLeft() check and the pop if you want to avoid racing
|
||||
T pop()
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(mMutGet);
|
||||
while (mGet == mPut)
|
||||
{
|
||||
//wait until there's actually something to get
|
||||
//throwing an exception might be better, blocking here is a little awkward
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
size_t ret = mGet;
|
||||
mGet = moveGet();
|
||||
return mBuffer[ret];
|
||||
}
|
||||
|
||||
//blocks if the buffer is full until there's enough room
|
||||
void push(T &putEle)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mMutPut);
|
||||
while (movePut() == mGet)
|
||||
{
|
||||
//if this is reached a lot it's time to increase the buffer size
|
||||
//or implement dynamic re-sizing
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
mBuffer[mPut] = std::forward(putEle);
|
||||
mPut = movePut();
|
||||
}
|
||||
|
||||
bool empty()
|
||||
{
|
||||
return mGet == mPut;
|
||||
}
|
||||
|
||||
//returns the amount of free places, this is the amount of actual free spaces-1
|
||||
//since mGet==mPut signals an empty buffer we can't actually use the last free
|
||||
//space, so we shouldn't report it as free.
|
||||
size_t spaceLeft() //apparently free() is a macro definition in msvc in some conditions
|
||||
{
|
||||
if (mGet < mPut)
|
||||
{
|
||||
return mBuffer.size() - (mPut - mGet) - 1;
|
||||
}
|
||||
else if (mGet > mPut)
|
||||
{
|
||||
return mGet - mPut - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return mBuffer.size() - 1;
|
||||
}
|
||||
}
|
||||
|
||||
size_t size()
|
||||
{
|
||||
//the magic -1 is the same magic 1 that is explained in the spaceLeft() function
|
||||
return mBuffer.size() - spaceLeft() - 1;
|
||||
}
|
||||
|
||||
//takes random access iterator to T
|
||||
template<typename IteratorType>
|
||||
void pushRange(IteratorType from, IteratorType until)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mMutPut);
|
||||
size_t length = until - from;
|
||||
|
||||
//if whatever we're trying to store is greater than the entire buffer the following loop will be infinite
|
||||
assert(mBuffer.size() > length);
|
||||
while (spaceLeft() < length)
|
||||
{
|
||||
//if this is reached a lot it's time to increase the buffer size
|
||||
//or implement dynamic re-sizing
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
if (mPut + length <= mBuffer.size())
|
||||
{
|
||||
std::copy(from, until, mBuffer.begin() + mPut);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t tillEnd = mBuffer.size() - mPut;
|
||||
std::copy(from, from + tillEnd, mBuffer.begin() + mPut);
|
||||
std::copy(from + tillEnd, until, mBuffer.begin());
|
||||
}
|
||||
mPut = movePut(length);
|
||||
|
||||
}
|
||||
|
||||
//takes output iterator to T
|
||||
template<typename IteratorType>
|
||||
void popN(IteratorType output, size_t n)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(mMutGet);
|
||||
//make sure we're not trying to retrieve more than is in
|
||||
assert(n <= size());
|
||||
peekN<IteratorType>(output, n);
|
||||
mGet = moveGet(n);
|
||||
}
|
||||
|
||||
//takes output iterator to T
|
||||
template<typename IteratorType>
|
||||
void peekN(IteratorType output, size_t n)
|
||||
{
|
||||
size_t lGet = mGet;
|
||||
if (lGet + n <= mBuffer.size())
|
||||
{
|
||||
std::copy_n(mBuffer.begin() + lGet, n, output);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto next = std::copy(mBuffer.begin() + lGet, mBuffer.end(), output);
|
||||
std::copy_n(mBuffer.begin(), n - (mBuffer.size() - lGet), next);
|
||||
}
|
||||
}
|
||||
|
||||
//well this is just asking for trouble
|
||||
//but the comment above the declaration of mMutGet explains why it's there
|
||||
//if there's a better way please remove this
|
||||
void lockGet()
|
||||
{
|
||||
mMutGet.lock();
|
||||
}
|
||||
|
||||
//well this is just asking for trouble
|
||||
//but the comment above the declaration of mMutGet explains why it's there
|
||||
//if there's a better way please remove this
|
||||
void unlockGet()
|
||||
{
|
||||
mMutGet.unlock();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,83 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <exception>
|
||||
|
||||
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
|
||||
constexpr T align(const T& value, std::uint64_t align)
|
||||
{
|
||||
return static_cast<T>((value + (align - 1)) & ~(align - 1));
|
||||
}
|
||||
|
||||
template<typename To, typename From>
|
||||
constexpr To narrow_impl(const To& result, const From& value, const char* message)
|
||||
{
|
||||
return static_cast<From>(result) != value ? throw std::runtime_error(message) : result;
|
||||
}
|
||||
|
||||
// Narrow cast (similar to gsl::narrow) with fixed message
|
||||
template<typename To, typename From>
|
||||
constexpr auto narrow(const From& value, const char* fixed_msg = "::narrow() failed") -> decltype(static_cast<To>(static_cast<From>(std::declval<To>())))
|
||||
{
|
||||
return narrow_impl(static_cast<To>(value), value, fixed_msg);
|
||||
}
|
||||
|
||||
// Return 32 bit .size() for container
|
||||
template<typename CT>
|
||||
constexpr auto size32(const CT& container, const char* fixed_msg = "::size32() failed") -> decltype(static_cast<std::uint32_t>(container.size()))
|
||||
{
|
||||
return narrow<std::uint32_t>(container.size(), fixed_msg);
|
||||
}
|
||||
|
||||
// Return 32 bit size for an array
|
||||
template<typename T, std::size_t Size>
|
||||
constexpr std::uint32_t size32(const T(&)[Size])
|
||||
{
|
||||
static_assert(Size <= UINT32_MAX, "size32() error: too big");
|
||||
return static_cast<std::uint32_t>(Size);
|
||||
}
|
||||
|
||||
#define CHECK_SIZE(type, size) static_assert(sizeof(type) == size, "Invalid " #type " type size")
|
||||
#define CHECK_ALIGN(type, align) static_assert(alignof(type) == align, "Invalid " #type " type alignment")
|
||||
#define CHECK_MAX_SIZE(type, size) static_assert(sizeof(type) <= size, #type " type size is too big")
|
||||
#define CHECK_SIZE_ALIGN(type, size, align) CHECK_SIZE(type, size); CHECK_ALIGN(type, align)
|
||||
#define CHECK_STORAGE(type, storage) static_assert(sizeof(type) <= sizeof(storage) && alignof(type) <= alignof(decltype(storage)), #type " is too small")
|
||||
|
||||
// Return 32 bit sizeof() to avoid widening/narrowing conversions with size_t
|
||||
#define SIZE_32(type) static_cast<std::uint32_t>(sizeof(type))
|
||||
|
||||
// Return 32 bit alignof() to avoid widening/narrowing conversions with size_t
|
||||
#define ALIGN_32(type) static_cast<std::uint32_t>(alignof(type))
|
||||
|
||||
// Return 32 bit custom offsetof()
|
||||
#define OFFSET_32(type, x) static_cast<std::uint32_t>(reinterpret_cast<std::uintptr_t>(&reinterpret_cast<const volatile char&>(reinterpret_cast<type*>(0ull)->x)))
|
||||
|
||||
// Sometimes to avoid writing std::remove_cv_t<>, example: std::is_same<CV T1, CV T2>
|
||||
#define CV const volatile
|
||||
|
||||
#define CONCATENATE_DETAIL(x, y) x ## y
|
||||
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
|
||||
|
||||
#define STRINGIZE_DETAIL(x) #x
|
||||
#define STRINGIZE(x) STRINGIZE_DETAIL(x)
|
||||
|
||||
// Macro set, wraps an expression into lambda
|
||||
#define WRAP_EXPR(expr, ...) [&](__VA_ARGS__) { return expr; }
|
||||
#define COPY_EXPR(expr, ...) [=](__VA_ARGS__) { return expr; }
|
||||
#define PURE_EXPR(expr, ...) [] (__VA_ARGS__) { return expr; }
|
||||
|
||||
#define return_ return
|
||||
|
||||
#define HERE "\n(in file " __FILE__ ":" STRINGIZE(__LINE__) ")"
|
||||
|
||||
// Ensure that the expression is evaluated to true. Always evaluated and allowed to have side effects (unlike assert() macro).
|
||||
#define VERIFY(expr) do { if (!(expr)) throw std::runtime_error("Verification failed: " #expr HERE); } while (0)
|
||||
|
||||
// EXPECTS() and ENSURES() are intended to check function arguments and results.
|
||||
// Expressions are not guaranteed to evaluate.
|
||||
#define EXPECTS(expr) do { if (!(expr)) throw std::runtime_error("Precondition failed: " #expr HERE); } while (0)
|
||||
#define ENSURES(expr) do { if (!(expr)) throw std::runtime_error("Postcondition failed: " #expr HERE); } while (0)
|
||||
|
||||
#define DECLARE(...) decltype(__VA_ARGS__) __VA_ARGS__
|
||||
|
||||
#define STR_CASE(value) case value: return #value
|
||||
@@ -0,0 +1,51 @@
|
||||
#include "Platform.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <sys/types.h>
|
||||
#include <sys/_types/_timespec.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/clock.h>
|
||||
#include <mach/mach_time.h>
|
||||
#undef CPU_STATE_MAX
|
||||
|
||||
#define MT_NANO (+1.0E-9)
|
||||
#define MT_GIGA UINT64_C(1000000000)
|
||||
|
||||
// TODO create a list of timers,
|
||||
static double mt_timebase = 0.0;
|
||||
static uint64_t mt_timestart = 0;
|
||||
|
||||
// TODO be more careful in a multithreaded environement
|
||||
int clock_gettime(clockid_t clk_id, struct timespec *tp)
|
||||
{
|
||||
kern_return_t retval = KERN_SUCCESS;
|
||||
if( clk_id == TIMER_ABSTIME)
|
||||
{
|
||||
if (!mt_timestart) { // only one timer, initilized on the first call to the TIMER
|
||||
mach_timebase_info_data_t tb = { 0 };
|
||||
mach_timebase_info(&tb);
|
||||
mt_timebase = tb.numer;
|
||||
mt_timebase /= tb.denom;
|
||||
mt_timestart = mach_absolute_time();
|
||||
}
|
||||
|
||||
double diff = (mach_absolute_time() - mt_timestart) * mt_timebase;
|
||||
tp->tv_sec = diff * MT_NANO;
|
||||
tp->tv_nsec = diff - (tp->tv_sec * MT_GIGA);
|
||||
}
|
||||
else // other clk_ids are mapped to the coresponding mach clock_service
|
||||
{
|
||||
clock_serv_t cclock;
|
||||
mach_timespec_t mts;
|
||||
|
||||
host_get_clock_service(mach_host_self(), clk_id, &cclock);
|
||||
retval = clock_get_time(cclock, &mts);
|
||||
mach_port_deallocate(mach_task_self(), cclock);
|
||||
|
||||
tp->tv_sec = mts.tv_sec;
|
||||
tp->tv_nsec = mts.tv_nsec;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
@@ -0,0 +1,122 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <immintrin.h>
|
||||
#include <emmintrin.h>
|
||||
|
||||
#define IS_LE_MACHINE 1
|
||||
#define IS_BE_MACHINE 0
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <intrin.h>
|
||||
#else
|
||||
#include <x86intrin.h>
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define ASSUME(cond) __assume(cond)
|
||||
#define LIKELY(cond) (cond)
|
||||
#define UNLIKELY(cond) (cond)
|
||||
#else
|
||||
#define ASSUME(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
|
||||
#define LIKELY(cond) __builtin_expect(!!(cond), 1)
|
||||
#define UNLIKELY(cond) __builtin_expect(!!(cond), 0)
|
||||
#endif
|
||||
|
||||
// Some platforms don't support thread_local well yet.
|
||||
#ifndef _MSC_VER
|
||||
#define thread_local __thread
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define never_inline __declspec(noinline)
|
||||
#else
|
||||
#define never_inline __attribute__((noinline))
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define force_inline __forceinline
|
||||
#else
|
||||
#define force_inline __attribute__((always_inline)) inline
|
||||
#endif
|
||||
|
||||
#if defined(__GNUG__)
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#define _fpclass(x) std::fpclassify(x)
|
||||
#define INFINITE 0xFFFFFFFF
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
||||
// XXX only supports a single timer
|
||||
#define TIMER_ABSTIME -1
|
||||
/* The opengroup spec isn't clear on the mapping from REALTIME to CALENDAR
|
||||
being appropriate or not.
|
||||
http://pubs.opengroup.org/onlinepubs/009695299/basedefs/time.h.html */
|
||||
#define CLOCK_REALTIME 1 // #define CALENDAR_CLOCK 1 from mach/clock_types.h
|
||||
#define CLOCK_MONOTONIC 0 // #define SYSTEM_CLOCK 0
|
||||
|
||||
typedef int clockid_t;
|
||||
|
||||
/* the mach kernel uses struct mach_timespec, so struct timespec
|
||||
is loaded from <sys/_types/_timespec.h> for compatability */
|
||||
// struct timespec { time_t tv_sec; long tv_nsec; };
|
||||
|
||||
int clock_gettime(clockid_t clk_id, struct timespec *tp);
|
||||
|
||||
#endif /* __APPLE__ */
|
||||
#endif /* __GNUG__ */
|
||||
|
||||
inline std::uint32_t cntlz32(std::uint32_t arg)
|
||||
{
|
||||
#if defined(_MSC_VER)
|
||||
unsigned long res;
|
||||
return _BitScanReverse(&res, arg) ? res ^ 31 : 32;
|
||||
#else
|
||||
return arg ? __builtin_clzll(arg) - 32 : 32;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline std::uint64_t cntlz64(std::uint64_t arg)
|
||||
{
|
||||
#if defined(_MSC_VER)
|
||||
unsigned long res;
|
||||
return _BitScanReverse64(&res, arg) ? res ^ 63 : 64;
|
||||
#else
|
||||
return arg ? __builtin_clzll(arg) : 64;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Helper function, used by ""_u16, ""_u32, ""_u64
|
||||
constexpr std::uint8_t to_u8(char c)
|
||||
{
|
||||
return static_cast<std::uint8_t>(c);
|
||||
}
|
||||
|
||||
// Convert 2-byte string to u16 value like reinterpret_cast does
|
||||
constexpr std::uint16_t operator""_u16(const char* s, std::size_t length)
|
||||
{
|
||||
return length != 2 ? throw s :
|
||||
#if IS_LE_MACHINE == 1
|
||||
to_u8(s[1]) << 8 | to_u8(s[0]);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Convert 4-byte string to u32 value like reinterpret_cast does
|
||||
constexpr std::uint32_t operator""_u32(const char* s, std::size_t length)
|
||||
{
|
||||
return length != 4 ? throw s :
|
||||
#if IS_LE_MACHINE == 1
|
||||
to_u8(s[3]) << 24 | to_u8(s[2]) << 16 | to_u8(s[1]) << 8 | to_u8(s[0]);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Convert 8-byte string to u64 value like reinterpret_cast does
|
||||
constexpr std::uint64_t operator""_u64(const char* s, std::size_t length)
|
||||
{
|
||||
return length != 8 ? throw s :
|
||||
#if IS_LE_MACHINE == 1
|
||||
static_cast<std::uint64_t>(to_u8(s[7]) << 24 | to_u8(s[6]) << 16 | to_u8(s[5]) << 8 | to_u8(s[4])) << 32 | to_u8(s[3]) << 24 | to_u8(s[2]) << 16 | to_u8(s[1]) << 8 | to_u8(s[0]);
|
||||
#endif
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
#include <stdafx.h>
|
||||
#include "Utilities/Log.h"
|
||||
#include "Emu/Memory/Memory.h"
|
||||
#include "Emu/System.h"
|
||||
#include "Emu/CPU/CPUThread.h"
|
||||
|
||||
#include "Utilities/SMutex.h"
|
||||
|
||||
__forceinline void SM_Sleep()
|
||||
{
|
||||
if (NamedThreadBase* t = GetCurrentNamedThread())
|
||||
{
|
||||
t->WaitForAnySignal();
|
||||
}
|
||||
else
|
||||
{
|
||||
Sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
thread_local size_t g_this_thread_id = 0;
|
||||
|
||||
__forceinline size_t SM_GetCurrentThreadId()
|
||||
{
|
||||
return g_this_thread_id ? g_this_thread_id : g_this_thread_id = std::hash<std::thread::id>()(std::this_thread::get_id());
|
||||
}
|
||||
|
||||
__forceinline u32 SM_GetCurrentCPUThreadId()
|
||||
{
|
||||
if (CPUThread* t = GetCurrentCPUThread())
|
||||
{
|
||||
return t->GetId();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
__forceinline be_t<u32> SM_GetCurrentCPUThreadIdBE()
|
||||
{
|
||||
return SM_GetCurrentCPUThreadId();
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
#pragma once
|
||||
#include "BEType.h"
|
||||
|
||||
extern void SM_Sleep();
|
||||
extern size_t SM_GetCurrentThreadId();
|
||||
extern u32 SM_GetCurrentCPUThreadId();
|
||||
extern be_t<u32> SM_GetCurrentCPUThreadIdBE();
|
||||
|
||||
enum SMutexResult
|
||||
{
|
||||
SMR_OK = 0, // succeeded (lock, trylock, unlock)
|
||||
SMR_FAILED, // failed (trylock, unlock)
|
||||
SMR_DEADLOCK, // mutex reached deadlock (lock, trylock)
|
||||
SMR_SIGNAL = SMR_DEADLOCK, // unlock can be used for signaling specific thread
|
||||
SMR_PERMITTED, // not owner of the mutex (unlock)
|
||||
SMR_ABORT, // emulator has been stopped (lock, trylock, unlock)
|
||||
SMR_DESTROYED, // mutex has been destroyed (lock, trylock, unlock)
|
||||
SMR_TIMEOUT, // timed out (lock)
|
||||
};
|
||||
|
||||
template
|
||||
<
|
||||
typename T,
|
||||
u64 free_value = 0,
|
||||
u64 dead_value = 0xffffffff,
|
||||
void (*wait)() = SM_Sleep
|
||||
>
|
||||
class SMutexBase
|
||||
{
|
||||
static_assert(sizeof(T) == sizeof(std::atomic<T>), "Invalid SMutexBase type");
|
||||
std::atomic<T> owner;
|
||||
|
||||
public:
|
||||
SMutexBase()
|
||||
: owner((T)free_value)
|
||||
{
|
||||
}
|
||||
|
||||
void initialize()
|
||||
{
|
||||
(T&)owner = free_value;
|
||||
}
|
||||
|
||||
~SMutexBase()
|
||||
{
|
||||
lock((T)dead_value);
|
||||
owner = (T)dead_value;
|
||||
}
|
||||
|
||||
__forceinline T GetOwner() const
|
||||
{
|
||||
return (T&)owner;
|
||||
}
|
||||
|
||||
__forceinline T GetFreeValue() const
|
||||
{
|
||||
return (T)free_value;
|
||||
}
|
||||
|
||||
__forceinline T GetDeadValue() const
|
||||
{
|
||||
return (T)dead_value;
|
||||
}
|
||||
|
||||
SMutexResult trylock(T tid)
|
||||
{
|
||||
if (Emu.IsStopped())
|
||||
{
|
||||
return SMR_ABORT;
|
||||
}
|
||||
T old = (T)free_value;
|
||||
|
||||
if (!owner.compare_exchange_strong(old, tid))
|
||||
{
|
||||
if (old == tid)
|
||||
{
|
||||
return SMR_DEADLOCK;
|
||||
}
|
||||
if (old == (T)dead_value)
|
||||
{
|
||||
return SMR_DESTROYED;
|
||||
}
|
||||
return SMR_FAILED;
|
||||
}
|
||||
|
||||
return SMR_OK;
|
||||
}
|
||||
|
||||
SMutexResult unlock(T tid, T to = (T)free_value)
|
||||
{
|
||||
if (Emu.IsStopped())
|
||||
{
|
||||
return SMR_ABORT;
|
||||
}
|
||||
T old = tid;
|
||||
|
||||
if (!owner.compare_exchange_strong(old, to))
|
||||
{
|
||||
if (old == (T)free_value)
|
||||
{
|
||||
return SMR_FAILED;
|
||||
}
|
||||
if (old == (T)dead_value)
|
||||
{
|
||||
return SMR_DESTROYED;
|
||||
}
|
||||
|
||||
return SMR_PERMITTED;
|
||||
}
|
||||
|
||||
return SMR_OK;
|
||||
}
|
||||
|
||||
SMutexResult lock(T tid, u64 timeout = 0)
|
||||
{
|
||||
u64 counter = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
switch (SMutexResult res = trylock(tid))
|
||||
{
|
||||
case SMR_FAILED: break;
|
||||
default: return res;
|
||||
}
|
||||
|
||||
if (wait) wait();
|
||||
|
||||
if (timeout && counter++ > timeout)
|
||||
{
|
||||
return SMR_TIMEOUT;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename Tid, Tid (get_tid)()>
|
||||
class SMutexLockerBase
|
||||
{
|
||||
T& sm;
|
||||
public:
|
||||
const Tid tid;
|
||||
|
||||
__forceinline SMutexLockerBase(T& _sm)
|
||||
: sm(_sm)
|
||||
, tid(get_tid())
|
||||
{
|
||||
if (!tid)
|
||||
{
|
||||
if (!Emu.IsStopped())
|
||||
{
|
||||
LOG_ERROR(HLE, "SMutexLockerBase: thread id == 0");
|
||||
Emu.Pause();
|
||||
}
|
||||
return;
|
||||
}
|
||||
sm.lock(tid);
|
||||
}
|
||||
|
||||
__forceinline ~SMutexLockerBase()
|
||||
{
|
||||
if (tid) sm.unlock(tid);
|
||||
}
|
||||
};
|
||||
|
||||
typedef SMutexBase<size_t>
|
||||
SMutexGeneral;
|
||||
typedef SMutexBase<u32>
|
||||
SMutex;
|
||||
typedef SMutexBase<be_t<u32>>
|
||||
SMutexBE;
|
||||
|
||||
typedef SMutexLockerBase<SMutexGeneral, size_t, SM_GetCurrentThreadId>
|
||||
SMutexGeneralLocker;
|
||||
typedef SMutexLockerBase<SMutex, u32, SM_GetCurrentCPUThreadId>
|
||||
SMutexLocker;
|
||||
typedef SMutexLockerBase<SMutexBE, be_t<u32>, SM_GetCurrentCPUThreadIdBE>
|
||||
SMutexBELocker;
|
||||
@@ -1,139 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
template<typename T, u32 SQSize = 666>
|
||||
class SQueue
|
||||
{
|
||||
std::mutex m_mutex;
|
||||
NamedThreadBase* push_waiter;
|
||||
NamedThreadBase* pop_waiter;
|
||||
u32 m_pos;
|
||||
u32 m_count;
|
||||
T m_data[SQSize];
|
||||
|
||||
public:
|
||||
SQueue()
|
||||
: m_pos(0)
|
||||
, m_count(0)
|
||||
, push_waiter(nullptr)
|
||||
, pop_waiter(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
const u32 GetSize() const
|
||||
{
|
||||
return SQSize;
|
||||
}
|
||||
|
||||
bool Push(const T& data)
|
||||
{
|
||||
NamedThreadBase* t = GetCurrentNamedThread();
|
||||
push_waiter = t;
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (m_count >= SQSize)
|
||||
{
|
||||
if (Emu.IsStopped())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SM_Sleep();
|
||||
continue;
|
||||
}
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
||||
if (m_count >= SQSize) continue;
|
||||
if (pop_waiter && !m_count) pop_waiter->Notify();
|
||||
|
||||
m_data[(m_pos + m_count++) % SQSize] = data;
|
||||
|
||||
push_waiter = nullptr;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Pop(T& data)
|
||||
{
|
||||
NamedThreadBase* t = GetCurrentNamedThread();
|
||||
pop_waiter = t;
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (!m_count)
|
||||
{
|
||||
if (Emu.IsStopped())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SM_Sleep();
|
||||
continue;
|
||||
}
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
||||
if (!m_count) continue;
|
||||
if (push_waiter && m_count >= SQSize) push_waiter->Notify();
|
||||
|
||||
data = m_data[m_pos];
|
||||
m_pos = (m_pos + 1) % SQSize;
|
||||
m_count--;
|
||||
|
||||
pop_waiter = nullptr;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
volatile u32 GetCount() // may be thread unsafe
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
volatile bool IsEmpty() // may be thread unsafe
|
||||
{
|
||||
return !m_count;
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if (push_waiter && m_count >= SQSize) push_waiter->Notify();
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
T& Peek(u32 pos = 0)
|
||||
{
|
||||
NamedThreadBase* t = GetCurrentNamedThread();
|
||||
pop_waiter = t;
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (!m_count)
|
||||
{
|
||||
if (Emu.IsStopped())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
SM_Sleep();
|
||||
continue;
|
||||
}
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if (m_count)
|
||||
{
|
||||
pop_waiter = nullptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return m_data[(m_pos + pos) % SQSize];
|
||||
}
|
||||
};
|
||||
@@ -1,87 +0,0 @@
|
||||
#include "stdafx.h"
|
||||
#include "Utilities/SSemaphore.h"
|
||||
|
||||
void SSemaphore::wait()
|
||||
{
|
||||
u32 order;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if (m_count && m_out_order == m_in_order)
|
||||
{
|
||||
m_count--;
|
||||
return;
|
||||
}
|
||||
order = m_in_order++;
|
||||
}
|
||||
|
||||
std::unique_lock<std::mutex> cv_lock(m_cv_mutex);
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (Emu.IsStopped())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_cond.wait_for(cv_lock, std::chrono::milliseconds(1));
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if (m_count)
|
||||
{
|
||||
if (m_out_order == order)
|
||||
{
|
||||
m_count--;
|
||||
m_out_order++;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_cond.notify_one();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SSemaphore::try_wait()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
||||
if (m_count && m_in_order == m_out_order)
|
||||
{
|
||||
m_count--;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void SSemaphore::post()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
||||
if (m_count < m_max)
|
||||
{
|
||||
m_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_cond.notify_one();
|
||||
}
|
||||
|
||||
bool SSemaphore::post_and_wait()
|
||||
{
|
||||
// TODO: merge these functions? Probably has a race condition.
|
||||
if (try_wait()) return false;
|
||||
|
||||
post();
|
||||
wait();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
class SSemaphore
|
||||
{
|
||||
const u32 m_max;
|
||||
u32 m_count;
|
||||
u32 m_in_order;
|
||||
u32 m_out_order;
|
||||
std::mutex m_cv_mutex;
|
||||
std::mutex m_mutex;
|
||||
std::condition_variable m_cond;
|
||||
|
||||
public:
|
||||
SSemaphore(u32 value, u32 max = 1)
|
||||
: m_max(max > 0 ? max : 0xffffffff)
|
||||
, m_count(value > m_max ? m_max : value)
|
||||
, m_in_order(0)
|
||||
, m_out_order(0)
|
||||
{
|
||||
}
|
||||
|
||||
SSemaphore()
|
||||
: m_max(0xffffffff)
|
||||
, m_count(0)
|
||||
, m_in_order(0)
|
||||
, m_out_order(0)
|
||||
{
|
||||
}
|
||||
|
||||
~SSemaphore()
|
||||
{
|
||||
}
|
||||
|
||||
void wait();
|
||||
|
||||
bool try_wait();
|
||||
|
||||
void post();
|
||||
|
||||
bool post_and_wait();
|
||||
};
|
||||
@@ -0,0 +1,90 @@
|
||||
#include "Utilities/Semaphore.h"
|
||||
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
struct benaphore::internal
|
||||
{
|
||||
std::mutex mutex;
|
||||
|
||||
std::size_t acq_order{};
|
||||
std::size_t rel_order{};
|
||||
|
||||
std::condition_variable cond;
|
||||
};
|
||||
|
||||
void benaphore::wait_hard()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
// Notify non-zero waiter queue size
|
||||
if (m_value.exchange(-1) == 1)
|
||||
{
|
||||
// Return immediately (acquired)
|
||||
m_value = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// Remember the order
|
||||
const std::size_t order = ++m_data->acq_order;
|
||||
|
||||
// Wait for the appropriate rel_order (TODO)
|
||||
while (m_data->rel_order < order)
|
||||
{
|
||||
m_data->cond.wait(lock);
|
||||
}
|
||||
|
||||
if (order == m_data->acq_order && m_data->acq_order == m_data->rel_order)
|
||||
{
|
||||
// Cleaup
|
||||
m_data->acq_order = 0;
|
||||
m_data->rel_order = 0;
|
||||
m_value.compare_and_swap(-1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void benaphore::post_hard()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
if (m_value.compare_and_swap(0, 1) != -1)
|
||||
{
|
||||
// Do nothing (released)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_data->acq_order == m_data->rel_order)
|
||||
{
|
||||
m_value = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
// Awake one thread
|
||||
m_data->rel_order += 1;
|
||||
|
||||
// Unlock and notify
|
||||
lock.unlock();
|
||||
m_data->cond.notify_one();
|
||||
}
|
||||
|
||||
void benaphore::initialize_once()
|
||||
{
|
||||
if (UNLIKELY(!m_data))
|
||||
{
|
||||
auto ptr = new benaphore::internal;
|
||||
|
||||
if (!m_data.compare_and_swap_test(nullptr, ptr))
|
||||
{
|
||||
delete ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
benaphore::~benaphore()
|
||||
{
|
||||
delete m_data;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
#include "Atomic.h"
|
||||
#include "Platform.h"
|
||||
|
||||
// Binary semaphore
|
||||
class benaphore
|
||||
{
|
||||
struct internal;
|
||||
|
||||
// Reserved value (-1) enforces *_hard() calls
|
||||
atomic_t<u32> m_value{};
|
||||
|
||||
atomic_t<internal*> m_data{};
|
||||
|
||||
void wait_hard();
|
||||
void post_hard();
|
||||
|
||||
public:
|
||||
constexpr benaphore() = default;
|
||||
|
||||
~benaphore();
|
||||
|
||||
// Initialize internal data
|
||||
void initialize_once();
|
||||
|
||||
void wait()
|
||||
{
|
||||
if (UNLIKELY(!m_value.compare_and_swap_test(1, 0)))
|
||||
{
|
||||
wait_hard();
|
||||
}
|
||||
}
|
||||
|
||||
bool try_wait()
|
||||
{
|
||||
return m_value.compare_and_swap_test(1, 0);
|
||||
}
|
||||
|
||||
void post()
|
||||
{
|
||||
if (UNLIKELY(!m_value.compare_and_swap_test(0, 1)))
|
||||
{
|
||||
post_hard();
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,187 @@
|
||||
#include "SharedMutex.h"
|
||||
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
struct shared_mutex::internal
|
||||
{
|
||||
std::mutex mutex;
|
||||
|
||||
std::size_t rq_size{}; // Reader queue size (threads waiting on m_rcv)
|
||||
std::size_t wq_size{}; // Writer queue size (threads waiting on m_wcv and m_ocv)
|
||||
|
||||
std::condition_variable rcv; // Reader queue
|
||||
std::condition_variable wcv; // Writer queue
|
||||
std::condition_variable ocv; // For current exclusive owner
|
||||
};
|
||||
|
||||
void shared_mutex::lock_shared_hard()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
// Validate
|
||||
if ((m_ctrl & SM_INVALID_BIT) != 0) throw std::runtime_error("shared_mutex::lock_shared(): Invalid bit");
|
||||
if ((m_ctrl & SM_READER_MASK) == 0) throw std::runtime_error("shared_mutex::lock_shared(): No readers");
|
||||
|
||||
// Notify non-zero reader queue size
|
||||
m_ctrl |= SM_WAITERS_BIT, m_data->rq_size++;
|
||||
|
||||
// Fix excess reader count
|
||||
if ((--m_ctrl & SM_READER_MASK) == 0 && m_data->wq_size)
|
||||
{
|
||||
// Notify exclusive owner
|
||||
m_data->ocv.notify_one();
|
||||
}
|
||||
|
||||
// Obtain the reader lock
|
||||
while (true)
|
||||
{
|
||||
const auto ctrl = m_ctrl.load();
|
||||
|
||||
// Check writers and reader limit
|
||||
if (m_data->wq_size || (ctrl & ~SM_WAITERS_BIT) >= SM_READER_MAX)
|
||||
{
|
||||
m_data->rcv.wait(lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (m_ctrl.compare_and_swap_test(ctrl, ctrl + 1))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!--m_data->rq_size && !m_data->wq_size)
|
||||
{
|
||||
m_ctrl &= ~SM_WAITERS_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
void shared_mutex::unlock_shared_notify()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
if ((m_ctrl & SM_READER_MASK) == 0 && m_data->wq_size)
|
||||
{
|
||||
// Notify exclusive owner
|
||||
lock.unlock();
|
||||
m_data->ocv.notify_one();
|
||||
}
|
||||
else if (m_data->rq_size)
|
||||
{
|
||||
// Notify other readers
|
||||
lock.unlock();
|
||||
m_data->rcv.notify_one();
|
||||
}
|
||||
}
|
||||
|
||||
void shared_mutex::lock_hard()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
// Validate
|
||||
if ((m_ctrl & SM_INVALID_BIT) != 0) throw std::runtime_error("shared_mutex::lock(): Invalid bit");
|
||||
|
||||
// Notify non-zero writer queue size
|
||||
m_ctrl |= SM_WAITERS_BIT, m_data->wq_size++;
|
||||
|
||||
// Obtain the writer lock
|
||||
while (true)
|
||||
{
|
||||
const auto ctrl = m_ctrl.load();
|
||||
|
||||
if (ctrl & SM_WRITER_LOCK)
|
||||
{
|
||||
m_data->wcv.wait(lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (m_ctrl.compare_and_swap_test(ctrl, ctrl | SM_WRITER_LOCK))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for remaining readers
|
||||
while ((m_ctrl & SM_READER_MASK) != 0)
|
||||
{
|
||||
m_data->ocv.wait(lock);
|
||||
}
|
||||
|
||||
if (!--m_data->wq_size && !m_data->rq_size)
|
||||
{
|
||||
m_ctrl &= ~SM_WAITERS_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
void shared_mutex::unlock_notify()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
if (m_data->wq_size)
|
||||
{
|
||||
// Notify next exclusive owner
|
||||
lock.unlock();
|
||||
m_data->wcv.notify_one();
|
||||
}
|
||||
else if (m_data->rq_size)
|
||||
{
|
||||
// Notify all readers
|
||||
lock.unlock();
|
||||
m_data->rcv.notify_all();
|
||||
}
|
||||
}
|
||||
|
||||
void shared_mutex::lock_upgrade_hard()
|
||||
{
|
||||
unlock_shared();
|
||||
lock();
|
||||
}
|
||||
|
||||
void shared_mutex::lock_degrade_hard()
|
||||
{
|
||||
initialize_once();
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_data->mutex);
|
||||
|
||||
m_ctrl -= SM_WRITER_LOCK - 1;
|
||||
|
||||
if (m_data->rq_size)
|
||||
{
|
||||
// Notify all readers
|
||||
lock.unlock();
|
||||
m_data->rcv.notify_all();
|
||||
}
|
||||
else if (m_data->wq_size)
|
||||
{
|
||||
// Notify next exclusive owner
|
||||
lock.unlock();
|
||||
m_data->wcv.notify_one();
|
||||
}
|
||||
}
|
||||
|
||||
void shared_mutex::initialize_once()
|
||||
{
|
||||
if (UNLIKELY(!m_data))
|
||||
{
|
||||
auto ptr = new shared_mutex::internal;
|
||||
|
||||
if (!m_data.compare_and_swap_test(nullptr, ptr))
|
||||
{
|
||||
delete ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shared_mutex::~shared_mutex()
|
||||
{
|
||||
delete m_data;
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
#include "Atomic.h"
|
||||
#include "Platform.h"
|
||||
|
||||
//! An attempt to create effective implementation of "shared mutex", lock-free in optimistic case.
|
||||
//! All locking and unlocking may be done by a single LOCK XADD or LOCK CMPXCHG instruction.
|
||||
//! MSVC implementation of std::shared_timed_mutex seems suboptimal.
|
||||
//! std::shared_mutex is not available until C++17.
|
||||
class shared_mutex final
|
||||
{
|
||||
enum : u32
|
||||
{
|
||||
SM_WRITER_LOCK = 1u << 31, // Exclusive lock flag, must be MSB
|
||||
SM_WAITERS_BIT = 1u << 30, // Flag set if m_wq_size or m_rq_size is non-zero
|
||||
SM_INVALID_BIT = 1u << 29, // Unreachable reader count bit (may be set by incorrect unlock_shared() call)
|
||||
|
||||
SM_READER_MASK = SM_WAITERS_BIT - 1, // Valid reader count bit mask
|
||||
SM_READER_MAX = 1u << 24, // Max reader count
|
||||
};
|
||||
|
||||
atomic_t<u32> m_ctrl{}; // Control variable: reader count | SM_* flags
|
||||
|
||||
struct internal;
|
||||
|
||||
atomic_t<internal*> m_data{}; // Internal data
|
||||
|
||||
void lock_shared_hard();
|
||||
void unlock_shared_notify();
|
||||
|
||||
void lock_hard();
|
||||
void unlock_notify();
|
||||
|
||||
void lock_upgrade_hard();
|
||||
void lock_degrade_hard();
|
||||
|
||||
public:
|
||||
constexpr shared_mutex() = default;
|
||||
|
||||
// Initialize internal data
|
||||
void initialize_once();
|
||||
|
||||
~shared_mutex();
|
||||
|
||||
bool try_lock_shared()
|
||||
{
|
||||
const u32 ctrl = m_ctrl.load();
|
||||
|
||||
return ctrl < SM_READER_MAX && m_ctrl.compare_and_swap_test(ctrl, ctrl + 1);
|
||||
}
|
||||
|
||||
void lock_shared()
|
||||
{
|
||||
// Optimization: unconditional increment, compensated later
|
||||
if (UNLIKELY(m_ctrl++ >= SM_READER_MAX))
|
||||
{
|
||||
lock_shared_hard();
|
||||
}
|
||||
}
|
||||
|
||||
void unlock_shared()
|
||||
{
|
||||
if (UNLIKELY(m_ctrl-- >= SM_READER_MAX))
|
||||
{
|
||||
unlock_shared_notify();
|
||||
}
|
||||
}
|
||||
|
||||
bool try_lock()
|
||||
{
|
||||
return !m_ctrl && m_ctrl.compare_and_swap_test(0, SM_WRITER_LOCK);
|
||||
}
|
||||
|
||||
void lock()
|
||||
{
|
||||
if (UNLIKELY(!m_ctrl.compare_and_swap_test(0, SM_WRITER_LOCK)))
|
||||
{
|
||||
lock_hard();
|
||||
}
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
m_ctrl &= ~SM_WRITER_LOCK;
|
||||
|
||||
if (UNLIKELY(m_ctrl))
|
||||
{
|
||||
unlock_notify();
|
||||
}
|
||||
}
|
||||
|
||||
bool try_lock_upgrade()
|
||||
{
|
||||
return m_ctrl == 1 && m_ctrl.compare_and_swap_test(1, SM_WRITER_LOCK);
|
||||
}
|
||||
|
||||
bool try_lock_degrade()
|
||||
{
|
||||
return m_ctrl == SM_WRITER_LOCK && m_ctrl.compare_and_swap_test(SM_WRITER_LOCK, 1);
|
||||
}
|
||||
|
||||
void lock_upgrade()
|
||||
{
|
||||
if (UNLIKELY(!m_ctrl.compare_and_swap_test(1, SM_WRITER_LOCK)))
|
||||
{
|
||||
lock_upgrade_hard();
|
||||
}
|
||||
}
|
||||
|
||||
void lock_degrade()
|
||||
{
|
||||
if (UNLIKELY(!m_ctrl.compare_and_swap_test(SM_WRITER_LOCK, 1)))
|
||||
{
|
||||
lock_degrade_hard();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//! Simplified shared (reader) lock implementation.
|
||||
//! std::shared_lock may be used instead if necessary.
|
||||
class reader_lock final
|
||||
{
|
||||
shared_mutex& m_mutex;
|
||||
|
||||
public:
|
||||
reader_lock(const reader_lock&) = delete;
|
||||
|
||||
reader_lock(shared_mutex& mutex)
|
||||
: m_mutex(mutex)
|
||||
{
|
||||
m_mutex.lock_shared();
|
||||
}
|
||||
|
||||
~reader_lock()
|
||||
{
|
||||
m_mutex.unlock_shared();
|
||||
}
|
||||
};
|
||||
|
||||
//! Simplified exclusive (writer) lock implementation.
|
||||
//! std::lock_guard may or std::unique_lock be used instead if necessary.
|
||||
class writer_lock final
|
||||
{
|
||||
shared_mutex& m_mutex;
|
||||
|
||||
public:
|
||||
writer_lock(const writer_lock&) = delete;
|
||||
|
||||
writer_lock(shared_mutex& mutex)
|
||||
: m_mutex(mutex)
|
||||
{
|
||||
m_mutex.lock();
|
||||
}
|
||||
|
||||
~writer_lock()
|
||||
{
|
||||
m_mutex.unlock();
|
||||
}
|
||||
};
|
||||
|
||||
// Exclusive (writer) lock in the scope of shared (reader) lock.
|
||||
class upgraded_lock final
|
||||
{
|
||||
shared_mutex& m_mutex;
|
||||
|
||||
public:
|
||||
upgraded_lock(const writer_lock&) = delete;
|
||||
|
||||
upgraded_lock(shared_mutex& mutex)
|
||||
: m_mutex(mutex)
|
||||
{
|
||||
m_mutex.lock_upgrade();
|
||||
}
|
||||
|
||||
~upgraded_lock()
|
||||
{
|
||||
m_mutex.lock_degrade();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,85 @@
|
||||
#pragma once
|
||||
|
||||
#include <deque>
|
||||
|
||||
// Tag used in sleep_entry<> constructor
|
||||
static struct defer_sleep_tag {} constexpr defer_sleep{};
|
||||
|
||||
// Define sleep queue as std::deque with T* pointers, T - thread type
|
||||
template<typename T> using sleep_queue = std::deque<T*>;
|
||||
|
||||
// Automatic object handling a thread pointer (T*) in the sleep queue
|
||||
// Sleep is called in the constructor (if not null)
|
||||
// Awake is called in the destructor (if not null)
|
||||
// Sleep queue is actually std::deque with pointers, be careful about the lifetime
|
||||
template<typename T, void(T::*Sleep)() = &T::sleep, void(T::*Awake)() = &T::awake>
|
||||
class sleep_entry final
|
||||
{
|
||||
sleep_queue<T>& m_queue;
|
||||
T& m_thread;
|
||||
|
||||
public:
|
||||
// Constructor; enter() not called
|
||||
sleep_entry(sleep_queue<T>& queue, T& entry, const defer_sleep_tag&)
|
||||
: m_queue(queue)
|
||||
, m_thread(entry)
|
||||
{
|
||||
if (Sleep) (m_thread.*Sleep)();
|
||||
}
|
||||
|
||||
// Constructor; calls enter()
|
||||
sleep_entry(sleep_queue<T>& queue, T& entry)
|
||||
: sleep_entry(queue, entry, defer_sleep)
|
||||
{
|
||||
enter();
|
||||
}
|
||||
|
||||
// Destructor; calls leave()
|
||||
~sleep_entry()
|
||||
{
|
||||
leave();
|
||||
if (Awake) (m_thread.*Awake)();
|
||||
}
|
||||
|
||||
// Add thread to the sleep queue
|
||||
void enter()
|
||||
{
|
||||
for (auto t : m_queue)
|
||||
{
|
||||
if (t == &m_thread)
|
||||
{
|
||||
// Already exists, is it an error?
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_queue.emplace_back(&m_thread);
|
||||
}
|
||||
|
||||
// Remove thread from the sleep queue
|
||||
void leave()
|
||||
{
|
||||
for (auto it = m_queue.begin(), end = m_queue.end(); it != end; it++)
|
||||
{
|
||||
if (*it == &m_thread)
|
||||
{
|
||||
m_queue.erase(it);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check whether the thread exists in the sleep queue
|
||||
explicit operator bool() const
|
||||
{
|
||||
for (auto it = m_queue.begin(), end = m_queue.end(); it != end; it++)
|
||||
{
|
||||
if (*it == &m_thread)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
+141
-90
@@ -1,37 +1,76 @@
|
||||
#include "stdafx.h"
|
||||
#include "StrFmt.h"
|
||||
#include "BEType.h"
|
||||
#include "StrUtil.h"
|
||||
|
||||
extern const std::string fmt::placeholder = "???";
|
||||
#include <cassert>
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
//wrapper to deal with advance sprintf formating options with automatic length finding
|
||||
//can't take strings by reference because of "va_start", so overload it with char *
|
||||
std::string fmt::FormatV(const char *fmt, va_list args)
|
||||
std::string v128::to_hex() const
|
||||
{
|
||||
size_t length = 256;
|
||||
std::string str;
|
||||
return fmt::format("%016llx%016llx", _u64[1], _u64[0]);
|
||||
}
|
||||
|
||||
for (;;)
|
||||
std::string v128::to_xyzw() const
|
||||
{
|
||||
return fmt::format("x: %g y: %g z: %g w: %g", _f[3], _f[2], _f[1], _f[0]);
|
||||
}
|
||||
|
||||
std::string fmt::unsafe_vformat(const char* fmt, va_list _args) noexcept
|
||||
{
|
||||
// Fixed stack buffer for the first attempt
|
||||
std::array<char, 4096> fixed_buf;
|
||||
|
||||
// Possibly dynamically allocated buffer for the second attempt
|
||||
std::unique_ptr<char[]> buf;
|
||||
|
||||
// Pointer to the current buffer
|
||||
char* buf_addr = fixed_buf.data();
|
||||
|
||||
for (std::size_t buf_size = fixed_buf.size();;)
|
||||
{
|
||||
std::vector<char> buffptr(length);
|
||||
size_t printlen = vsnprintf(buffptr.data(), length, fmt, args);
|
||||
if (printlen < length)
|
||||
va_list args;
|
||||
va_copy(args, _args);
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
const std::size_t len = std::vsnprintf(buf_addr, buf_size, fmt, args);
|
||||
#ifndef _MSC_VER
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(args);
|
||||
|
||||
assert(len <= INT_MAX);
|
||||
|
||||
if (len < buf_size)
|
||||
{
|
||||
str = std::string(buffptr.data(), printlen);
|
||||
break;
|
||||
return{ buf_addr, len };
|
||||
}
|
||||
length *= 2;
|
||||
|
||||
buf.reset(buf_addr = new char[buf_size = len + 1]);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
std::string fmt::FormatV(std::string fmt, va_list args)
|
||||
std::string fmt::unsafe_format(const char* fmt...) noexcept
|
||||
{
|
||||
std::string str = FormatV(fmt.c_str(), args);
|
||||
return str;
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
auto result = unsafe_vformat(fmt, args);
|
||||
va_end(args);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::string replace_first(const std::string& src, const std::string& from, const std::string& to)
|
||||
fmt::exception_base::exception_base(const char* fmt...)
|
||||
: std::runtime_error((va_start(m_args, fmt), unsafe_vformat(fmt, m_args)))
|
||||
{
|
||||
va_end(m_args);
|
||||
}
|
||||
|
||||
std::string fmt::replace_first(const std::string& src, const std::string& from, const std::string& to)
|
||||
{
|
||||
auto pos = src.find(from);
|
||||
|
||||
@@ -43,90 +82,102 @@ std::string replace_first(const std::string& src, const std::string& from, const
|
||||
return (pos ? src.substr(0, pos) + to : to) + std::string(src.c_str() + pos + from.length());
|
||||
}
|
||||
|
||||
std::string replace_all(std::string src, const std::string& from, const std::string& to)
|
||||
std::string fmt::replace_all(const std::string &src, const std::string& from, const std::string& to)
|
||||
{
|
||||
for (auto pos = src.find(from); pos != std::string::npos; src.find(from, pos + 1))
|
||||
std::string target = src;
|
||||
for (auto pos = target.find(from); pos != std::string::npos; pos = target.find(from, pos + 1))
|
||||
{
|
||||
src = (pos ? src.substr(0, pos) + to : to) + std::string(src.c_str() + pos + from.length());
|
||||
target = (pos ? target.substr(0, pos) + to : to) + std::string(target.c_str() + pos + from.length());
|
||||
pos += to.length();
|
||||
}
|
||||
|
||||
return src;
|
||||
return target;
|
||||
}
|
||||
|
||||
//TODO: move this wx Stuff somewhere else
|
||||
//convert a wxString to a std::string encoded in utf8
|
||||
//CAUTION, only use this to interface with wxWidgets classes
|
||||
std::string fmt::ToUTF8(const wxString& right)
|
||||
std::vector<std::string> fmt::split(const std::string& source, std::initializer_list<std::string> separators, bool is_skip_empty)
|
||||
{
|
||||
auto ret = std::string(((const char *)right.utf8_str()));
|
||||
return ret;
|
||||
}
|
||||
std::vector<std::string> result;
|
||||
|
||||
//convert a std::string encoded in utf8 to a wxString
|
||||
//CAUTION, only use this to interface with wxWidgets classes
|
||||
wxString fmt::FromUTF8(const std::string& right)
|
||||
{
|
||||
auto ret = wxString::FromUTF8(right.c_str());
|
||||
return ret;
|
||||
}
|
||||
size_t cursor_begin = 0;
|
||||
|
||||
//TODO: remove this after every snippet that uses it is gone
|
||||
//WARNING: not fully compatible with CmpNoCase from wxString
|
||||
int fmt::CmpNoCase(const std::string& a, const std::string& b)
|
||||
{
|
||||
if (a.length() != b.length())
|
||||
for (size_t cursor_end = 0; cursor_end < source.length(); ++cursor_end)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::equal(a.begin(),
|
||||
a.end(),
|
||||
b.begin(),
|
||||
[](const char& a, const char& b){return tolower(a) == tolower(b); })
|
||||
? 0 : -1;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: remove this after every snippet that uses it is gone
|
||||
//WARNING: not fully compatible with CmpNoCase from wxString
|
||||
void fmt::Replace(std::string &str, const std::string &searchterm, const std::string& replaceterm)
|
||||
{
|
||||
size_t cursor = 0;
|
||||
do
|
||||
{
|
||||
cursor = str.find(searchterm, cursor);
|
||||
if (cursor != std::string::npos)
|
||||
for (auto &separator : separators)
|
||||
{
|
||||
str.replace(cursor, searchterm.size(), replaceterm);
|
||||
cursor += replaceterm.size();
|
||||
if (strncmp(source.c_str() + cursor_end, separator.c_str(), separator.length()) == 0)
|
||||
{
|
||||
std::string candidate = source.substr(cursor_begin, cursor_end - cursor_begin);
|
||||
if (!is_skip_empty || !candidate.empty())
|
||||
result.push_back(candidate);
|
||||
|
||||
cursor_begin = cursor_end + separator.length();
|
||||
cursor_end = cursor_begin - 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
}
|
||||
|
||||
if (cursor_begin != source.length())
|
||||
{
|
||||
result.push_back(source.substr(cursor_begin));
|
||||
}
|
||||
|
||||
return std::move(result);
|
||||
}
|
||||
|
||||
std::string fmt::trim(const std::string& source, const std::string& values)
|
||||
{
|
||||
std::size_t begin = source.find_first_not_of(values);
|
||||
|
||||
if (begin == source.npos)
|
||||
return{};
|
||||
|
||||
return source.substr(begin, source.find_last_not_of(values) + 1);
|
||||
}
|
||||
|
||||
std::string fmt::to_upper(const std::string& string)
|
||||
{
|
||||
std::string result;
|
||||
result.resize(string.size());
|
||||
std::transform(string.begin(), string.end(), result.begin(), ::toupper);
|
||||
return result;
|
||||
}
|
||||
|
||||
bool fmt::match(const std::string &source, const std::string &mask)
|
||||
{
|
||||
std::size_t source_position = 0, mask_position = 0;
|
||||
|
||||
for (; source_position < source.size() && mask_position < mask.size(); ++mask_position, ++source_position)
|
||||
{
|
||||
switch (mask[mask_position])
|
||||
{
|
||||
case '?': break;
|
||||
|
||||
case '*':
|
||||
for (std::size_t test_source_position = source_position; test_source_position < source.size(); ++test_source_position)
|
||||
{
|
||||
if (match(source.substr(test_source_position), mask.substr(mask_position + 1)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
default:
|
||||
if (source[source_position] != mask[mask_position])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string> fmt::rSplit(const std::string& source, const std::string& delim)
|
||||
{
|
||||
std::vector<std::string> ret;
|
||||
size_t cursor = 0;
|
||||
do
|
||||
{
|
||||
size_t prevcurs = cursor;
|
||||
cursor = source.find(delim, cursor);
|
||||
if (cursor != std::string::npos)
|
||||
{
|
||||
ret.push_back(source.substr(prevcurs,cursor-prevcurs));
|
||||
cursor += delim.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.push_back(source.substr(prevcurs));
|
||||
break;
|
||||
}
|
||||
} while (true);
|
||||
return ret;
|
||||
}
|
||||
if (source_position != source.size())
|
||||
return false;
|
||||
|
||||
if (mask_position != mask.size())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user