Compare commits
576
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02b186de3c | ||
|
|
8b3ef6ae9e | ||
|
|
22bb394214 | ||
|
|
b777c47370 | ||
|
|
1b9ca6408f | ||
|
|
df578c6bbc | ||
|
|
c69404e432 | ||
|
|
cf5ddffbfb | ||
|
|
2086e3c932 | ||
|
|
c78b9efb87 | ||
|
|
9aa8050c3c | ||
|
|
2072e1d82c | ||
|
|
75c1985ec9 | ||
|
|
8b64f41042 | ||
|
|
b44b2b31de | ||
|
|
57434bc985 | ||
|
|
84eea021f6 | ||
|
|
fae3ee95d1 | ||
|
|
a0e513862a | ||
|
|
a273ab358f | ||
|
|
8e901cc609 | ||
|
|
8e5972026d | ||
|
|
5d9e78992f | ||
|
|
ddb4629dec | ||
|
|
e5896971a9 | ||
|
|
fc745334da | ||
|
|
c98f29afcd | ||
|
|
a2c60a3a46 | ||
|
|
3cc39c7d25 | ||
|
|
92ec8d2c46 | ||
|
|
c3f0336f1a | ||
|
|
4fd1a8cd6c | ||
|
|
40e4129229 | ||
|
|
f2df83c304 | ||
|
|
bd7a2416d4 | ||
|
|
e269c9a6e0 | ||
|
|
93d0b3cb33 | ||
|
|
185ecc48ba | ||
|
|
e3beb85592 | ||
|
|
4027e3d66e | ||
|
|
8897a22033 | ||
|
|
893a03bed8 | ||
|
|
09b8ab83a0 | ||
|
|
91af0f5293 | ||
|
|
61a30b3e98 | ||
|
|
70b1593a18 | ||
|
|
bd16782e77 | ||
|
|
7f5538fe2c | ||
|
|
352e672e5b | ||
|
|
d3aaf4fe64 | ||
|
|
ae64b3c50c | ||
|
|
2dbc79024c | ||
|
|
4bdee3bd47 | ||
|
|
55258d0da9 | ||
|
|
e8f1f84f37 | ||
|
|
4e02cba85a | ||
|
|
ddaf9f42e3 | ||
|
|
dd34dc583b | ||
|
|
dc69e26dd5 | ||
|
|
592df88c88 | ||
|
|
3780d983a1 | ||
|
|
114db385da | ||
|
|
32dfc0e792 | ||
|
|
f564d35dca | ||
|
|
30a08a27c8 | ||
|
|
6f9ca0c05a | ||
|
|
747d029abc | ||
|
|
71a5f289cb | ||
|
|
1c5d8d1f57 | ||
|
|
0952c900f9 | ||
|
|
02478bd95f | ||
|
|
dd72d1f137 | ||
|
|
04f4dfba83 | ||
|
|
eab9aaaa7a | ||
|
|
e419f1c745 | ||
|
|
3b64696777 | ||
|
|
cf3c1923a5 | ||
|
|
86aa980c9c | ||
|
|
d3c8c640ce | ||
|
|
e3a9b1c1d9 | ||
|
|
e1944e98e5 | ||
|
|
176a3f3725 | ||
|
|
cb2ebfc840 | ||
|
|
7c108a5d9c | ||
|
|
796a07f3b8 | ||
|
|
345b74ef71 | ||
|
|
1c5a3bf382 | ||
|
|
d09c9a4f67 | ||
|
|
c7f7d6e737 | ||
|
|
f1c46db025 | ||
|
|
1f713afeee | ||
|
|
aa8dfc4f2a | ||
|
|
037aa886e5 | ||
|
|
ff78199ba9 | ||
|
|
29e764bac5 | ||
|
|
5f0432b338 | ||
|
|
b96fcf77a6 | ||
|
|
0cbfa274b2 | ||
|
|
edde9a605c | ||
|
|
4675f5b4bc | ||
|
|
3d45de107e | ||
|
|
ddc3d7a754 | ||
|
|
a25d824db4 | ||
|
|
5c1097e362 | ||
|
|
a02ae47d06 | ||
|
|
af240d55d4 | ||
|
|
c3219ccfd6 | ||
|
|
a948ff318e | ||
|
|
43329bd962 | ||
|
|
f91141ba9d | ||
|
|
559d7642c8 | ||
|
|
fc3f1d180f | ||
|
|
b3aead3529 | ||
|
|
08931d62b4 | ||
|
|
4fb969759e | ||
|
|
6f3f350daf | ||
|
|
178b816479 | ||
|
|
37c159260d | ||
|
|
5dddfa1fc0 | ||
|
|
759f8e59ee | ||
|
|
5bf378f89f | ||
|
|
372526723c | ||
|
|
2e576dbca8 | ||
|
|
4f6d0803b7 | ||
|
|
4e2546fe0c | ||
|
|
3b13980be2 | ||
|
|
90e84aa320 | ||
|
|
39b16cdd6c | ||
|
|
ac2e876b71 | ||
|
|
29dd88e5d9 | ||
|
|
ef3f85da9a | ||
|
|
cbe458cd8a | ||
|
|
166946c036 | ||
|
|
f6b627cb09 | ||
|
|
46371bbde9 | ||
|
|
dd0ac130d0 | ||
|
|
e4621ae7b3 | ||
|
|
1fceec9c6b | ||
|
|
9acc3af646 | ||
|
|
313af9a72a | ||
|
|
93b397cf81 | ||
|
|
cbda14ec8e | ||
|
|
62b95b4115 | ||
|
|
c2bc66e16d | ||
|
|
92ea3888c5 | ||
|
|
691cf1bcd1 | ||
|
|
556a326c4a | ||
|
|
3966b9f991 | ||
|
|
93549a75f2 | ||
|
|
8fc5038ecb | ||
|
|
c13dfc379c | ||
|
|
c391f89af5 | ||
|
|
c4a3cb3643 | ||
|
|
3917418d99 | ||
|
|
c7d1408aa9 | ||
|
|
8cd9a62f53 | ||
|
|
77fc6d05f7 | ||
|
|
c5f5777e08 | ||
|
|
ed5ad461d8 | ||
|
|
d3f37e7dfe | ||
|
|
952a86321c | ||
|
|
36b6043f93 | ||
|
|
6a43628236 | ||
|
|
a7cc7208d2 | ||
|
|
04a2340d2d | ||
|
|
1dc3f9d206 | ||
|
|
fed0143846 | ||
|
|
7885f4704f | ||
|
|
d7aea5d1a3 | ||
|
|
52406bf30f | ||
|
|
aaf0569678 | ||
|
|
b341d3cc50 | ||
|
|
8348da235c | ||
|
|
7ebe25fe55 | ||
|
|
d008d49eb3 | ||
|
|
188b8aeb1c | ||
|
|
286a197a80 | ||
|
|
6d238d412e | ||
|
|
584b2b5a1b | ||
|
|
786a33c2c7 | ||
|
|
5e1658e69b | ||
|
|
7b8f054f5f | ||
|
|
67964d1e15 | ||
|
|
135616d177 | ||
|
|
7ac379d34b | ||
|
|
a58117a3df | ||
|
|
528c470d06 | ||
|
|
4ab3f27e48 | ||
|
|
4b7328db67 | ||
|
|
6e7ab0d49b | ||
|
|
cbc4a347ee | ||
|
|
01b986c77d | ||
|
|
2ba65fe8b4 | ||
|
|
16fb13286c | ||
|
|
5a0c07d06e | ||
|
|
1f35dfe61e | ||
|
|
f60217a439 | ||
|
|
aba9a149eb | ||
|
|
ff943a30eb | ||
|
|
ef94a3b184 | ||
|
|
5f1033dfd7 | ||
|
|
e48a8f8d5c | ||
|
|
b91cb6535a | ||
|
|
9b728cba18 | ||
|
|
88eb8c998b | ||
|
|
316e0b4d03 | ||
|
|
dd7f12eb23 | ||
|
|
72406ff08d | ||
|
|
4f96110d5a | ||
|
|
d0e37dff19 | ||
|
|
8598155fcb | ||
|
|
462aafda79 | ||
|
|
c945c36a09 | ||
|
|
267da7d91d | ||
|
|
74ae3a5989 | ||
|
|
1db28418eb | ||
|
|
690104f408 | ||
|
|
4adbccaee1 | ||
|
|
22e17e7956 | ||
|
|
d130267347 | ||
|
|
1d4cf67d80 | ||
|
|
4d500e10d0 | ||
|
|
1d1899bb0e | ||
|
|
242b573c75 | ||
|
|
d21bec89dc | ||
|
|
d71b7417ad | ||
|
|
9329349461 | ||
|
|
40853821a1 | ||
|
|
f96095f6cf | ||
|
|
97b229964c | ||
|
|
5f54d98080 | ||
|
|
a96cb41408 | ||
|
|
a79ec33944 | ||
|
|
0c94550eaa | ||
|
|
92d689c3bd | ||
|
|
9437cd7867 | ||
|
|
76d8a5e3a5 | ||
|
|
71ac2add41 | ||
|
|
6a0b12dadb | ||
|
|
a05dc7a903 | ||
|
|
8b7c521f4d | ||
|
|
e2e0cb6d03 | ||
|
|
c4ab206580 | ||
|
|
f552aab859 | ||
|
|
28ccbc1d1f | ||
|
|
1e8591fdc4 | ||
|
|
f87af0c0c4 | ||
|
|
09f728eaca | ||
|
|
113550d523 | ||
|
|
304ddf8060 | ||
|
|
9ecd3d408f | ||
|
|
f8a1b1ef71 | ||
|
|
c97acb439d | ||
|
|
75133a8da7 | ||
|
|
11334b5e44 | ||
|
|
50a980f845 | ||
|
|
4b38fba44f | ||
|
|
8685b81ac2 | ||
|
|
79be73be68 | ||
|
|
2d7ae513ef | ||
|
|
5ff0edc2cc | ||
|
|
3c8f8ce6f0 | ||
|
|
a2cb6c08b1 | ||
|
|
a4bb1bcaf3 | ||
|
|
2b14bdf795 | ||
|
|
692d63e3b8 | ||
|
|
109c3f2591 | ||
|
|
ac56c2496d | ||
|
|
68d9753437 | ||
|
|
dcd6744424 | ||
|
|
5df8871827 | ||
|
|
748ace48cd | ||
|
|
8a13cb2b02 | ||
|
|
ecb6e7b07c | ||
|
|
5e6a0d260b | ||
|
|
18c2c3a992 | ||
|
|
5beb2c5367 | ||
|
|
b44248b200 | ||
|
|
f25319edbb | ||
|
|
26ada31fa1 | ||
|
|
7aa4136886 | ||
|
|
efa5176137 | ||
|
|
a065b5e3de | ||
|
|
5c2f8e80f9 | ||
|
|
9bb34dff3f | ||
|
|
40a3ef4c05 | ||
|
|
29a17e36bc | ||
|
|
3ed5f6e93d | ||
|
|
2148e41f6d | ||
|
|
b78b48204e | ||
|
|
74c3e68907 | ||
|
|
ed6db4b3ab | ||
|
|
16eb716fd5 | ||
|
|
caa3969681 | ||
|
|
ca4aec122b | ||
|
|
840df4dc46 | ||
|
|
930c3acb8e | ||
|
|
7d44132801 | ||
|
|
58724e5111 | ||
|
|
74ae698030 | ||
|
|
a692c44df7 | ||
|
|
79d056ce42 | ||
|
|
78135f5f82 | ||
|
|
269300808a | ||
|
|
c0197d2e39 | ||
|
|
700390df40 | ||
|
|
c6161d7c67 | ||
|
|
94fcd865c4 | ||
|
|
bd86b3781c | ||
|
|
785bed5625 | ||
|
|
7afbe2a787 | ||
|
|
47b2b52237 | ||
|
|
5768e86d61 | ||
|
|
667f4f477a | ||
|
|
b9f09a2580 | ||
|
|
880a3718ea | ||
|
|
6a8415f7d4 | ||
|
|
c884baa6c0 | ||
|
|
7d6410ba43 | ||
|
|
d8c33bdf8c | ||
|
|
a4705352e0 | ||
|
|
3a023b4404 | ||
|
|
c4849497e9 | ||
|
|
11686a8028 | ||
|
|
8a81dbb395 | ||
|
|
4853738770 | ||
|
|
52d61fd779 | ||
|
|
aba7d2d435 | ||
|
|
26f0ad1ea6 | ||
|
|
607db982d3 | ||
|
|
97d6750ef1 | ||
|
|
a76faad8b6 | ||
|
|
afbd819f02 | ||
|
|
b1d114a2d2 | ||
|
|
907afa0da6 | ||
|
|
60d4c610b7 | ||
|
|
d1264364a2 | ||
|
|
135f41d77e | ||
|
|
58c8d3a4f4 | ||
|
|
2f84be5e20 | ||
|
|
ae6b1a1269 | ||
|
|
a478a0ed64 | ||
|
|
3813556aa7 | ||
|
|
986dfb959d | ||
|
|
ced3af8a45 | ||
|
|
844c79b38a | ||
|
|
e8854bc324 | ||
|
|
ff9463cf2d | ||
|
|
cc48dc07f5 | ||
|
|
da8b764aa9 | ||
|
|
18ad210758 | ||
|
|
40d1089000 | ||
|
|
5e4bb9f3ea | ||
|
|
402eaf7877 | ||
|
|
8e395623d6 | ||
|
|
7f6945bd00 | ||
|
|
2e580072bb | ||
|
|
49cc7de94a | ||
|
|
57d4201cc7 | ||
|
|
251b127427 | ||
|
|
c33ecbef97 | ||
|
|
fe71e9da2a | ||
|
|
8c57afe1d5 | ||
|
|
4296ab3508 | ||
|
|
59f86855ff | ||
|
|
d855b3f12d | ||
|
|
60a93146da | ||
|
|
0c8caf63e1 | ||
|
|
485ff9884f | ||
|
|
18d4cc3c2c | ||
|
|
682aaf1b93 | ||
|
|
02abba7963 | ||
|
|
0cda152ee6 | ||
|
|
a984443642 | ||
|
|
937e5fa777 | ||
|
|
bee795bc93 | ||
|
|
eee04931e2 | ||
|
|
30e24e1329 | ||
|
|
fcff36445a | ||
|
|
f13a0a8524 | ||
|
|
1f7798d6c6 | ||
|
|
a24c8631bc | ||
|
|
187cb1a76e | ||
|
|
da7c454b2a | ||
|
|
c9c38d2163 | ||
|
|
7cb47d8626 | ||
|
|
5201109680 | ||
|
|
581b5d283f | ||
|
|
946952bb9a | ||
|
|
1f7c4382ad | ||
|
|
f012e748b3 | ||
|
|
3900d483c5 | ||
|
|
d57fae34ca | ||
|
|
decf44d08f | ||
|
|
090b2d9ba9 | ||
|
|
164ef42418 | ||
|
|
29cd46f613 | ||
|
|
2a7fb5e223 | ||
|
|
764638fa90 | ||
|
|
9b31b07ca4 | ||
|
|
e591925cac | ||
|
|
37615a0818 | ||
|
|
f9a34cb566 | ||
|
|
0794215a67 | ||
|
|
cb6f134b9d | ||
|
|
f9431666b0 | ||
|
|
27f67ff5a0 | ||
|
|
fb7384b193 | ||
|
|
1cdeab7ba9 | ||
|
|
e0f50ee14a | ||
|
|
5c3e7e2c9b | ||
|
|
961f0f1672 | ||
|
|
4ef947b3a8 | ||
|
|
1a2e3377db | ||
|
|
302ed4de71 | ||
|
|
ab720f8626 | ||
|
|
11148eb9d1 | ||
|
|
bf8b540a25 | ||
|
|
7a79af8344 | ||
|
|
419df1ab06 | ||
|
|
a824f1bfba | ||
|
|
8966156256 | ||
|
|
74d8adca6c | ||
|
|
7a98d2ff7f | ||
|
|
5421fb553f | ||
|
|
453fa6fe17 | ||
|
|
ffea83c8ce | ||
|
|
c447849d62 | ||
|
|
bdf1ac1e46 | ||
|
|
934c3369c0 | ||
|
|
cfd2ac4504 | ||
|
|
d4c861718d | ||
|
|
a82a02681c | ||
|
|
b9439f6d79 | ||
|
|
7090dc8e69 | ||
|
|
62cf2738de | ||
|
|
8bf1700ee9 | ||
|
|
c3c3c7ef5c | ||
|
|
a8a906ad36 | ||
|
|
5ddaa05159 | ||
|
|
2232aef43a | ||
|
|
9023a31284 | ||
|
|
69e479ea5e | ||
|
|
4c51bb6ea0 | ||
|
|
4778ac6540 | ||
|
|
221971480d | ||
|
|
de7a496feb | ||
|
|
3b473dd5d5 | ||
|
|
1f9a882ded | ||
|
|
355120cb88 | ||
|
|
ba9d6c236b | ||
|
|
0cbb234a75 | ||
|
|
af4304aa4b | ||
|
|
0a3de16d13 | ||
|
|
289c99a244 | ||
|
|
659ef6dd5d | ||
|
|
1b2491ccfa | ||
|
|
82ec5a0e45 | ||
|
|
5331ae5de8 | ||
|
|
c2b179f028 | ||
|
|
7fad116fa6 | ||
|
|
1ac05f2d24 | ||
|
|
ac497c2d12 | ||
|
|
8340096819 | ||
|
|
8ea30d58b1 | ||
|
|
915cfdf412 | ||
|
|
383aa1590f | ||
|
|
33b30ec98d | ||
|
|
8e4365eb53 | ||
|
|
fcc8895c50 | ||
|
|
d90e61f5ee | ||
|
|
cd17db1aad | ||
|
|
c04d4cf7d7 | ||
|
|
f85ecbe95b | ||
|
|
26c45ddc17 | ||
|
|
a759e477aa | ||
|
|
60d2343491 | ||
|
|
81869dbb43 | ||
|
|
d6b688717c | ||
|
|
e7f262e462 | ||
|
|
3ed0dc89d1 | ||
|
|
5a547f1339 | ||
|
|
59c23b4d71 | ||
|
|
2e5f5d4af8 | ||
|
|
56d06d12b6 | ||
|
|
47333303b4 | ||
|
|
bb35635fe8 | ||
|
|
6719224567 | ||
|
|
d74e2c4cd2 | ||
|
|
eac8ea3760 | ||
|
|
f77872a80d | ||
|
|
48dd8bfb26 | ||
|
|
f199c395d6 | ||
|
|
749333247a | ||
|
|
3f63706cb9 | ||
|
|
76416e8d3f | ||
|
|
aea0f0e022 | ||
|
|
569eda13ba | ||
|
|
02245e3687 | ||
|
|
a836f7e2c2 | ||
|
|
ffdc8810ca | ||
|
|
72b45d2da6 | ||
|
|
164c1f5cb5 | ||
|
|
e8b0bc9707 | ||
|
|
c917f93c31 | ||
|
|
705fa89d5f | ||
|
|
222c9ec5ab | ||
|
|
1aaa3d6397 | ||
|
|
aed29bc0a3 | ||
|
|
dd1dc87478 | ||
|
|
80e063d142 | ||
|
|
45d683a99f | ||
|
|
e8c0f17531 | ||
|
|
994ced175d | ||
|
|
5cbca7cda1 | ||
|
|
8c37463d43 | ||
|
|
829380a5e2 | ||
|
|
cd6f9d948e | ||
|
|
acc60e2c7a | ||
|
|
d84bb4a752 | ||
|
|
bb7daa4d23 | ||
|
|
19507f8928 | ||
|
|
3a3a2fc3d7 | ||
|
|
ff1c0c82d7 | ||
|
|
afdcc36534 | ||
|
|
cbe3270cdb | ||
|
|
c1aa9a7b44 | ||
|
|
e724f5bb70 | ||
|
|
35db16bb01 | ||
|
|
967a936dfb | ||
|
|
0a9cab3e63 | ||
|
|
fe9c13b754 | ||
|
|
d1e1353cf2 | ||
|
|
c247ea51aa | ||
|
|
9b149047a7 | ||
|
|
cdd121e4e6 | ||
|
|
1d50a18f31 | ||
|
|
331c7eda68 | ||
|
|
beb298fcac | ||
|
|
b3fed52898 | ||
|
|
7e8b5bc9d4 | ||
|
|
5f33747371 | ||
|
|
5e189c674d | ||
|
|
11fedeaad0 | ||
|
|
64a788cd22 | ||
|
|
9169920786 | ||
|
|
431995dd63 | ||
|
|
d813f6d97d | ||
|
|
f04f2f6864 | ||
|
|
dd0b4aa91e | ||
|
|
d57ab80d00 | ||
|
|
e1b176f437 | ||
|
|
fcb33c9246 | ||
|
|
e1ff3e3db8 | ||
|
|
f591ab1218 | ||
|
|
02ec97a7f7 | ||
|
|
5bc540d5c9 | ||
|
|
a7c6638c0c | ||
|
|
1c58340b32 | ||
|
|
08409f0044 | ||
|
|
0f90fc572b | ||
|
|
aa208d1e29 | ||
|
|
b5c16ef9cf | ||
|
|
4c3a5affa6 | ||
|
|
abe5adf7ec | ||
|
|
df8f9c8b21 | ||
|
|
45d2ce4bd6 | ||
|
|
3331695e53 | ||
|
|
422545d017 | ||
|
|
266a0c0cc3 | ||
|
|
c4b5143480 | ||
|
|
c910412ac2 | ||
|
|
b7e1c505b4 | ||
|
|
6b9a6c23f5 | ||
|
|
5862e8db76 | ||
|
|
480d8642db |
+33
-23
@@ -14,6 +14,7 @@ on:
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
@@ -26,6 +27,7 @@ on:
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
@@ -53,7 +55,7 @@ jobs:
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
@@ -65,19 +67,22 @@ jobs:
|
||||
matrix:
|
||||
# Only test unified builds (core+ax). weekly CI should test standalone
|
||||
config:
|
||||
- { image: '2023-clang15', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
- { image: '2023-clang15', cxx: 'g++', build: 'Release', cmake: '' }
|
||||
- { image: '2023-clang15', cxx: 'clang++', build: 'Debug', cmake: '' }
|
||||
- { image: '2022-clang11', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
- { image: '2022-clang11', cxx: 'g++', build: 'Release', cmake: '' }
|
||||
- { image: '2021-clang10', cxx: 'clang++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
- { image: '2021-clang10', cxx: 'g++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
- { image: '2026', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
- { image: '2026', cxx: 'g++', build: 'Release', cmake: '' }
|
||||
- { image: '2026', cxx: 'clang++', build: 'Debug', cmake: '' }
|
||||
- { image: '2025-clang19.1', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
- { image: '2024-clang16.2', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
# Needed to test LLVM 15.X
|
||||
- { image: '2023-clang15', cxx: 'clang++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: pybind11
|
||||
#if: contains(matrix.config.image, '2023') == false
|
||||
run: ./ci/install_pybind11.sh 2.10.0
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
# 2026 images are broken with gtest/glfw installs
|
||||
- name: deps
|
||||
if: contains(matrix.config.image, '2026')
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
@@ -94,12 +99,11 @@ jobs:
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components='core,python,bin,axcore,axbin,axtest'
|
||||
--components='core,python,axcore,axbin,axtest'
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
@@ -122,24 +126,30 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
#@note llvm10 never got its own brew formula...
|
||||
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '11' }
|
||||
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '12' }
|
||||
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '13' }
|
||||
- { runner: 'macos-15', cxx: 'clang++', build: 'Release', llvm: '21' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '21' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '20' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '19' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '18' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '17' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '16' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: ./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
run: |
|
||||
./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="core,python,bin,axcore,axbin,axtest"
|
||||
--components="core,python,axcore,axbin,axtest"
|
||||
--cargs=\"
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DLLVM_DIR=/usr/local/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
-DLLVM_DIR=/opt/homebrew/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
@@ -150,15 +160,15 @@ jobs:
|
||||
if: |
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.type == 'grammar'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2022-clang11
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: build
|
||||
run: ./ci/build.sh -v --components=axgr --target=openvdb_ax_grammar --cargs=\"-DOPENVDB_AX_GRAMMAR_NO_LINES=ON\"
|
||||
- name: upload grammar
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ax_grammar
|
||||
path: ./build/openvdb_ax/openvdb_ax/openvdb_ax/grammar
|
||||
|
||||
+46
-54
@@ -15,6 +15,7 @@ on:
|
||||
- 'openvdb_houdini/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'nanovdb/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
@@ -28,14 +29,12 @@ on:
|
||||
- 'openvdb_houdini/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'nanovdb/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
# run this workflow every day at 7am UTC except Monday
|
||||
- cron: '0 7 * * 0,2-6'
|
||||
# run this workflow Monday 7am UTC
|
||||
# warning: This pattern is checked in various places below
|
||||
- cron: '0 7 * * 1'
|
||||
# run this workflow every day 7am UTC
|
||||
- cron: '0 7 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
@@ -60,12 +59,9 @@ jobs:
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-vfx:${{ matrix.config.image }}-
|
||||
abi:${{ matrix.config.abi }}-
|
||||
cxx:${{ matrix.config.cxx }}-
|
||||
type:${{ matrix.config.build }}
|
||||
linux:${{ matrix.config.image }}-abi:${{ matrix.config.abi }}-cxx:${{ matrix.config.cxx }}-type:${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
@@ -74,22 +70,22 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# @note we specifically use clang15.0 (not clang15) here as the newest
|
||||
# versions of the clang15.X containers have some issues with the GLFW
|
||||
# installation
|
||||
- { cxx: clang++, image: '2023-clang15.0', abi: '11', build: 'Release', cmake: '' }
|
||||
- { cxx: g++, image: '2023-clang15.0', abi: '11', build: 'Release', cmake: '' }
|
||||
- { cxx: clang++, image: '2022-clang11', abi: '11', build: 'Debug', cmake: '' }
|
||||
- { cxx: clang++, image: '2022-clang11', abi: '10', build: 'Release', cmake: '' }
|
||||
- { cxx: g++, image: '2022-clang11', abi: '10', build: 'Release', cmake: '' }
|
||||
- { cxx: clang++, image: '2022-clang11', abi: '9', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
- { cxx: g++, image: '2022-clang11', abi: '9', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
- { cxx: clang++, image: '2026', abi: '13', build: 'Release', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
|
||||
- { cxx: g++, image: '2026', abi: '13', build: 'Release', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
|
||||
- { cxx: clang++, image: '2026', abi: '13', build: 'Debug', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
|
||||
- { cxx: clang++, image: '2025-clang19.1', abi: '12', build: 'Release', cmake: '' }
|
||||
- { cxx: clang++, image: '2024-clang17.2', abi: '11', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: pybind11
|
||||
#if: contains(matrix.config.image, '2023') == false
|
||||
run: ./ci/install_pybind11.sh 2.10.0
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
# 2026 images are broken with gtest/glfw installs
|
||||
- name: deps
|
||||
if: contains(matrix.config.image, '2026')
|
||||
run: |
|
||||
./ci/install_gtest.sh latest
|
||||
./ci/install_glfw.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
@@ -113,9 +109,8 @@ jobs:
|
||||
-DOPENVDB_ABI_VERSION_NUMBER=${{ matrix.config.abi }}
|
||||
\"
|
||||
- name: test
|
||||
# Always run tests on weekly builds but skip Debug on commits as they take a while.
|
||||
# https://github.community/t/distinct-job-for-each-schedule/17811/2
|
||||
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
|
||||
# Skip Debug on commits as they take a while.
|
||||
if: github.event_name == 'schedule'|| matrix.config.build == 'Release'
|
||||
run: |
|
||||
cd build && ctest -V
|
||||
cd - && ./ci/test_install.sh
|
||||
@@ -125,29 +120,16 @@ jobs:
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
windows:
|
||||
# Windows CI. Tests static and dynamic builds with MT and MD respectively.
|
||||
# Windows CI. Tests a dynamic build with MD.
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'win'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
|
||||
name: windows
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
VCPKG_DEFAULT_TRIPLET: x64-windows
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
# USE_EXPLICIT_INSTANTIATION is disabled for debug static libraries
|
||||
# due to disk space constraints
|
||||
# @note Commented out the static debug build due to linker OOM LNK1102
|
||||
- { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
#- { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DUSE_EXPLICIT_INSTANTIATION=OFF' }
|
||||
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
#- { vc: 'x64-windows', build: 'Release', cmake: '-G \"MinGW Makefiles\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -155,17 +137,18 @@ jobs:
|
||||
shell: pwsh
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\Release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install
|
||||
run: ./ci/install_windows.sh
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--components=${{ matrix.config.components }}
|
||||
--config='Release'
|
||||
--components='core,bin,view,render,python,test'
|
||||
--cargs=\'
|
||||
${{ matrix.config.cmake }}
|
||||
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXR=ON
|
||||
-DUSE_PNG=ON
|
||||
@@ -176,27 +159,36 @@ jobs:
|
||||
# Print the build directy size (monitor if we're hitting runner limits)
|
||||
run: du -h build
|
||||
- name: test
|
||||
# Always run tests on weekly builds but skip Debug on commits as they take a while.
|
||||
# https://github.community/t/distinct-job-for-each-schedule/17811/2
|
||||
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
|
||||
run: cd build && ctest -V -C ${{ matrix.config.build }}
|
||||
run: cd build && ctest -V -C Release
|
||||
|
||||
macos:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'mac'
|
||||
runs-on: macos-latest
|
||||
runs-on: ${{ matrix.config.image }}
|
||||
name: ${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: clang++
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { image: macos-14 }
|
||||
- { image: macos-15 }
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install
|
||||
run: ./ci/install_macos.sh
|
||||
run: |
|
||||
./ci/install_macos.sh
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=Release
|
||||
--components=\"core,python,bin,view,render,test\"
|
||||
--cargs=\'
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
|
||||
@@ -38,20 +38,15 @@ jobs:
|
||||
env:
|
||||
CXX: g++
|
||||
container:
|
||||
# @note We can't update this as epydoc doesn't support python3. We'll
|
||||
# need to re-write the python docs to use sphinx
|
||||
image: aswf/ci-openvdb:2022
|
||||
image: aswf/ci-openvdb:2026
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: install_doxygen
|
||||
run: ./ci/install_doxygen.sh 1_8_11
|
||||
- name: pybind11
|
||||
#if: contains(matrix.config.image, '2023') == false
|
||||
run: ./ci/install_pybind11.sh 2.10.0
|
||||
# - name: install_epydoc
|
||||
# run: pip install epydoc
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: install_latex
|
||||
run: yum -y install texlive-latex-bin texlive-dvips texlive-collection-fontsrecommended texlive-collection-latexrecommended
|
||||
run: ./ci/install_texlive.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
@@ -64,9 +59,6 @@ jobs:
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON
|
||||
\"
|
||||
# - name: epydoc
|
||||
# run: |
|
||||
# epydoc --html -o /usr/local/share/doc/OpenVDB/html/python pyopenvdb
|
||||
- name: pre_deploy
|
||||
# Overwrite global SSH configuration
|
||||
# https://github.com/peaceiris/actions-gh-pages/issues/719
|
||||
@@ -84,7 +76,7 @@ jobs:
|
||||
github.event.inputs.deploy == 'docs'
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
deploy_key: ${{ secrets.PRIVATE_KEY }}
|
||||
publish_dir: /usr/local/share/doc/OpenVDB/html
|
||||
destination_dir: documentation/doxygen
|
||||
external_repository: AcademySoftwareFoundation/openvdb-website
|
||||
@@ -105,7 +97,7 @@ jobs:
|
||||
github.event.inputs.deploy == 'coverage'
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: aswf/ci-openvdb:2023
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
env:
|
||||
CXX: g++
|
||||
steps:
|
||||
|
||||
@@ -13,6 +13,7 @@ on:
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
@@ -24,6 +25,7 @@ on:
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
@@ -63,8 +65,8 @@ jobs:
|
||||
if: >
|
||||
${{ needs.checksecret.outputs.HOUDINI_SECRETS == 'true' ||
|
||||
github.repository_owner == 'AcademySoftwareFoundation' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: hou:${{ matrix.config.hou_hash }}-vfx:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: hou:${{ matrix.config.hou_hash }}-vfx:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-build:${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-base:${{ matrix.config.image }}
|
||||
env:
|
||||
@@ -73,22 +75,18 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { cxx: clang++, image: '2023.0', hou_hash: '20_0-newabi', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: clang++, image: '2022', hou_hash: '20_0-oldabi', build: 'Release', components: 'core,hou' }
|
||||
- { cxx: clang++, image: '2021', hou_hash: '19_5', build: 'Release', components: 'core,hou' }
|
||||
- { cxx: clang++, image: '2023.0', hou_hash: '20_0-newabi', build: 'Debug', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: g++, image: '2023.0', hou_hash: '20_0-newabi', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: g++, image: '2022', hou_hash: '20_0-oldabi', build: 'Release', components: 'core,hou' }
|
||||
- { cxx: clang++, image: '2026', hou_hash: '21_0', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: clang++, image: '2026', hou_hash: '21_0', build: 'Debug', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: g++, image: '2026', hou_hash: '21_0', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: clang++, image: '2024', hou_hash: '20_5', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: g++, image: '2024', hou_hash: '20_5', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
# See note on this step in the Houdini weekly.yml job
|
||||
# We can remove this when we no longer use < 2023 images
|
||||
- name: remove zstd
|
||||
run: yum -y remove zstd
|
||||
- uses: actions/checkout@v3
|
||||
- name: pybind11
|
||||
#if: contains(matrix.config.image, '2023') == false
|
||||
run: ./ci/install_pybind11.sh 2.10.0
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: install_gtest
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
@@ -119,7 +117,7 @@ jobs:
|
||||
- name: build
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type=Release \
|
||||
--build-type="${{ matrix.config.build }}" \
|
||||
--components="${{ matrix.config.components }}" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
@@ -129,6 +127,7 @@ jobs:
|
||||
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON \
|
||||
\"
|
||||
- name: test
|
||||
if: matrix.config.build == 'Release'
|
||||
run: cd build && ctest -V
|
||||
# Keep ccache light by stripping out any caches not accessed in the last day
|
||||
- name: ccache_clean
|
||||
@@ -159,15 +158,12 @@ jobs:
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: install_deps
|
||||
run: |
|
||||
brew update
|
||||
brew install bash gnu-getopt cmake boost glfw googletest openexr pybind11 llvm@15 cppunit
|
||||
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
run: ./ci/install_macos.sh 20
|
||||
- name: build
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type=Release \
|
||||
--components="core,hou,bin,view,render,python,test,axcore,axbin,axtest" \
|
||||
--components="core,hou,bin,view,render,python,test,axcore,axbin" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
|
||||
@@ -175,7 +171,8 @@ jobs:
|
||||
-DDISABLE_CMAKE_SEARCH_PATHS=ON \
|
||||
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON \
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF \
|
||||
-DLLVM_DIR=/usr/local/opt/llvm@15/lib/cmake/llvm \
|
||||
-DLLVM_DIR=/opt/homebrew/opt/llvm@20/lib/cmake/llvm \
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
@@ -14,6 +14,7 @@ on:
|
||||
- 'openvdb_ax/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
@@ -26,6 +27,7 @@ on:
|
||||
- 'openvdb_ax/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
@@ -49,7 +51,7 @@ jobs:
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-nanovdb:cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
@@ -59,22 +61,20 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { cxx: g++, image: '2022-clang11', build: 'Release' }
|
||||
- { cxx: g++, image: '2022-clang11', build: 'Debug' }
|
||||
- { cxx: clang++, image: '2022-clang11', build: 'Release' }
|
||||
- { cxx: clang++, image: '2022-clang11', build: 'Debug' }
|
||||
- { cxx: g++, image: '2024-clang17.2', build: 'Release' }
|
||||
- { cxx: g++, image: '2024-clang17.2', build: 'Debug' }
|
||||
- { cxx: clang++, image: '2024-clang17.2', build: 'Release' }
|
||||
- { cxx: clang++, image: '2024-clang17.2', build: 'Debug' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_cuda_11
|
||||
- name: setup_cuda_12
|
||||
run: |
|
||||
yum -y install yum-utils
|
||||
yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
|
||||
echo "Installing cuda toolkit"
|
||||
yum --enablerepo=epel -y install cuda-toolkit-11-6
|
||||
echo "/usr/local/cuda-11.6/bin" >> $GITHUB_PATH
|
||||
echo "LD_LIBRARY_PATH=/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
|
||||
echo "/usr/local/cuda-12/bin" >> $GITHUB_PATH
|
||||
echo "LD_LIBRARY_PATH=/usr/local/cuda-12/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
|
||||
- name: build
|
||||
# NOTE: CMAKE_POSITION_INDEPENDENT_CODE set to fix default behaviour change in clang 14
|
||||
# https://github.com/AcademySoftwareFoundation/aswf-docker/issues/228
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
@@ -82,12 +82,14 @@ jobs:
|
||||
--cargs=\'
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DNANOVDB_USE_CUDA=ON
|
||||
-DCMAKE_CUDA_ARCHITECTURES="80"
|
||||
-DNANOVDB_USE_OPENVDB=ON
|
||||
-DCMAKE_INSTALL_PREFIX=`pwd`
|
||||
-DUSE_BLOSC=OFF
|
||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && sudo ctest -V -E ".*cuda.*"
|
||||
run: cd build && sudo ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
windows-nanovdb:
|
||||
if: |
|
||||
@@ -96,53 +98,45 @@ jobs:
|
||||
github.event.inputs.type == 'win'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
VCPKG_DEFAULT_TRIPLET: 'x64-windows'
|
||||
visual_studio: "Visual Studio 17 2022"
|
||||
cuda: "11.6.2"
|
||||
cuda: "12.4.0"
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
- { vc: 'x64-windows-static', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded' }
|
||||
- { vc: 'x64-windows-static', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug' }
|
||||
- { vc: 'x64-windows', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
- { vc: 'x64-windows', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\Release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install_cuda
|
||||
shell: powershell
|
||||
run: .\ci\install_windows_cuda.ps1
|
||||
- name: install_deps
|
||||
shell: bash
|
||||
run: |
|
||||
vcpkg update
|
||||
vcpkg install zlib tbb gtest blosc boost-iostreams boost-system boost-any boost-uuid boost-interprocess boost-algorithm
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
# nvcc doesn't set _WIN32 when run in bash so we need to set it manually
|
||||
shell: bash
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--config=Release
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'
|
||||
${{ matrix.config.cmake }}
|
||||
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DNANOVDB_USE_CUDA=ON
|
||||
-DCMAKE_CUDA_ARCHITECTURES="80"
|
||||
-DCMAKE_CUDA_FLAGS="-D_WIN32"
|
||||
-DNANOVDB_USE_OPENVDB=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: test
|
||||
shell: bash
|
||||
run: cd build && ctest -V -E ".*cuda.*"
|
||||
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
macos-nanovdb:
|
||||
if: |
|
||||
@@ -155,39 +149,41 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { runner: 'macos-11', cxx: 'clang++', build: 'Release' }
|
||||
- { runner: 'macos-11', cxx: 'clang++', build: 'Debug' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Debug' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: ./ci/install_macos.sh
|
||||
run: |
|
||||
./ci/install_macos.sh
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_USE_CUDA=OFF -DNANOVDB_USE_OPENVDB=ON\'
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_USE_CUDA=OFF -DNANOVDB_USE_OPENVDB=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \'
|
||||
- name: test
|
||||
run: cd build && ctest -V -E ".*cuda.*"
|
||||
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
nanovdb-lite:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2024-clang17.2
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_gtest
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -q install -y libgtest-dev
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: build_and_test
|
||||
run: |
|
||||
cd nanovdb/nanovdb
|
||||
sudo mkdir .build
|
||||
cd .build
|
||||
sudo cmake -DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_BUILD_UNITTESTS=ON ../
|
||||
sudo cmake -DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_BUILD_UNITTESTS=ON -DNANOVDB_USE_OPENVDB=OFF -DNANOVDB_USE_CUDA=OFF ../
|
||||
sudo make -j8 install
|
||||
sudo ctest -V
|
||||
|
||||
+196
-72
@@ -61,7 +61,7 @@ jobs:
|
||||
(github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'houdini')
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: linux-houdini:${{ matrix.config.hou_hash }}
|
||||
env:
|
||||
CXX: clang++
|
||||
@@ -70,24 +70,13 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { houdini_version: '19.5', platform: 'linux_x86_64_gcc9.3', hou_hash: '19_5' }
|
||||
- { houdini_version: '20.0', platform: 'linux_x86_64_gcc9.3', hou_hash: '20_0-oldabi' }
|
||||
- { houdini_version: '20.0', platform: 'linux_x86_64_gcc11.2', hou_hash: '20_0-newabi' }
|
||||
- { houdini_version: '21.0', platform: 'linux_x86_64_gcc11.2', hou_hash: '21_0' }
|
||||
- { houdini_version: '20.5', platform: 'linux_x86_64_gcc11.2', hou_hash: '20_5' }
|
||||
fail-fast: false
|
||||
container:
|
||||
image: aswf/ci-base:2023
|
||||
image: aswf/ci-base:2024
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
# We bumped from the 2021 CI image to 2023 here to fix some OpenSSL issues
|
||||
# with the Houdini download script. In so doing we broke some of the caching
|
||||
# between this job and the jobs in houdini.yml which _don't_ use the 2023
|
||||
# image yet. The issue is that the cache action will use zstd if it's
|
||||
# available to zip the cache and this causes it to be inserted with a unique
|
||||
# hash which images without zstd (i.e. the 2021/2022 images don't have
|
||||
# access to). For now, uninstall zstd here instead of installing it
|
||||
# everywhere and ask the LF to add zstd to the older base images.
|
||||
- name: remove zstd
|
||||
run: yum -y remove zstd
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
@@ -111,8 +100,10 @@ jobs:
|
||||
(github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'houdini')
|
||||
# Note that macos-14 (current macos-latest) switches to M1. We could instead test
|
||||
# the arm build here instead of the x86 one.
|
||||
runs-on: macos-latest
|
||||
name: macos-houdini-20
|
||||
name: macos-houdini
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
@@ -122,7 +113,7 @@ jobs:
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: download_houdini
|
||||
run: ./ci/download_houdini.sh 20.0 macosx_x86_64_clang12.0_11 --prod
|
||||
run: ./ci/download_houdini.sh 21.0 macosx_arm64_clang15.0_14 --prod
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
@@ -145,34 +136,38 @@ jobs:
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'extra'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: linux-extra:${{ matrix.config.name }}
|
||||
container:
|
||||
# @note we specifically use clang15.0 (not clang15) here as the newest
|
||||
# versions of the clang15.X containers have some issues with the GLFW
|
||||
# installation
|
||||
image: aswf/ci-openvdb:2023-clang15.0
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: clang++
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { name: 'all', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=ON -DUSE_ZLIB=ON -DUSE_EXR=ON -DUSE_PNG=ON' }
|
||||
- { name: 'lite', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_ZLIB=OFF -DUSE_EXR=OFF -DUSE_PNG=OFF -DOPENVDB_USE_DELAYED_LOADING=OFF' }
|
||||
- { name: 'half', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_IMATH_HALF=ON' }
|
||||
- { name: 'sse', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=SSE42' }
|
||||
- { name: 'avx', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=AVX' }
|
||||
- { name: 'numpy', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_NUMPY=ON -DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON' }
|
||||
- { name: 'asan', build: 'asan', components: 'core,test,axcore,axtest', cmake: '-DNANOVDB_USE_OPENVDB=ON -DOPENVDB_AX_STATIC=OFF -DOPENVDB_CORE_STATIC=OFF -DUSE_BLOSC=OFF' } # We never called blosc_destroy(), so disable blosc to silence these errors
|
||||
- { name: 'ubsan', build: 'ubsan', components: 'core,test,axcore,axtest', cmake: '' }
|
||||
- { name: 'c++20', build: 'Release', components: 'core,test,axcore,axtest', cmake: '-DCMAKE_CXX_STANDARD=20' }
|
||||
- { name: 'conf', build: 'Release', components: 'core,python,bin,view,render,test,axcore,axtest', cmake: '-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON' }
|
||||
- { name: 'all', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=ON -DUSE_ZLIB=ON -DUSE_EXR=ON -DUSE_PNG=ON' }
|
||||
- { name: 'lite', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_ZLIB=OFF -DUSE_EXR=OFF -DUSE_PNG=OFF -DOPENVDB_USE_DELAYED_LOADING=OFF' }
|
||||
- { name: 'half', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_IMATH_HALF=ON' }
|
||||
- { name: 'sse', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=SSE42' }
|
||||
- { name: 'avx', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=AVX' }
|
||||
- { name: 'pygrid', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON' }
|
||||
- { name: 'asan', image: '2026', build: 'asan', components: 'core,test', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON -DNANOVDB_USE_OPENVDB=ON -DOPENVDB_AX_STATIC=OFF -DOPENVDB_CORE_STATIC=OFF -DUSE_BLOSC=OFF' } # We never called blosc_destroy(), so disable blosc to silence these errors
|
||||
- { name: 'ubsan', image: '2026', build: 'ubsan', components: 'core,test', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" ' }
|
||||
- { name: 'c++20', image: '2026', build: 'Release', components: 'core,test', cmake: '-DCMAKE_CXX_STANDARD=20' }
|
||||
- { name: 'conf', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: pybind11
|
||||
#if: contains(container.image, '2023') == false
|
||||
run: ./ci/install_pybind11.sh 2.10.0
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
# 2026 images are broken with gtest/glfw/exr installs
|
||||
- name: deps
|
||||
if: contains(matrix.config.image, '2026')
|
||||
run: |
|
||||
./ci/install_gtest.sh latest
|
||||
./ci/install_glfw.sh latest
|
||||
./ci/install_imath.sh v3.2.2
|
||||
./ci/install_exr.sh v3.2.2
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
@@ -194,20 +189,23 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { runson: ubuntu-latest, cxx: g++, cmake: '' }
|
||||
# llvm-17 is currently the default which has symbol issues with the python module
|
||||
- { runson: ubuntu-latest, cxx: g++, cmake: '-DOPENVDB_PYTHON_USE_AX=OFF' }
|
||||
# Disable the clang job for now. See https://github.com/actions/runner-images/issues/8659
|
||||
# - { runson: ubuntu-latest, cxx: clang++, cmake: '' }
|
||||
# @todo gcc on macos
|
||||
- { runson: macos-latest, cxx: '', cmake: '-D CMAKE_CXX_COMPILER=/usr/local/opt/llvm@15/bin/clang++' }
|
||||
- { runson: macos-latest, cxx: '', cmake: '-DLLVM_DIR=/opt/homebrew/opt/llvm@20/lib/cmake/llvm' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Linux" ]; then
|
||||
sudo apt-get -q install -y libboost-dev libboost-iostreams-dev libtbb-dev libblosc-dev llvm-dev libgtest-dev libcppunit-dev pybind11-dev
|
||||
sudo apt-get -q install -y libboost-dev libboost-iostreams-dev libtbb-dev libblosc-dev libgtest-dev libgmock-dev python3-numpy
|
||||
./ci/install_nanobind.sh 2.5.0
|
||||
elif [ "$RUNNER_OS" == "macOS" ]; then
|
||||
./ci/install_macos.sh 15
|
||||
./ci/install_macos.sh 20
|
||||
./ci/install_tbb_macos.sh
|
||||
else
|
||||
echo "$RUNNER_OS not supported"; exit 1
|
||||
fi
|
||||
@@ -215,11 +213,71 @@ jobs:
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=Release
|
||||
--components=\"core,axcore,python,bin,render,test,axtest,axbin\"
|
||||
--cargs=\"-DCMAKE_CXX_STANDARD=20 -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install ${{ matrix.config.cmake }}\"
|
||||
--components=\"core,axcore,python,bin,render,test,axbin\"
|
||||
--cargs=\'
|
||||
-DCMAKE_CXX_STANDARD=20
|
||||
-DOPENVDB_USE_DELAYED_LOADING=OFF
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
${{ matrix.config.cmake }}
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
windows:
|
||||
# Windows CI. Tests static and dynamic builds with MT and MD respectively.
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'win'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
# USE_EXPLICIT_INSTANTIATION is disabled for debug static libraries
|
||||
# due to disk space constraints
|
||||
# - { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
# - { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
shell: pwsh
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--components=${{ matrix.config.components }}
|
||||
--cargs=\'
|
||||
${{ matrix.config.cmake }}
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXR=ON
|
||||
-DUSE_PNG=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: size
|
||||
# Print the build directy size (monitor if we're hitting runner limits)
|
||||
run: du -h build
|
||||
- name: test
|
||||
# Always run tests on weekly builds but skip Debug on commits as they take a while.
|
||||
# https://github.community/t/distinct-job-for-each-schedule/17811/2
|
||||
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
|
||||
run: cd build && ctest -V -C ${{ matrix.config.build }}
|
||||
|
||||
#############################################################################
|
||||
############################ AX Library Extras ##############################
|
||||
#############################################################################
|
||||
@@ -229,7 +287,7 @@ jobs:
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
@@ -239,22 +297,14 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# Unified
|
||||
- { image: '2022-clang14', cxx: 'clang++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
|
||||
- { image: '2022-clang14', cxx: 'g++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
|
||||
- { image: '2022-clang13', cxx: 'clang++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
|
||||
- { image: '2022-clang13', cxx: 'g++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
|
||||
# Standalone
|
||||
- { image: '2021-clang10', cxx: 'clang++', build: 'Release', components: 'core', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
- { image: '2022-clang11', cxx: 'clang++', build: 'Debug', components: 'core', cmake: '' }
|
||||
- { image: '2022-clang11', cxx: 'clang++', build: 'Release', components: 'core', cmake: '' }
|
||||
- { image: '2022-clang11', cxx: 'g++', build: 'Release', components: 'core', cmake: '' }
|
||||
- { image: '2025-clang18.1', cxx: 'clang++', build: 'Release', components: 'core,axcore,axbin,axtest', cmake: '' }
|
||||
# @note LLVM 17 builds are incompatible with the vdb python plugin on linux
|
||||
- { image: '2024-clang17.2', cxx: 'clang++', build: 'Release', components: 'core,axcore,axbin,axtest', cmake: '-DOPENVDB_PYTHON_USE_AX=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: pybind11
|
||||
#f: contains(matrix.config.image, '2023') == false
|
||||
run: ./ci/install_pybind11.sh 2.10.0
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
@@ -265,6 +315,7 @@ jobs:
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
-DOPENVDB_BUILD_VDB_TOOL=OFF
|
||||
\"
|
||||
- name: clean
|
||||
if: matrix.config.components == 'core'
|
||||
@@ -280,6 +331,7 @@ jobs:
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
-DOPENVDB_BUILD_VDB_TOOL=OFF
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
@@ -291,21 +343,21 @@ jobs:
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: macos-latest
|
||||
runs-on: ${{ matrix.config.runner }}
|
||||
name: macos-cxx:${{ matrix.config.cxx }}-llvm:${{ matrix.config.llvm }}-${{ matrix.config.build }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { cxx: 'clang++', build: 'Release', llvm: '14' }
|
||||
- { cxx: 'clang++', build: 'Release', llvm: '15' }
|
||||
#- { cxx: 'clang++', build: 'Release', llvm: '16' } - not supported yet
|
||||
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '20' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: ./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
run: |
|
||||
./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
@@ -314,7 +366,8 @@ jobs:
|
||||
--cargs=\"
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DLLVM_DIR=/usr/local/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
-DLLVM_DIR=/opt/homebrew/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
@@ -327,7 +380,7 @@ jobs:
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
|
||||
name: ${{ matrix.config.vc }}-${{ matrix.config.crt }}-${{ matrix.config.build }}-llvm${{ matrix.config.llvm }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
# Export this with '' avoid bash treating \ as escape
|
||||
@@ -341,16 +394,22 @@ jobs:
|
||||
# @todo We don't currently run the axtests with shared builds of ax
|
||||
# due to symbol issues using LLVM as a static lib (which is the only
|
||||
# option on Windows).
|
||||
- { vc: 'x64-windows', crt: 'MD', components: 'core,bin,axcore,axbin,python', build: 'Release', cmake: '-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF' }
|
||||
- { vc: 'x64-windows-static', crt: 'MT', components: 'core,bin,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows-static', crt: 'MTd', components: 'core,bin,axcore,axbin,axtest', build: 'Debug', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
# @note currently only test static builds with MT as building LLVM as
|
||||
# a shared lib on windows is a bit dicey
|
||||
- { vc: 'x64-windows-static', llvm: '18.1.0', crt: 'MultiThreaded', components: 'core,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows-static', llvm: '18.1.0', crt: 'MultiThreadedDebug', components: 'core,axcore,axbin,axtest', build: 'Debug', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows', llvm: '18.1.0', crt: 'MultiThreadedDLL', components: 'core,axcore,axbin', build: 'Release', cmake: '-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF' }
|
||||
- { vc: 'x64-windows-static', llvm: '15.0.0', crt: 'MultiThreaded', components: 'core,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: llvm
|
||||
run: ./ci/install_llvm_windows.sh ${{ matrix.config.crt }}
|
||||
run: ./ci/install_llvm_windows.sh ${{ matrix.config.llvm }} ${{ matrix.config.crt }}
|
||||
- name: install
|
||||
run: ./ci/install_windows.sh
|
||||
shell: powershell
|
||||
run: |
|
||||
vcpkg update
|
||||
vcpkg install tbb gtest
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
@@ -358,10 +417,13 @@ jobs:
|
||||
--components="${{ matrix.config.components }}"
|
||||
--cargs=\'
|
||||
-A x64 -G \"Visual Studio 17 2022\"
|
||||
-DOPENVDB_USE_DELAYED_LOADING=OFF
|
||||
-DUSE_BLOSC=OFF \
|
||||
-DUSE_ZLIB=OFF \
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=OFF
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DLLVM_DIR=\"${HOME}\\llvm_install\\lib\\cmake\\llvm\"
|
||||
-DCMAKE_INSTALL_PREFIX=\"${VDB_INSTALL_PREFIX}\"
|
||||
@@ -380,18 +442,77 @@ jobs:
|
||||
################################## Blosc ####################################
|
||||
#############################################################################
|
||||
|
||||
windows-nanovdb:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'winnano'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
visual_studio: "Visual Studio 17 2022"
|
||||
cuda: "12.4.0"
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
- { vc: 'x64-windows-static', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded' }
|
||||
- { vc: 'x64-windows-static', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug' }
|
||||
- { vc: 'x64-windows', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
- { vc: 'x64-windows', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
shell: powershell
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install_cuda
|
||||
shell: powershell
|
||||
run: .\ci\install_windows_cuda.ps1
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
shell: bash
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'
|
||||
${{ matrix.config.cmake }}
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DNANOVDB_USE_CUDA=ON
|
||||
-DCMAKE_CUDA_ARCHITECTURES="80"
|
||||
-DNANOVDB_USE_OPENVDB=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: test
|
||||
shell: bash
|
||||
run: cd build && ctest -V -E ".*cuda.*"
|
||||
|
||||
#############################################################################
|
||||
################################## Blosc ####################################
|
||||
#############################################################################
|
||||
|
||||
linux-blosc:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'blosc'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: linux-blosc:${{ matrix.blosc }}
|
||||
container:
|
||||
image: aswf/ci-base:2023
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
strategy:
|
||||
matrix:
|
||||
blosc: ['1.18.0','1.19.0','1.20.0','1.21.0']
|
||||
blosc: ['1.21.0', 'latest']
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -420,6 +541,9 @@ jobs:
|
||||
# may not have this build type. See OpenVDBCXX.cmake
|
||||
CXXFLAGS: "-gdwarf-4 -g3 -ggdb -Og"
|
||||
steps:
|
||||
- name: Enable Node 16
|
||||
run: |
|
||||
echo "ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true" >> $GITHUB_ENV
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
@@ -478,7 +602,7 @@ jobs:
|
||||
-strict
|
||||
-extended
|
||||
- name: upload_report
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: abi_report
|
||||
|
||||
@@ -36,5 +36,5 @@ jobs:
|
||||
- name: test
|
||||
run: |
|
||||
set +e
|
||||
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!*.wlt'
|
||||
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!*.wlt' ':!*.jpg' ':!*.gif' ':!*.mp4' ':!*.pt' ':!*.pth' ':!*.nvdb' ':!*.npz'
|
||||
test $? -eq 1
|
||||
|
||||
@@ -1,7 +1,385 @@
|
||||
OpenVDB Version History
|
||||
=======================
|
||||
|
||||
Version 11.0.1 - In development
|
||||
Version 12.1.2 - In development
|
||||
|
||||
|
||||
Version 12.1.1 - September 30, 2025
|
||||
|
||||
OpenVDB AX:
|
||||
Fixes:
|
||||
- Fixed an issue which was causing host specific optimization passes to be
|
||||
omitted when using LLVM 16 and higher.
|
||||
|
||||
Houdini:
|
||||
- Fixed a compilation issue with the OpenVDB Activate SOP with Houdini 21
|
||||
[Reported by @callen128]
|
||||
|
||||
|
||||
Version 12.1.0 - August 8, 2025
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- New level set constructor tools::createLevelSetCapsule creates a grid
|
||||
containing a narrow-band level set representation of a capsule (tube
|
||||
with constant radius and sphere caps).
|
||||
- New level set constructor tools::createLevelSetTaperedCapsule creates a
|
||||
grid containing a narrow-band level set representation of a tapered
|
||||
capsule (tube with sphere caps and different radii at both ends, or
|
||||
equivalently the convex hull of two spheres with possibly different
|
||||
centers and radii).
|
||||
- New level set constructor tools::createLevelSetTubeComplex creates a grid
|
||||
containing a narrow-band level set representation of a tube complex (a
|
||||
collection of capsules or tapered capsules defined by endpoint coordinates
|
||||
and segment indices).
|
||||
- New level set constructor tools::createLevelSetDilatedMesh creates a grid
|
||||
containing a narrow-band level set representation of a dilated surface
|
||||
mesh (dilated by a radius in all directions).
|
||||
- New class tools::ConvexVoxelizer, used by the above methods, which can be
|
||||
inherited to implement a convex level set constructor.
|
||||
- Introduced anisotropic surfacing tools in points/PointRasterizeSDF.h and
|
||||
principal component analysis (PCA) methods in points/PrincipalComponentAnalysis.h.
|
||||
The latter tool analyses point neighborhoods and computes affine
|
||||
transformations representing elliptical distributions. The prior tool
|
||||
takes rotational and stretch point attributes (optionally computed from
|
||||
the prior PCA methods) and generates anisotropic surfaces.
|
||||
|
||||
Improvements:
|
||||
- Significantly improved the performance of all LeafNode ValueIterators,
|
||||
up to 5x on some platforms and up to 10x when delay loading is enabled.
|
||||
Construction of a ValueIterator from a leaf node now requests the leaf
|
||||
buffers ahead of iteration to avoid potentially expensive API calls.
|
||||
- Improved the performance of PointRasterizeSDF.h tools with larger radii
|
||||
with better bound computation approximations.
|
||||
- Significant performance improvement to delay loaded files - the warning
|
||||
logic which checks the underlying mapped file for the last modified time
|
||||
has been removed, resulting in performance gains upwards of 10x when
|
||||
loading in node data buffers. Note that the check that was removed is
|
||||
entirely redundant on Windows and would only print a warning on other
|
||||
system.
|
||||
[Contributed by jjtParadox]
|
||||
- Added OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION and OPENVDB_HAS_MEMBER_FUNCTION
|
||||
macros to help determine the presence and compatibility of interface
|
||||
member functions at compile time.
|
||||
- Added OPENVDB_ASSUME macros to mimic builtin assume and C++23 assume
|
||||
attributes.
|
||||
- Improved read and write of PLY files with vdb_tool so they support Vec3d
|
||||
and 64 bit attributes. Changed vdb_tool version number from 10.6.1 to
|
||||
10.7.0.
|
||||
|
||||
API Changes:
|
||||
- Mat3 and Mat4 functions have been marked [[nodiscard]] where it may be
|
||||
confusing if they are operating in place or returning a result, in
|
||||
particular tranpose, invert, adjoint, and timesDiagonal.
|
||||
- Re-worked the API in PointRasterizeSDF.h with the addition of anisotropic
|
||||
surfacing kernels. The new API exposes more concise free functions which
|
||||
take structs of parameters. The old API remains supported but is
|
||||
deprecated.
|
||||
- Deprecated providing a filter or interrupter as arguments to
|
||||
points::rasterize. These can instead be implemented on user transfer
|
||||
schemes.
|
||||
- Transfer schemes provided to points::rasterize can now optionally
|
||||
implement a rasterizePoints callback that takes a range of points per
|
||||
voxel.
|
||||
|
||||
Fixes:
|
||||
- Fixed a bug in points::rasterizeSpheres and points::rasterizeSmoothSpheres
|
||||
which could cause sections of the generated surface to incorrectly be
|
||||
marked as negative interior values.
|
||||
- Fixed a bug in points::rasterizeSmoothSpheres which could result in
|
||||
incomplete surface reconstruction with significantly larger search
|
||||
distances.
|
||||
- Fixed some precision issues in various Matrix methods.
|
||||
- Fixed bugs in vdb_tool that prevented build with newer namespaces in
|
||||
nanovdb.
|
||||
|
||||
OpenVDB AX:
|
||||
Improvements:
|
||||
- Added support for LLVM versions greater than 15. Upgraded CI to test with
|
||||
LLVM versions 16, 17, 18, 19 and 20.
|
||||
- As of this release, LLVM 15 is the minimum required version for OpenVDB
|
||||
AX. Note that there is an issue with LLVM 17 symbols which makes it
|
||||
incompatible with the OpenVDB Python plugin. AS such, LLVM version 18 and
|
||||
greater are the recommended LLVM versions to use, with LLVM 18 being the
|
||||
new future minimum version.
|
||||
- Significant performance improvement to the compilation of AX kernels when
|
||||
using LLVM 18 and greater.
|
||||
- Significant backend refactoring to AX IR generation to support newer
|
||||
versions of LLVM. In particular, parts of the codegen::Function and
|
||||
codegen::FunctionBuilder API require new usage from LLVM 16 due to
|
||||
the LLVM opaque pointer changes. If you're not using the OpenVDB AX
|
||||
Function codegen API then no client changes should be necessary.
|
||||
- Migrated OpenVDB AX unit tests from cppunit to gtest
|
||||
[Contributed by Tim Straubinger]
|
||||
|
||||
Fixes:
|
||||
- Fixed a case of undefined behaviour when explicitly casting variables to
|
||||
the same type as their storage type e.g:
|
||||
double a; double b = double(a);
|
||||
- Fixed an AX compiler error which would produce invalid IR when using 64bit
|
||||
integer variables for matrix array offsetting e.g:
|
||||
int64 a = 0; mat4f b = 1; float c = b[a,a];
|
||||
|
||||
NanoVDB:
|
||||
- Added nanovdb::openToIndexVDB, which can convert an OpenVDB grid into a
|
||||
NanoVDB IndexGrid.
|
||||
- Added new options "--index" and "--onIndex" to the command-line tool
|
||||
nanovdb_convert so it can produce IndexGrids.
|
||||
- Fixed memory leak in DeviceBuffer.
|
||||
- Added constructor for DeviceBuffer from an existing HostBuffer.
|
||||
- Added VoxelBlockManager, an acceleration structure for sequential access
|
||||
and stencil ops over active voxels.
|
||||
- Added helper functions for kernel launches with shared memory.
|
||||
- Added support for CUDA 13.0.
|
||||
- Fix warnings and compilation errors for GCC and Clang.
|
||||
- Fixed inconsistent usage of util::cuda::mallocAsync/freeAsync that
|
||||
affected vGPUs.
|
||||
- Added support for custom memory resources in PointsToGrid.
|
||||
- Fixed race condition in split/mergeGridHandles.
|
||||
- Fixed offset bug in nanovdb::tools::cuda::IndexToGrid related to non-POD
|
||||
build types.
|
||||
[Contributed by Andreas Henne]
|
||||
|
||||
Houdini:
|
||||
- Define OP_InputIdx and OP_OutputIdx for Houdini 21.0 compatibility
|
||||
- Add Houdini 21 style camera interface to support LOP cameras
|
||||
- Include env flag for avoiding stream writing (was backported to 19.5)
|
||||
|
||||
|
||||
Version 12.0.1 - April 3, 2025
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Added read and write support for OFF (Object File Format) files to
|
||||
vdb_tool
|
||||
|
||||
Build:
|
||||
- Fixed a build issue with vdb_render on Windows with newer versions of
|
||||
glew not including glu.h by default
|
||||
- Fixed issues with newer versions of clang refusing to accept older
|
||||
::template syntax
|
||||
|
||||
NanoVDB:
|
||||
New features:
|
||||
- Added support for multiple GPUs to DeviceBuffer
|
||||
- Added a UnifiedBuffer class that wraps CUDA unified memory
|
||||
- Added example for multiGPU sparse convolution
|
||||
- Added CUDA utility functions for device queries
|
||||
- Added functions to independently stop and compute the elapsed time for
|
||||
timer classes
|
||||
|
||||
Improvements:
|
||||
- Replaced CUB's CachingDeviceAllocator with the default asynchronous
|
||||
stream ordered allocator in PointsToGrid for improved performance
|
||||
|
||||
Bug fix:
|
||||
- Map is now properly transposed when converting NanoVDB to OpenVDB.
|
||||
- Fixed ostream specializations being hidden within the nanovdb namespace
|
||||
- Fixed a call to a non-existent method in GridBuild.h
|
||||
|
||||
|
||||
Version 12.0.0 - October 31, 2024
|
||||
|
||||
OpenVDB is now licensed under the Apache 2.0 license, instead of the MPL 2.0 license.
|
||||
|
||||
This version introduces ABI changes relative to older major releases,
|
||||
so to preserve ABI compatibility it might be necessary to define the
|
||||
macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 10 for
|
||||
Houdini 20.0 and 11 for Houdini 20.5.
|
||||
|
||||
GCC 9 is no longer supported.
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Added fillet() method in tools::LevelSetFilter to round off concave edges
|
||||
to create smoother transition between surfaces.
|
||||
|
||||
Improvements:
|
||||
- Added openvdb::assertAbort to replace cassert and a
|
||||
OPENVDB_ENABLE_ASSERTS cmake argument/compile define to toggle
|
||||
assertions in OpenVDB code, independantly of NDEBUG. Asserts are
|
||||
no longer enabled by default in when NDEBUG is absent (e.g.
|
||||
Debug builds).
|
||||
- Removed last traces of Boost when OPENVDB_USE_DELAYED_LOADING is OFF
|
||||
[Reported by Brian McKinnon]
|
||||
- RootNode code cleanup to eliminate redundant key conversion and
|
||||
to create map values in-place.
|
||||
- Add RootNode::deleteChildOrTile() to delete a child or tile of
|
||||
the root node.
|
||||
- ValueAccessors are now defined and created in the Tree class
|
||||
instead of in the Grid class so that custom Tree implementations
|
||||
may define and create their own ValueAccessors if desired.
|
||||
- Added support for PDAL to vdb_tool [Contributed by Tom Matterson]
|
||||
- LeafManager and NodeManager now use Index64 for leaf counts internally.
|
||||
- Added RootNode::probeChild() const.
|
||||
- Added RootNode::probeChild() and RootNode::probeConstChild().
|
||||
- Added RootNode::probe() and RootNode::probeConst() to query key presence,
|
||||
child node, value and active state.
|
||||
- Added InternalNode::probeChild() const.
|
||||
- Added InternalNode::probeChild() and probeChildConst() with coord access
|
||||
and optionally value and active state.
|
||||
- Added InternalNode::probeChild() and probeChildConst() with index access
|
||||
and optionally value and active state.
|
||||
- Added InternalNode::isValueOff(), LeafNode::isValueOff(),
|
||||
LeafNodeBool::isValueOff(), LeafNodeMask::isValueOff().
|
||||
- Added LeafNodeMask::probeValue(Index,val), LeafNodeBool::probeValue(Index,val).
|
||||
- Added RootNode::getValueUnsafe(), RootNode::getChildUnsafe(),
|
||||
RootNode::getConstChildUnsafe().
|
||||
- Added InternalNode::getValueUnsafe(), InternalNode::getChildUnsafe(),
|
||||
InternalNode::getConstChildUnsafe().
|
||||
- Added InternalNode::setActiveStateUnsafe(), InternalNode::setValueOnlyUnsafe(),
|
||||
InternalNode::setValueOnUnsafe(), InternalNode::setValueOffUnsafe().
|
||||
- Added InternalNode::setChildUnsafe(), InternalNode::resetChildUnsafe(),
|
||||
InternalNode::stealChildUnsafe(), InternalNode::deleteChildUnsafe().
|
||||
- For LeafNode, LeafNodeBool and LeafNodeMask - added
|
||||
LeafNode::getValueUnsafe(), LeafNode::setActiveStateunsafe(),
|
||||
LeafNode::setValueOnlyUnsafe(), LeafNode::setValueOnUnsafe(),
|
||||
LeafNode::setValueOffUnsafe().
|
||||
|
||||
ABI changes:
|
||||
- Tree::leafCount(), Tree::unallocatedLeafCount(),
|
||||
Tree::nonLeafCount() and Tree::nodeCount() now use Index64 in their
|
||||
return types instead of Index32.
|
||||
|
||||
API Changes:
|
||||
- RootNode::tileCount(), RootNode::activeTileCount() and
|
||||
RootNode::inactiveTileCount() are now public.
|
||||
- RootNode::hasKey() and RootNode::coordToKey() are now public.
|
||||
- RootNode::leafCount(), RootNode::nonLeafCount() and RootNode::nodeCount()
|
||||
now use Index64 instead of Index32. The Index32 variant is deprecated.
|
||||
- InternalNode::leafCount(), InternalNode::nonLeafCount() and
|
||||
InternalNode::nodeCount() now use Index64 instead of Index32. The Index32
|
||||
variant is deprecated.
|
||||
- LeafNode::leafCount() and LeafNode::nonLeafCount() now use Index64 instead
|
||||
of Index32. The Index32 variant is deprecated.
|
||||
|
||||
Bug Fixes:
|
||||
- Fix potential crash reading corrupt .vdb files with invalid
|
||||
blosc or zip chunks.
|
||||
[Fix thanks to Matthias Ueberheide]
|
||||
- Fix a bug in RootNode::setOrigin() where the origin was updated
|
||||
before the error was thrown potentially leaving the root in an
|
||||
invalid state.
|
||||
- Fixed a thread sanitizer issue which could cause undefined
|
||||
behaviour in VolumeToSpheres::fillWithSpheres
|
||||
[Reported by Jérémie Dumas]
|
||||
- Fixed an occurance of undefined behaviour in tools::activate
|
||||
(though this would typically not have manifested with any
|
||||
unintended behaviour)
|
||||
|
||||
NanoVDB:
|
||||
Bug fix:
|
||||
- nanovdb::readGrids works with raw grid buffer.
|
||||
|
||||
Improvements:
|
||||
- Restructure files location and namespace to be more align with
|
||||
OpenVDB. The namespaces touched by the restructuring are: io,
|
||||
cuda, util, tools, and math.
|
||||
- Add two scripts updateFiles.sh and updateFiles.py to update the
|
||||
files using NanoVDB. The script updateFiles.py works on both
|
||||
Windows and Linux. For a more complete list of changes, see API
|
||||
Changes (details).
|
||||
|
||||
- cuda::PointsToGrid supports target density.
|
||||
- Add support for NanoVDB Grid of type UInt8.
|
||||
- Add ability to use externally managed CUDA buffer.
|
||||
- Add create methods for CudaDeviceBuffer and exceptions.
|
||||
- Improve GridValidator logic, e.g. include check for grid count.
|
||||
- Add operator > and >= for class Coord according to lexicographical order.
|
||||
- Add toCodec to convert string to Codec enumeration type.
|
||||
- Add nanovdb::strlen<GridType>().
|
||||
- Add strncpy util.
|
||||
- Add NANOVDB_DISABLE_SYNC_CUDA_MALLOC that maps cudaMallocAsync
|
||||
and cudaFreeAsync to cudaMalloc and cudaFree respectively.
|
||||
- Add guard to UINT64_C.
|
||||
- Remove use of cudaMallocAsync in PointsToGrid.cuh.
|
||||
- Align PNanoVDB blind metadata to NanoVDB.
|
||||
|
||||
API Changes:
|
||||
- Change mapToGridType to toGridType.
|
||||
- Change mapToMagic to toMagic.
|
||||
- Change CpuTimer.h to Timer.h.
|
||||
|
||||
API Changes (details):
|
||||
- These APIs are now under the math namespace: Ray, DDA, HDDA,
|
||||
Vec3, Vec4, BBox, ZeroCrossing, TreeMarcher, PointTreeMarcher,
|
||||
BoxStencil, CurvatureStencil, GradStencil, WenoStencil, AlignUp,
|
||||
Min, Max, Abs, Clamp, Sqrt, Sign, Maximum, Delta, RoundDown, pi,
|
||||
isApproxZero, Round, createSampler, SampleFromVoxels.
|
||||
|
||||
- These APIs are now under the tools namespace: createNanoGrid,
|
||||
StatsMode, createLevelSetSphere, createFogVolumeSphere,
|
||||
createFogVolumeSphere, createFogVolumeSphere,
|
||||
createFogVolumeTorus, createLevelSetBox, CreateNanoGrid,
|
||||
updateGridStats, evalChecksum, validateChecksum, checkGrid,
|
||||
Extrema.
|
||||
- These APIs are now under the util namespace: is_floating_point,
|
||||
findLowestOn, findHighestOn, Range, streq, strcpy, strcat,
|
||||
empty, Split, invoke, forEach, reduce, prefixSum, is_same,
|
||||
is_specialization, PtrAdd, PtrDiff.
|
||||
|
||||
- Move nanovdb::build to nanovdb::tools::build.
|
||||
- Rename nanovdb::BBoxR to nanovdb::Vec3dBBox.
|
||||
- Rename nanovdb::BBox<nanovdb::Vec3d> to nanovdb::Vec3dBbox.
|
||||
- Move nanovdb::cudaCreateNodeManager to nanovdb::cuda::createNodeManager.
|
||||
- Move and rename nanovdb::cudaVoxelsToGrid to nanovdb::cuda::voxelsToGrid.
|
||||
- Move and rename nanovdb::cudaPointsToGrid to nanovdb::cuda::pointsToGrid.
|
||||
- Move nanovdb::DitherLUT to nanovdb::math::DitherLUT.
|
||||
- Move and rename nanovdb::PackedRGBA8 to nanovdb::math::Rgba8.
|
||||
- Move nanovdb::Rgba8 to nanovdb::math::Rgba8.
|
||||
- Move and rename nanovdb::CpuTimer to nanovdb::util::Timer.
|
||||
- Move nanovdb::GpuTimer to nanovdb::util::cuda::Timer.
|
||||
- Move and rename nanovdb::CountOn to nanovdb::util::countOn.
|
||||
|
||||
- Move util/GridHandle.h to GridHandle.h.
|
||||
- Move util/BuildGrid.h to tools/GridBuilder.h.
|
||||
- Move util/GridBuilder.h to tools/GridBuilder.h.
|
||||
- Move util/IO.h to io/IO.h.
|
||||
- Move util/CSampleFromVoxels.h to math/CSampleFromVoxels.h.
|
||||
- Move util/DitherLUT.h to math/DitherLUT.h.
|
||||
- Move util/HDDA.h to math/HDDA.h.
|
||||
- Move util/Ray.h to math/Ray.h.
|
||||
- Move util/SampleFromVoxels.h to math/SampleFromVoxels.h.
|
||||
- Move util/Stencils.h to nanovdb/math/Stencils.h.
|
||||
- Move util/CreateNanoGrid.h to tools/CreateNanoGrid.h.
|
||||
- Move and rename util/Primitives.h to tools/CreatePrimitives.h.
|
||||
- Move util/GridChecksum.h to tools/GridChecksum.h.
|
||||
- Move util/GridStats.h to tools/GridStats.h.
|
||||
- Move util/GridChecksum.h to tools/GridChecksum.h.
|
||||
- Move util/GridValidator.h to tools/GridValidator.h.
|
||||
- Move util/NanoToOpenVDB.h to tools/NanoToOpenVDB.h.
|
||||
- Move util/cuda/CudaGridChecksum.cuh to tools/cuda/CudaGridChecksum.cuh.
|
||||
- Move util/cuda/CudaGridStats.cuh to tools/cuda/CudaGridStats.cuh.
|
||||
- Move util/cuda/CudaGridValidator.cuh to tools/cuda/CudaGridValidator.cuh.
|
||||
- Move util/cuda/CudaIndexToGrid.cuh to tools/cuda/CudaIndexToGrid.cuh.
|
||||
- Move and rename util/cuda/CudaPointsToGrid.cuh to tools/cuda/PointsToGrid.cuh.
|
||||
- Move util/cuda/CudaSignedFloodFill.cuh to tools/cuda/CudaSignedFloodFill.cuh.
|
||||
- Move and rename util/cuda/CudaDeviceBuffer.h to cuda/DeviceBuffer.h.
|
||||
- Move and rename util/cuda/CudaGridHandle.cuh to cuda/GridHandle.cuh.
|
||||
- Move and rename util/cuda/CudaUtils.h to util/cuda/Util.h.
|
||||
- Move and consolidate util/cuda/GpuTimer.h to util/cuda/Timer.h.
|
||||
|
||||
Houdini:
|
||||
- When OPENVDB_ENABLE_RPATH is ON, the location of
|
||||
libopenvdb_houdini is now added to the rpath of all Houdini
|
||||
dsos.
|
||||
|
||||
Python:
|
||||
- OpenVDB Python bindings are now implemented using nanobind
|
||||
instead of pybind11
|
||||
- The OpenVDB Python module has been changed from pyopenvdb to openvdb
|
||||
- Added Python bindings for NanoVDB
|
||||
|
||||
Build:
|
||||
- Fixed an issue with OpenVDB AX's CMake on Windows where the
|
||||
static and shared library targets would have the same name
|
||||
[Reported by Nicholas Yue]
|
||||
- USE_EXPLICIT_INSTANTIATION is now disabled on Windows by default
|
||||
due to OOM linker issues.
|
||||
- Jemalloc is now the preferred allocator of choice on all
|
||||
platforms when CONCURRENT_MALLOC is set to Auto.
|
||||
- Fixed an issue with the Blosc CMake FindPackage for the OpenVDB
|
||||
Windows static library.
|
||||
|
||||
|
||||
Version 11.0.0 - November 1, 2023
|
||||
@@ -399,7 +777,6 @@ Version 9.1.0 - June 9, 2022
|
||||
Positional arguments as input files are deprecated.
|
||||
- Added tools::minMax() which supports multithreaded evaluation of active
|
||||
minimum and maximum values. Grid::evalMinMax() has been deprecated.
|
||||
[Contributed by Greg Hurst]
|
||||
- Significant performance improvements to AX point kernels, primarily due to
|
||||
providing AX access to attribute buffers for superior code generation.
|
||||
- vdb_print now prints both the in-core memory and total memory usage for
|
||||
|
||||
+75
-6
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
# note: cmake_minimum_required must be called before project commands to
|
||||
# ensure policy scope is set up correctly
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
# CMP0091 allows for MSVC ABI targetting via CMAKE_MSVC_RUNTIME_LIBRARY
|
||||
# from CMake 3.15 and above. Must come before project().
|
||||
@@ -52,9 +52,9 @@ endif()
|
||||
|
||||
###### Version
|
||||
|
||||
set(OpenVDB_MAJOR_VERSION 11)
|
||||
set(OpenVDB_MINOR_VERSION 0)
|
||||
set(OpenVDB_PATCH_VERSION 1)
|
||||
set(OpenVDB_MAJOR_VERSION 12)
|
||||
set(OpenVDB_MINOR_VERSION 1)
|
||||
set(OpenVDB_PATCH_VERSION 2)
|
||||
set(OpenVDB_VERSION "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}")
|
||||
|
||||
project(OpenVDB LANGUAGES CXX VERSION ${OpenVDB_VERSION})
|
||||
@@ -268,6 +268,13 @@ mark_as_advanced(
|
||||
|
||||
include(cmake/config/OpenVDBVersions.cmake)
|
||||
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_CMAKE_VERSION)
|
||||
if(CMAKE_VERSION VERSION_LESS ${FUTURE_MINIMUM_CMAKE_VERSION})
|
||||
message(DEPRECATION "Support for CMake versions < ${FUTURE_MINIMUM_CMAKE_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
foreach(DEPRECATED_ABI ${OPENVDB_DEPRECATED_ABI_LIST})
|
||||
option(OPENVDB_USE_DEPRECATED_ABI_${DEPRECATED_ABI} "Bypass minimum ABI requirement checks" OFF)
|
||||
mark_as_advanced(OPENVDB_USE_DEPRECATED_ABI_${DEPRECATED_ABI})
|
||||
@@ -285,6 +292,30 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
||||
|
||||
# Add cmake modules to installation command
|
||||
|
||||
if(SKBUILD)
|
||||
set(OPENVDB_INSTALL_BINDIR openvdb/${CMAKE_INSTALL_BINDIR})
|
||||
set(OPENVDB_INSTALL_LIBDIR openvdb/${CMAKE_INSTALL_LIBDIR})
|
||||
set(OPENVDB_INSTALL_INCLUDEDIR openvdb/${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
if(OPENVDB_BUILD_NANOVDB)
|
||||
set(NANOVDB_INSTALL_BINDIR nanovdb/${CMAKE_INSTALL_BINDIR})
|
||||
set(NANOVDB_INSTALL_LIBDIR nanovdb/${CMAKE_INSTALL_LIBDIR})
|
||||
set(NANOVDB_INSTALL_INCLUDEDIR nanovdb/${CMAKE_INSTALL_INCLUDEDIR})
|
||||
set(NANOVDB_INSTALL_DOCDIR nanovdb/${CMAKE_INSTALL_DOCDIR})
|
||||
endif()
|
||||
else()
|
||||
set(OPENVDB_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
|
||||
set(OPENVDB_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
||||
set(OPENVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
if(OPENVDB_BUILD_NANOVDB)
|
||||
set(NANOVDB_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
|
||||
set(NANOVDB_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
||||
set(NANOVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
set(NANOVDB_INSTALL_DOCDIR ${CMAKE_INSTALL_DOCDIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(OPENVDB_INSTALL_CMAKE_MODULES)
|
||||
set(OPENVDB_CMAKE_MODULES
|
||||
cmake/FindBlosc.cmake
|
||||
@@ -298,7 +329,7 @@ if(OPENVDB_INSTALL_CMAKE_MODULES)
|
||||
cmake/OpenVDBMayaSetup.cmake
|
||||
cmake/OpenVDBUtils.cmake
|
||||
)
|
||||
install(FILES ${OPENVDB_CMAKE_MODULES} DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenVDB)
|
||||
install(FILES ${OPENVDB_CMAKE_MODULES} DESTINATION ${OPENVDB_INSTALL_LIBDIR}/cmake/OpenVDB)
|
||||
endif()
|
||||
|
||||
# Configure component dependencies by loading the Houdini/Maya setup
|
||||
@@ -451,6 +482,44 @@ if(NOT OPENVDB_BUILD_NANOVDB AND
|
||||
find_package(OpenVDB REQUIRED COMPONENTS nanovdb)
|
||||
endif()
|
||||
|
||||
# Locate Python and nanobind if necessary
|
||||
if(OPENVDB_BUILD_PYTHON_MODULE OR (OPENVDB_BUILD_NANOVDB AND NANOVDB_BUILD_PYTHON_MODULE))
|
||||
|
||||
find_package(Python ${MINIMUM_PYTHON_VERSION} REQUIRED COMPONENTS Development Interpreter)
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_PYTHON_VERSION)
|
||||
if(Python_VERSION VERSION_LESS ${FUTURE_MINIMUM_PYTHON_VERSION})
|
||||
message(DEPRECATION "Support for Python versions < ${FUTURE_MINIMUM_GLFW_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(nanobind REQUIRED CONFIG)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(nanobind
|
||||
FOUND_VAR nanobind_FOUND
|
||||
REQUIRED_VARS NB_DIR
|
||||
VERSION_VAR nanobind_VERSION)
|
||||
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_NANOBIND_VERSION)
|
||||
if(nanobind_VERSION VERSION_LESS ${FUTURE_MINIMUM_NANOBIND_VERSION})
|
||||
message(DEPRECATION "Support for nanobind versions < ${FUTURE_MINIMUM_NANOBIND_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED VDB_PYTHON_INSTALL_DIRECTORY)
|
||||
if(DEFINED Python_SITELIB)
|
||||
get_filename_component(Python_PACKAGES_DIR ${Python_SITELIB} NAME)
|
||||
else()
|
||||
set(Python_PACKAGES_DIR "site-packages")
|
||||
endif()
|
||||
set(VDB_PYTHON_INSTALL_DIRECTORY
|
||||
${CMAKE_INSTALL_LIBDIR}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/${Python_PACKAGES_DIR}
|
||||
CACHE STRING "The directory to install the openvdb and nanovdb Python modules."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
# Validate the OpenVDB ABI Version. If OpenVDB_ABI is not set, we're either building
|
||||
# the core library OR the ABI hasn't been deduced from a VDB installation. Use the
|
||||
|
||||
+19
-16
@@ -22,7 +22,7 @@ open source software best practice policies of the Linux Foundation.
|
||||
|
||||
#### License
|
||||
|
||||
OpenVDB is licensed under the [Mozilla Public License, version 2.0](LICENSE.md)
|
||||
OpenVDB is licensed under the [Apache License, version 2.0](LICENSE.md)
|
||||
license. Contributions to OpenVDB should abide by that standard
|
||||
license.
|
||||
|
||||
@@ -54,21 +54,23 @@ Every commit must be signed off. That is, every commit log message
|
||||
must include a “`Signed-off-by`” line (generated, for example, with
|
||||
“`git commit --signoff`”), indicating that the committer wrote the
|
||||
code and has the right to release it under the
|
||||
[Mozilla Public License, version 2.0](LICENSE.md)
|
||||
[Apache License, version 2.0](LICENSE.md)
|
||||
license. See the [TAC documentation on contribution sign off](https://github.com/AcademySoftwareFoundation/tac/blob/master/process/contributing.md#contribution-sign-off) for more information on this requirement.
|
||||
|
||||
## Committer
|
||||
## Maintainer
|
||||
|
||||
The committer role enables the participant to commit code directly to the repository, but also comes with the obligation to be a responsible leader in the community.
|
||||
The maintainer role is the equivalent of the "Committer" role in the charter.
|
||||
|
||||
### Process for becoming a committer
|
||||
This role enables the participant to commit code directly to the repository, but also comes with the obligation to be a responsible leader in the community.
|
||||
|
||||
### Process for becoming a maintainer
|
||||
|
||||
* Show your experience with the codebase through contributions and engagement on the community channels.
|
||||
* Request to become a committer.
|
||||
* Have the majority of committers approve you becoming a committer.
|
||||
* Request to become a maintainer.
|
||||
* Have the majority of maintainers approve you becoming a maintainer.
|
||||
* Your name and email is added to the MAINTAINERS.md file for the project.
|
||||
|
||||
### Committer responsibilities
|
||||
### Maintainer responsibilities
|
||||
|
||||
* Monitor email aliases.
|
||||
* Monitor Slack (delayed response is perfectly acceptable).
|
||||
@@ -76,28 +78,29 @@ The committer role enables the participant to commit code directly to the reposi
|
||||
* Make sure that ongoing PRs are moving forward at the right pace or close them.
|
||||
* Remain an active contributor to the project in general and the code base in particular.
|
||||
|
||||
### When does a committer lose committer status?
|
||||
### When does a maintainer lose maintainer status?
|
||||
|
||||
If a committer is no longer interested or cannot perform the committer duties listed above, they
|
||||
If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they
|
||||
should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of
|
||||
the committers per the voting process below.
|
||||
the maintainers per the voting process below.
|
||||
|
||||
## Technical Steering Committee (TSC) member
|
||||
|
||||
The Technical Steering Committee (TSC) oversees the overall technical direction of OpenVDB, as defined in the [charter](charter.md).
|
||||
|
||||
TSC voting members consist of committers that have been nominated by the committers, with a supermajority of voting members required to have a committer elected to be a TSC voting member. TSC voting members term and succession is defined in the [charter](charter.md).
|
||||
TSC voting members consist of maintainers that have been nominated by the TSC, with a supermajority of voting members required to have a maintainer elected to be a TSC voting member. TSC voting members term and succession is defined in the [charter](charter.md).
|
||||
|
||||
All meetings of the TSC are open to participation by any member of the OpenVDB community. Meeting times are listed in the [ASWF technical community calendar](https://lists.aswf.io/g/tac/calendar).
|
||||
|
||||
## Current TSC members
|
||||
|
||||
* Ken Museth, Chair / NVIDIA
|
||||
* Andre Pradhana, DreamWorks
|
||||
* Ken Museth (Chair), Nvidia
|
||||
* Andre Pradhana, Nvidia
|
||||
* Jeff Lait, SideFX
|
||||
* Nick Avramoussis, WETA
|
||||
* Nick Avramoussis, WETA FX
|
||||
* Dan Bailey, ILM
|
||||
* Richard Jones, DNEG
|
||||
* Richard Jones, ILM
|
||||
* Gregory Hurst, United Therapeutics
|
||||
|
||||
# Release Process
|
||||
|
||||
|
||||
@@ -1,373 +1,176 @@
|
||||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
2.1. Grants
|
||||
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
2.2. Effective Date
|
||||
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
|
||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||
---------------------------------------------------------
|
||||
|
||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
defined by the Mozilla Public License, v. 2.0.
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
@@ -14,3 +14,5 @@ The current OpenVDB maintainers are:
|
||||
| Ken Museth | ken.museth@gmail.com
|
||||
| Andre Pradhana | andre.pradhana@gmail.com
|
||||
| Richard Jones | richardj@ilm.com
|
||||
| Gregory Hurst | tbd
|
||||
| Jonathan Swartz | tbd
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
The following copyright holders agree that all of their contributions
|
||||
originally submitted to this project under the Mozilla Public License
|
||||
Version 2.0, are hereby relicensed to the Apache License, Version 2.0,
|
||||
and are submitted pursuant to the Developer Certificate of Origin, version 1.1:
|
||||
|
||||
Ken Museth
|
||||
Mehdi Chinoune
|
||||
DreamWorks Animation
|
||||
Side Effects Software Inc.
|
||||
Blender Foundation
|
||||
NVIDIA Corporation
|
||||
United Therapeutics Corporation
|
||||
Digital Domain 3.0, Inc.
|
||||
Double Negative
|
||||
Ubisoft Entertainment SA
|
||||
Adobe Inc.
|
||||
Mathieu Malaterre
|
||||
Brecht Sanders
|
||||
Ignacio Vizzo
|
||||
Ben FrantzDale
|
||||
Sebastian Gaida
|
||||
Alessio Quaglino
|
||||
Benedikt Mersch
|
||||
David Aguilar
|
||||
Brian Sharpe
|
||||
Kartik Shrivastava
|
||||
Michael Lackner
|
||||
Lucas Baraya
|
||||
Kuba Roth
|
||||
Tom Cnops
|
||||
Walt Disney Pictures (Walt Disney Animation Studios)
|
||||
The Linux Foundation
|
||||
Industrial Light & Magic (ILM)
|
||||
@@ -10,7 +10,7 @@
|
||||
[Discussion Forum](https://github.com/AcademySoftwareFoundation/openvdb/discussions) |
|
||||
[Documentation](https://www.openvdb.org/documentation/doxygen) |
|
||||
[Releases](https://github.com/AcademySoftwareFoundation/openvdb/releases) |
|
||||
[License](https://www.mozilla.org/MPL/2.0) |
|
||||
[License](https://www.apache.org/licenses/LICENSE-2.0) |
|
||||
[Slack](https://slack.aswf.io/)
|
||||
|
||||
OpenVDB is an open source C++ library comprising a novel hierarchical data
|
||||
@@ -28,13 +28,15 @@ generally less stable than the [production releases](https://github.com/AcademyS
|
||||
|
||||
### License
|
||||
|
||||
OpenVDB is released under the [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/),
|
||||
OpenVDB is released under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0),
|
||||
which is a free, open source software license developed and maintained by the
|
||||
Mozilla Foundation.
|
||||
Apache Software Foundation.
|
||||
|
||||
The trademarks of any contributor to this project may not be used in
|
||||
association with the project without the contributor's express permission.
|
||||
|
||||
NOTE: OpenVDB has completed re-licensing from [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/) to [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). Please see the file RE-LICENSE_NOTE.txt for more details.
|
||||
|
||||
### Contributing
|
||||
|
||||
OpenVDB welcomes contributions to the OpenVDB project. Please refer to the
|
||||
|
||||
+19
-9
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -e
|
||||
|
||||
@@ -31,8 +33,13 @@ PARMS[--target]=install
|
||||
PARMS[--build-dir]=build
|
||||
|
||||
if [[ $RUNNER_NAME == *"8c-32g-300h"* ]]; then
|
||||
# ASWF github actions runners have 8 threads
|
||||
PARMS[-j]=8
|
||||
if [[ $CXX == "g++" ]]; then
|
||||
# GCC hits memory limits on runners, reduce threads
|
||||
PARMS[-j]=6
|
||||
else
|
||||
# ASWF github actions runners have 8 threads
|
||||
PARMS[-j]=8
|
||||
fi
|
||||
else
|
||||
# Github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
@@ -49,7 +56,8 @@ declare -A COMPONENTS
|
||||
COMPONENTS['core']='OPENVDB_BUILD_CORE'
|
||||
COMPONENTS['python']='OPENVDB_BUILD_PYTHON_MODULE'
|
||||
COMPONENTS['test']='OPENVDB_BUILD_UNITTESTS'
|
||||
COMPONENTS['bin']='OPENVDB_BUILD_BINARIES'
|
||||
# @todo split out vdb tool from this...
|
||||
COMPONENTS['bin']='OPENVDB_BUILD_VDB_PRINT,OPENVDB_BUILD_VDB_LOD,OPENVDB_BUILD_VDB_TOOL,OPENVDB_BUILD_VDB_TOOL_UNITTESTS'
|
||||
COMPONENTS['view']='OPENVDB_BUILD_VDB_VIEW'
|
||||
COMPONENTS['render']='OPENVDB_BUILD_VDB_RENDER'
|
||||
COMPONENTS['hou']='OPENVDB_BUILD_HOUDINI_PLUGIN'
|
||||
@@ -148,7 +156,11 @@ for comp in "${!COMPONENTS[@]}"; do
|
||||
setting="ON"; break
|
||||
fi
|
||||
done
|
||||
CMAKE_EXTRA+=("-D${COMPONENTS[$comp]}=$setting")
|
||||
OPENVDB_TOGGLES="${COMPONENTS[$comp]}"
|
||||
OPENVDB_TOGGLES=(${OPENVDB_TOGGLES//,/ })
|
||||
for toggle in "${!OPENVDB_TOGGLES[@]}"; do
|
||||
CMAKE_EXTRA+=("-D${OPENVDB_TOGGLES[$toggle]}=$setting")
|
||||
done
|
||||
done
|
||||
|
||||
################################################
|
||||
@@ -180,16 +192,14 @@ cd ${BUILD_DIR}
|
||||
set -x
|
||||
|
||||
# Note:
|
||||
# - print and lod binary options are always on and can be toggles with: OPENVDB_BUILD_BINARIES=ON/OFF
|
||||
# - OPENVDB_BUILD_BINARIES is always ON, but each binary will be toggled depending on the provided comps
|
||||
# - always enabled the python tests with OPENVDB_BUILD_PYTHON_UNITTESTS if the python module is in use,
|
||||
# regardless of the 'test' component being enabled or not (see the OPENVDB_BUILD_PYTHON_UNITTESTS option).
|
||||
cmake \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_9=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_10=ON \
|
||||
-DOPENVDB_BUILD_VDB_PRINT=ON \
|
||||
-DOPENVDB_BUILD_VDB_LOD=ON \
|
||||
-DOPENVDB_BUILD_VDB_TOOL=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_11=ON \
|
||||
-DOPENVDB_TOOL_USE_NANO=OFF \
|
||||
-DOPENVDB_BUILD_BINARIES=ON \
|
||||
-DOPENVDB_BUILD_PYTHON_UNITTESTS=ON \
|
||||
-DMSVC_MP_THREAD_COUNT=${PARMS[-j]} \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Python script to download the latest Houdini builds
|
||||
# using the SideFX download API:
|
||||
|
||||
+24
-16
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
@@ -6,8 +8,14 @@ HOUDINI_MAJOR="$1"
|
||||
PLATFORM="$2"
|
||||
OTHER_ARGS="$3"
|
||||
|
||||
pip install --user requests
|
||||
python ci/download_houdini.py $HOUDINI_MAJOR $PLATFORM $OTHER_ARGS
|
||||
if [[ $PLATFORM =~ "linux" ]]; then
|
||||
pip3 install --user requests
|
||||
elif [[ $PLATFORM =~ "macos" ]]; then
|
||||
# Tell the homebrew install of pip3 that we don't care about installing directly through pip3
|
||||
pip3 install --user requests --break-system-packages
|
||||
fi
|
||||
|
||||
python3 ci/download_houdini.py $HOUDINI_MAJOR $PLATFORM $OTHER_ARGS
|
||||
|
||||
if [[ $PLATFORM =~ "linux" ]]; then
|
||||
# create dir hierarchy
|
||||
@@ -29,20 +37,20 @@ if [[ $PLATFORM =~ "linux" ]]; then
|
||||
ls -al dsolib/
|
||||
|
||||
# copy required libraries
|
||||
cp -r toolkit/cmake ../hou/toolkit/.
|
||||
cp -r toolkit/include ../hou/toolkit/.
|
||||
cp -r dsolib/libHoudini* ../hou/dsolib/.
|
||||
cp -r dsolib/libopenvdb_sesi* ../hou/dsolib/.
|
||||
cp -r dsolib/libblosc* ../hou/dsolib/.
|
||||
cp -r dsolib/libhboost* ../hou/dsolib/.
|
||||
cp -r dsolib/libz* ../hou/dsolib/.
|
||||
cp -r dsolib/libbz2* ../hou/dsolib/.
|
||||
cp -r dsolib/libtbb* ../hou/dsolib/.
|
||||
cp -r dsolib/libjemalloc* ../hou/dsolib/.
|
||||
cp -r dsolib/liblzma* ../hou/dsolib/.
|
||||
cp -r dsolib/libIex* ../hou/dsolib/.
|
||||
cp -r dsolib/libImath* ../hou/dsolib/.
|
||||
cp -r dsolib/libIlmThread* ../hou/dsolib/.
|
||||
mv toolkit/cmake ../hou/toolkit/.
|
||||
mv toolkit/include ../hou/toolkit/.
|
||||
mv dsolib/libHoudini* ../hou/dsolib/.
|
||||
mv dsolib/libopenvdb_sesi* ../hou/dsolib/.
|
||||
mv dsolib/libblosc* ../hou/dsolib/.
|
||||
mv dsolib/libhboost* ../hou/dsolib/.
|
||||
mv dsolib/libz* ../hou/dsolib/.
|
||||
mv dsolib/libbz2* ../hou/dsolib/.
|
||||
mv dsolib/libtbb* ../hou/dsolib/.
|
||||
mv dsolib/libjemalloc* ../hou/dsolib/.
|
||||
mv dsolib/liblzma* ../hou/dsolib/.
|
||||
mv dsolib/libIex* ../hou/dsolib/.
|
||||
mv dsolib/libImath* ../hou/dsolib/.
|
||||
mv dsolib/libIlmThread* ../hou/dsolib/.
|
||||
cd ..
|
||||
|
||||
elif [[ $PLATFORM =~ "macos" ]]; then
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#################################################################################
|
||||
# This script extracts all code blocks from AX documentation which are NOT #
|
||||
# marked as cpp/sh/unparsed and attempts to parse or compile them through the #
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
CURL_VERSION="$1"
|
||||
|
||||
wget -O cppunit.tar.gz https://dev-www.libreoffice.org/src/cppunit-${CURL_VERSION}.tar.gz
|
||||
|
||||
tar -xzf cppunit.tar.gz
|
||||
|
||||
cd cppunit-${CURL_VERSION}
|
||||
|
||||
./configure
|
||||
|
||||
make -j8
|
||||
make install
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
@@ -13,6 +15,6 @@ fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ../.
|
||||
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ../.
|
||||
make -j8
|
||||
make install
|
||||
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
EXR_VERSION="$1"
|
||||
|
||||
git clone https://github.com/AcademySoftwareFoundation/openexr.git
|
||||
cd openexr
|
||||
|
||||
if [ "$EXR_VERSION" != "latest" ]; then
|
||||
git checkout tags/${EXR_VERSION} -b ${EXR_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
GLFW_VERSION="$1"
|
||||
|
||||
git clone https://github.com/glfw/glfw.git
|
||||
cd glfw
|
||||
|
||||
if [ "$GLFW_VERSION" != "latest" ]; then
|
||||
git checkout tags/${GLFW_VERSION} -b ${GLFW_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j8
|
||||
make install
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
GTEST_VERSION="$1"
|
||||
|
||||
git clone https://github.com/google/googletest.git
|
||||
cd googletest
|
||||
|
||||
if [ "$GTEST_VERSION" != "latest" ]; then
|
||||
git checkout tags/${GTEST_VERSION} -b ${GTEST_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
IMATH_VERSION="$1"
|
||||
|
||||
git clone https://github.com/AcademySoftwareFoundation/Imath.git
|
||||
cd Imath
|
||||
|
||||
if [ "$IMATH_VERSION" != "latest" ]; then
|
||||
git checkout tags/${IMATH_VERSION} -b ${IMATH_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
@@ -1,27 +1,58 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
LLVM_CRT="$1"
|
||||
LLVM_VER="$1"
|
||||
LLVM_CRT="$2"
|
||||
|
||||
git clone -b llvmorg-12.0.0 --depth 1 https://github.com/llvm/llvm-project.git llvm
|
||||
# Legacy define for older versions of LLVM
|
||||
LLVM_LEGACY_CRT_DEFINE=""
|
||||
if [[ "${LLVM_CRT}" == "MultiThreaded" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MT"
|
||||
elif [[ "${LLVM_CRT}" == "MultiThreadedDebug" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MTd"
|
||||
elif [[ "${LLVM_CRT}" == "MultiThreadedDLL" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MD"
|
||||
elif [[ "${LLVM_CRT}" == "MultiThreadedDebugDLL" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MDd"
|
||||
fi
|
||||
|
||||
git clone -b llvmorg-${LLVM_VER} --depth 1 https://github.com/llvm/llvm-project.git llvm
|
||||
cd llvm
|
||||
|
||||
mkdir .build
|
||||
cd .build
|
||||
|
||||
# @note currently only test static builds with MT
|
||||
cmake -B . -S ../llvm -A x64 -G "Visual Studio 17 2022" -Thost=x64 \
|
||||
-DCMAKE_INSTALL_PREFIX="${HOME}/llvm_install" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DLLVM_ENABLE_ASSERTIONS=OFF \
|
||||
-DLLVM_ENABLE_PROJECTS="" \
|
||||
-DLLVM_ENABLE_RUNTIMES="" \
|
||||
-DLLVM_ENABLE_UNWIND_TABLES=OFF \
|
||||
-DLLVM_TARGETS_TO_BUILD="host" \
|
||||
-DLLVM_BUILD_TOOLS=OFF \
|
||||
-DLLVM_INCLUDE_BENCHMARKS=OFF \
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF \
|
||||
-DLLVM_INCLUDE_TESTS=OFF \
|
||||
-DLLVM_INCLUDE_DOCS=OFF \
|
||||
-DLLVM_INCLUDE_TOOLS=OFF \
|
||||
-DLLVM_USE_CRT_RELEASE=${LLVM_CRT}
|
||||
-DLLVM_INCLUDE_UTILS=OFF \
|
||||
-DLLVM_BUILD_BENCHMARKS=OFF \
|
||||
-DLLVM_BUILD_EXAMPLES=OFF \
|
||||
-DLLVM_BUILD_TESTS=OFF \
|
||||
-DLLVM_BUILD_DOCS=OFF \
|
||||
-DLLVM_BUILD_TOOLS=OFF \
|
||||
-DLLVM_BUILD_UTILS=OFF \
|
||||
-DLLVM_ENABLE_BINDINGS=OFF \
|
||||
-DLLVM_ENABLE_OCAMLDOC=OFF \
|
||||
-DLLVM_PARALLEL_COMPILE_JOBS=4 \
|
||||
-DLLVM_PARALLEL_LINK_JOBS=4 \
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=${LLVM_CRT} \
|
||||
-DLLVM_USE_CRT_RELEASE=${LLVM_LEGACY_CRT_DEFINE}
|
||||
|
||||
cmake --build . --config Release --target install
|
||||
cmake --build . --parallel 4 --config Release --target install
|
||||
|
||||
cd ..
|
||||
|
||||
|
||||
+19
-6
@@ -1,7 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -x
|
||||
|
||||
# Remove Python3 symlinks in /usr/local/bin as workaround to brew update issues
|
||||
# https://github.com/actions/setup-python/issues/577
|
||||
rm /usr/local/bin/2to3* || :
|
||||
rm /usr/local/bin/idle3* || :
|
||||
rm /usr/local/bin/pydoc* || :
|
||||
rm /usr/local/bin/python3* || :
|
||||
|
||||
brew update
|
||||
brew install bash gnu-getopt # for CI scripts
|
||||
brew install boost
|
||||
@@ -11,29 +20,33 @@ brew install glfw
|
||||
brew install googletest
|
||||
brew install jq # for trivial parsing of brew json
|
||||
brew install openexr
|
||||
brew install pybind11 # also installs the dependent python version
|
||||
brew install tbb
|
||||
brew install nanobind # also installs the dependent python version
|
||||
brew install robin-map # required for nanobind
|
||||
brew install numpy # only for python tests
|
||||
brew install zlib
|
||||
brew install jemalloc
|
||||
|
||||
# Alias python version installed by pybind11 to path
|
||||
py_version=$(brew info pybind11 --json | \
|
||||
# Alias python version installed by nanobind to path
|
||||
py_version=$(brew info nanobind --json | \
|
||||
jq -cr '.[].dependencies[] | select(. | startswith("python"))')
|
||||
echo "Using python $py_version"
|
||||
# export for subsequent action steps (note, not exported for this env)
|
||||
echo "Python_ROOT_DIR=/usr/local/opt/$py_version" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/$py_version/bin" >> $GITHUB_PATH
|
||||
|
||||
# use bash
|
||||
echo "/usr/local/opt/bash/bin" >> $GITHUB_PATH
|
||||
echo "/opt/homebrew/opt/bash/bin" >> $GITHUB_PATH
|
||||
|
||||
# use gnu-getopt
|
||||
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
echo "/opt/homebrew/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
|
||||
LLVM_VERSION=$1
|
||||
if [ ! -z "$LLVM_VERSION" ]; then
|
||||
if [ "$LLVM_VERSION" == "latest" ]; then
|
||||
brew install llvm
|
||||
brew install cppunit
|
||||
else
|
||||
brew install llvm@$LLVM_VERSION
|
||||
brew install cppunit
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
@@ -9,8 +11,8 @@ if [ ! -z "${INSTALL_ROOT}" ]; then
|
||||
CMAKE_EXTRA+=("-DCMAKE_INSTALL_PREFIX=${INSTALL_ROOT}")
|
||||
fi
|
||||
|
||||
git clone https://github.com/pybind/pybind11.git
|
||||
cd pybind11
|
||||
git clone --recurse-submodules https://github.com/wjakob/nanobind.git
|
||||
cd nanobind
|
||||
|
||||
if [ "$PYBIND11_VERSION" != "latest" ]; then
|
||||
git checkout tags/v${PYBIND11_VERSION} -b v${PYBIND11_VERSION}
|
||||
@@ -20,9 +22,9 @@ mkdir build
|
||||
cd build
|
||||
|
||||
cmake \
|
||||
-DPYBIND11_TEST=OFF \
|
||||
-DNB_TEST=OFF \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
make -j8
|
||||
make install
|
||||
sudo make install
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -x
|
||||
|
||||
brew update
|
||||
brew install tbb
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
# Download the TeX Live installer
|
||||
wget https://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
|
||||
|
||||
# Extract
|
||||
tar xzf install-tl-unx.tar.gz
|
||||
rm install-tl-unx.tar.gz
|
||||
cd install-tl-*
|
||||
|
||||
# Run the installer with no docs or source installation
|
||||
./install-tl --no-interaction --no-doc-install --no-src-install --scheme=minimal
|
||||
|
||||
# Export the texlive PATH to GITHUB_PATH
|
||||
TEXLIVE_PATH=/usr/local/texlive/2025/bin/x86_64-linux
|
||||
export PATH=${TEXLIVE_PATH}:${PATH}
|
||||
echo "${TEXLIVE_PATH}" >> $GITHUB_PATH
|
||||
|
||||
# Install the required packages
|
||||
tlmgr install latex-bin dvips collection-fontsrecommended collection-latexrecommended
|
||||
|
||||
# Validate that installing dvips and latex has been successful
|
||||
dvips --version
|
||||
latex --version
|
||||
@@ -0,0 +1,40 @@
|
||||
# Enable verbose and stop on error
|
||||
$ErrorActionPreference = "Stop"
|
||||
$VerbosePreference = "Continue"
|
||||
|
||||
# Required dependencies
|
||||
$vcpkgPackages = @(
|
||||
"zlib",
|
||||
"libpng",
|
||||
"openexr",
|
||||
"tbb",
|
||||
"gtest",
|
||||
"cppunit",
|
||||
"blosc",
|
||||
"glfw3",
|
||||
"glew",
|
||||
"python3",
|
||||
"jemalloc",
|
||||
"boost-iostreams",
|
||||
"boost-interprocess",
|
||||
"boost-algorithm",
|
||||
"nanobind"
|
||||
)
|
||||
|
||||
# Update vcpkg
|
||||
vcpkg update
|
||||
|
||||
# Allow the vcpkg command to fail once so we can retry with the latest
|
||||
try {
|
||||
vcpkg install $vcpkgPackages
|
||||
} catch {
|
||||
Write-Host "vcpkg install failed, retrying with latest ports..."
|
||||
# Retry the installation with updated ports
|
||||
Push-Location $env:VCPKG_INSTALLATION_ROOT
|
||||
git pull
|
||||
Pop-Location
|
||||
vcpkg update
|
||||
vcpkg install $vcpkgPackages
|
||||
}
|
||||
|
||||
Write-Host "vcpkg install completed successfully"
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
vcpkg update
|
||||
vcpkg install zlib libpng openexr tbb gtest cppunit blosc glfw3 glew python3 jemalloc \
|
||||
boost-iostreams boost-interprocess boost-algorithm pybind11 \
|
||||
--clean-after-build
|
||||
@@ -26,12 +26,13 @@ $CUDA_KNOWN_URLS = @{
|
||||
"11.2.1" = "https://developer.download.nvidia.com/compute/cuda/11.2.1/network_installers/cuda_11.2.1_win10_network.exe";
|
||||
"11.2.2" = "https://developer.download.nvidia.com/compute/cuda/11.2.2/network_installers/cuda_11.2.2_win10_network.exe";
|
||||
"11.3.0" = "https://developer.download.nvidia.com/compute/cuda/11.3.0/network_installers/cuda_11.3.0_win10_network.exe";
|
||||
"11.6.2" = "https://developer.download.nvidia.com/compute/cuda/11.6.2/network_installers/cuda_11.6.2_windows_network.exe"
|
||||
"11.6.2" = "https://developer.download.nvidia.com/compute/cuda/11.6.2/network_installers/cuda_11.6.2_windows_network.exe";
|
||||
"12.4.0" = "https://developer.download.nvidia.com/compute/cuda/12.4.0/network_installers/cuda_12.4.0_windows_network.exe"
|
||||
}
|
||||
|
||||
# @todo - change this to be based on _MSC_VER intead, or invert it to be CUDA keyed instead?
|
||||
$VISUAL_STUDIO_MIN_CUDA = @{
|
||||
"2022" = "11.6";
|
||||
"2022" = "12.4";
|
||||
"2019" = "10.1";
|
||||
"2017" = "10.0"; # Depends on which version of 2017! 9.0 to 10.0 depending on version
|
||||
"2015" = "8.0"; # might support older, unsure.
|
||||
|
||||
+3
-1
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
set -e
|
||||
|
||||
# Various tests to test the FindOpenVDB CMake modules and
|
||||
@@ -8,7 +10,7 @@ set -e
|
||||
# the expected VDB installation
|
||||
|
||||
cmakelists="
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(TestInstall LANGUAGES CXX)
|
||||
find_package(OpenVDB REQUIRED COMPONENTS openvdb)
|
||||
add_executable(test_vdb_print \"../openvdb_cmd/vdb_print/main.cc\")
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
|
||||
|
||||
set(CPM_DOWNLOAD_VERSION 0.40.2)
|
||||
set(CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d")
|
||||
|
||||
if(CPM_SOURCE_CACHE)
|
||||
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
else()
|
||||
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
endif()
|
||||
|
||||
# Expand relative path. This is important if the provided path contains a tilde (~)
|
||||
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
|
||||
|
||||
file(DOWNLOAD
|
||||
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
|
||||
)
|
||||
|
||||
include(${CPM_DOWNLOAD_LOCATION})
|
||||
+2
-25
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -88,7 +88,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
mark_as_advanced(
|
||||
@@ -188,22 +188,6 @@ list(APPEND _BLOSC_LIBRARYDIR_SEARCH_DIRS
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Library suffix handling
|
||||
|
||||
set(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
set(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES})
|
||||
|
||||
if(MSVC)
|
||||
if(BLOSC_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
||||
set(CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES};lib")
|
||||
endif()
|
||||
else()
|
||||
if(BLOSC_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(Blosc_LIB_COMPONENTS "")
|
||||
# NOTE: Search for debug version first (see vcpkg hack)
|
||||
list(APPEND BLOSC_BUILD_TYPES DEBUG RELEASE)
|
||||
@@ -246,13 +230,6 @@ foreach(BUILD_TYPE ${BLOSC_BUILD_TYPES})
|
||||
set(CMAKE_IGNORE_PATH ${_BLOSC_CMAKE_IGNORE_PATH})
|
||||
endforeach()
|
||||
|
||||
# Reset library suffix
|
||||
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
set(CMAKE_FIND_LIBRARY_PREFIXES ${_BLOSC_ORIG_CMAKE_FIND_LIBRARY_PREFIXES})
|
||||
unset(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
unset(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
|
||||
|
||||
if(Blosc_LIBRARY_DEBUG AND Blosc_LIBRARY_RELEASE)
|
||||
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||
# single-config generators, set optimized and debug libraries
|
||||
|
||||
@@ -1,320 +0,0 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
FindCppUnit
|
||||
-----------
|
||||
|
||||
Find CppUnit include dirs and libraries
|
||||
|
||||
Use this module by invoking find_package with the form::
|
||||
|
||||
find_package(CppUnit
|
||||
[version] [EXACT] # Minimum or EXACT version
|
||||
[REQUIRED] # Fail with error if CppUnit is not found
|
||||
)
|
||||
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``CppUnit::cppunit``
|
||||
This module defines IMPORTED target CppUnit::cppunit, if CppUnit has been
|
||||
found.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This will define the following variables:
|
||||
|
||||
``CppUnit_FOUND``
|
||||
True if the system has the CppUnit library.
|
||||
``CppUnit_VERSION``
|
||||
The version of the CppUnit library which was found.
|
||||
``CppUnit_INCLUDE_DIRS``
|
||||
Include directories needed to use CppUnit.
|
||||
``CppUnit_RELEASE_LIBRARIES``
|
||||
Libraries needed to link to the release version of CppUnit.
|
||||
``CppUnit_RELEASE_LIBRARY_DIRS``
|
||||
CppUnit release library directories.
|
||||
``CppUnit_DEBUG_LIBRARIES``
|
||||
Libraries needed to link to the debug version of CppUnit.
|
||||
``CppUnit_DEBUG_LIBRARY_DIRS``
|
||||
CppUnit debug library directories.
|
||||
|
||||
Deprecated - use [RELEASE|DEBUG] variants:
|
||||
|
||||
``CppUnit_LIBRARIES``
|
||||
Libraries needed to link to CppUnit.
|
||||
``CppUnit_LIBRARY_DIRS``
|
||||
CppUnit library directories.
|
||||
|
||||
Cache Variables
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The following cache variables may also be set:
|
||||
|
||||
``CppUnit_INCLUDE_DIR``
|
||||
The directory containing ``cppunit/Portability.h``.
|
||||
``CppUnit_LIBRARY``
|
||||
The path to the CppUnit library.
|
||||
|
||||
Hints
|
||||
^^^^^
|
||||
|
||||
Instead of explicitly setting the cache variables, the following variables
|
||||
may be provided to tell this module where to look.
|
||||
|
||||
``CppUnit_ROOT``
|
||||
Preferred installation prefix.
|
||||
``CPPUNIT_INCLUDEDIR``
|
||||
Preferred include directory e.g. <prefix>/include
|
||||
``CPPUNIT_LIBRARYDIR``
|
||||
Preferred library directory e.g. <prefix>/lib
|
||||
``CPPUNIT_DEBUG_SUFFIX``
|
||||
Suffix of the debug version of CppUnit libs. Defaults to "_d".
|
||||
``SYSTEM_LIBRARY_PATHS``
|
||||
Global list of library paths intended to be searched by and find_xxx call
|
||||
``CPPUNIT_USE_STATIC_LIBS``
|
||||
Only search for static cppunit libraries
|
||||
``DISABLE_CMAKE_SEARCH_PATHS``
|
||||
Disable CMakes default search paths for find_xxx calls in this module
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
mark_as_advanced(
|
||||
CppUnit_INCLUDE_DIR
|
||||
CppUnit_LIBRARY
|
||||
)
|
||||
|
||||
set(_FIND_CPPUNIT_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
set(_FIND_CPPUNIT_ADDITIONAL_OPTIONS NO_DEFAULT_PATH)
|
||||
endif()
|
||||
|
||||
# Set _CPPUNIT_ROOT based on a user provided root var. Xxx_ROOT and ENV{Xxx_ROOT}
|
||||
# are prioritised over the legacy capitalized XXX_ROOT variables for matching
|
||||
# CMake 3.12 behaviour
|
||||
# @todo deprecate -D and ENV CPPUNIT_ROOT from CMake 3.12
|
||||
if(CppUnit_ROOT)
|
||||
set(_CPPUNIT_ROOT ${CppUnit_ROOT})
|
||||
elseif(DEFINED ENV{CppUnit_ROOT})
|
||||
set(_CPPUNIT_ROOT $ENV{CppUnit_ROOT})
|
||||
elseif(CPPUNIT_ROOT)
|
||||
set(_CPPUNIT_ROOT ${CPPUNIT_ROOT})
|
||||
elseif(DEFINED ENV{CPPUNIT_ROOT})
|
||||
set(_CPPUNIT_ROOT $ENV{CPPUNIT_ROOT})
|
||||
endif()
|
||||
|
||||
# Additionally try and use pkconfig to find cppunit
|
||||
if(USE_PKGCONFIG)
|
||||
if(NOT DEFINED PKG_CONFIG_FOUND)
|
||||
find_package(PkgConfig)
|
||||
endif()
|
||||
pkg_check_modules(PC_CppUnit QUIET cppunit)
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for CppUnit include DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
set(_CPPUNIT_INCLUDE_SEARCH_DIRS "")
|
||||
list(APPEND _CPPUNIT_INCLUDE_SEARCH_DIRS
|
||||
${CPPUNIT_INCLUDEDIR}
|
||||
${_CPPUNIT_ROOT}
|
||||
${PC_CppUnit_INCLUDEDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Look for a standard cppunit header file.
|
||||
find_path(CppUnit_INCLUDE_DIR cppunit/Portability.h
|
||||
${_FIND_CPPUNIT_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_CPPUNIT_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
|
||||
if(EXISTS "${CppUnit_INCLUDE_DIR}/cppunit/Portability.h")
|
||||
file(STRINGS "${CppUnit_INCLUDE_DIR}/cppunit/Portability.h"
|
||||
_cppunit_version_string REGEX "#define CPPUNIT_VERSION "
|
||||
)
|
||||
string(REGEX REPLACE "#define CPPUNIT_VERSION +\"(.+)\".*$" "\\1"
|
||||
_cppunit_version_string "${_cppunit_version_string}"
|
||||
)
|
||||
string(STRIP "${_cppunit_version_string}" CppUnit_VERSION)
|
||||
unset(_cppunit_version_string )
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for CppUnit lib DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(NOT DEFINED CPPUNIT_DEBUG_SUFFIX)
|
||||
set(CPPUNIT_DEBUG_SUFFIX "d")
|
||||
endif()
|
||||
|
||||
set(_CPPUNIT_LIBRARYDIR_SEARCH_DIRS "")
|
||||
list(APPEND _CPPUNIT_LIBRARYDIR_SEARCH_DIRS
|
||||
${CPPUNIT_LIBRARYDIR}
|
||||
${_CPPUNIT_ROOT}
|
||||
${PC_CppUnit_LIBDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Library suffix handling
|
||||
|
||||
set(_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
if(MSVC)
|
||||
if(CPPUNIT_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
||||
else()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "_dll.lib")
|
||||
endif()
|
||||
else()
|
||||
if(CPPUNIT_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
list(APPEND CPPUNIT_BUILD_TYPES RELEASE DEBUG)
|
||||
|
||||
foreach(BUILD_TYPE ${CPPUNIT_BUILD_TYPES})
|
||||
set(_CPPUNIT_LIB_NAME cppunit)
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
set(_CPPUNIT_LIB_NAME "${_CPPUNIT_LIB_NAME}${CPPUNIT_DEBUG_SUFFIX}")
|
||||
endif()
|
||||
|
||||
# Find the lib
|
||||
find_library(CppUnit_LIBRARY_${BUILD_TYPE} ${_CPPUNIT_LIB_NAME}
|
||||
${_FIND_CPPUNIT_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_CPPUNIT_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
|
||||
)
|
||||
endforeach()
|
||||
|
||||
# Reset library suffix
|
||||
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
unset(_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
|
||||
if(CppUnit_LIBRARY_DEBUG AND CppUnit_LIBRARY_RELEASE)
|
||||
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||
# single-config generators, set optimized and debug libraries
|
||||
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(_isMultiConfig OR CMAKE_BUILD_TYPE)
|
||||
set(CppUnit_LIBRARY optimized ${CppUnit_LIBRARY_RELEASE} debug ${CppUnit_LIBRARY_DEBUG})
|
||||
else()
|
||||
# For single-config generators where CMAKE_BUILD_TYPE has no value,
|
||||
# just use the release libraries
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE})
|
||||
endif()
|
||||
# FIXME: This probably should be set for both cases
|
||||
set(CppUnit_LIBRARIES optimized ${CppUnit_LIBRARY_RELEASE} debug ${CppUnit_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# if only the release version was found, set the debug variable also to the release version
|
||||
if(CppUnit_LIBRARY_RELEASE AND NOT CppUnit_LIBRARY_DEBUG)
|
||||
set(CppUnit_LIBRARY_DEBUG ${CppUnit_LIBRARY_RELEASE})
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE})
|
||||
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_RELEASE})
|
||||
endif()
|
||||
|
||||
# if only the debug version was found, set the release variable also to the debug version
|
||||
if(CppUnit_LIBRARY_DEBUG AND NOT CppUnit_LIBRARY_RELEASE)
|
||||
set(CppUnit_LIBRARY_RELEASE ${CppUnit_LIBRARY_DEBUG})
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_DEBUG})
|
||||
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# If the debug & release library ends up being the same, omit the keywords
|
||||
if("${CppUnit_LIBRARY_RELEASE}" STREQUAL "${CppUnit_LIBRARY_DEBUG}")
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE} )
|
||||
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_RELEASE} )
|
||||
endif()
|
||||
|
||||
if(CppUnit_LIBRARY)
|
||||
set(CppUnit_FOUND TRUE)
|
||||
else()
|
||||
set(CppUnit_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Cache and set CppUnit_FOUND
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(CppUnit
|
||||
FOUND_VAR CppUnit_FOUND
|
||||
REQUIRED_VARS
|
||||
CppUnit_LIBRARY
|
||||
CppUnit_INCLUDE_DIR
|
||||
VERSION_VAR CppUnit_VERSION
|
||||
)
|
||||
|
||||
if(NOT CppUnit_FOUND)
|
||||
if(CppUnit_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Unable to find CppUnit")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Partition release/debug lib vars
|
||||
|
||||
set(CppUnit_RELEASE_LIBRARIES ${CppUnit_LIBRARY_RELEASE})
|
||||
get_filename_component(CppUnit_RELEASE_LIBRARY_DIRS ${CppUnit_RELEASE_LIBRARIES} DIRECTORY)
|
||||
set(CppUnit_DEBUG_LIBRARIES ${CppUnit_LIBRARY_DEBUG})
|
||||
get_filename_component(CppUnit_DEBUG_LIBRARY_DIRS ${CppUnit_DEBUG_LIBRARIES} DIRECTORY)
|
||||
set(CppUnit_LIBRARIES ${CppUnit_RELEASE_LIBRARIES})
|
||||
set(CppUnit_LIBRARY_DIRS ${CppUnit_RELEASE_LIBRARY_DIRS})
|
||||
set(CppUnit_INCLUDE_DIRS ${CppUnit_INCLUDE_DIR})
|
||||
|
||||
# Configure lib type. If XXX_USE_STATIC_LIBS, we always assume a static
|
||||
# lib is in use. If win32, we can't mark the import .libs as shared, so
|
||||
# these are always marked as UNKNOWN. Otherwise, infer from extension.
|
||||
set(CPPUNIT_LIB_TYPE UNKNOWN)
|
||||
if(CPPUNIT_USE_STATIC_LIBS)
|
||||
set(CPPUNIT_LIB_TYPE STATIC)
|
||||
elseif(UNIX)
|
||||
get_filename_component(_CPPUNIT_EXT ${CppUnit_LIBRARY_RELEASE} EXT)
|
||||
if(_CPPUNIT_EXT STREQUAL ".a")
|
||||
set(CPPUNIT_LIB_TYPE STATIC)
|
||||
elseif(_CPPUNIT_EXT STREQUAL ".so" OR
|
||||
_CPPUNIT_EXT STREQUAL ".dylib")
|
||||
set(CPPUNIT_LIB_TYPE SHARED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET CppUnit::cppunit)
|
||||
add_library(CppUnit::cppunit ${CPPUNIT_LIB_TYPE} IMPORTED)
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
INTERFACE_COMPILE_OPTIONS "${PC_CppUnit_CFLAGS_OTHER}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CppUnit_INCLUDE_DIRS}")
|
||||
|
||||
# Standard location
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${CppUnit_LIBRARY}")
|
||||
|
||||
# Release location
|
||||
if(EXISTS "${CppUnit_LIBRARY_RELEASE}")
|
||||
set_property(TARGET CppUnit::cppunit APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
|
||||
IMPORTED_LOCATION_RELEASE "${CppUnit_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
# Debug location
|
||||
if(EXISTS "${CppUnit_LIBRARY_DEBUG}")
|
||||
set_property(TARGET CppUnit::cppunit APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
|
||||
IMPORTED_LOCATION_DEBUG "${CppUnit_LIBRARY_DEBUG}")
|
||||
endif()
|
||||
endif()
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -64,7 +64,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -87,7 +87,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
include (FindPackageHandleStandardArgs)
|
||||
|
||||
if(NCCL_ROOT)
|
||||
set(_NCCL_ROOT ${NCCL_ROOT})
|
||||
elseif(DEFINED ENV{NCCL_ROOT})
|
||||
set(_NCCL_ROOT $ENV{NCCL_ROOT})
|
||||
endif()
|
||||
|
||||
set(_NCCL_INCLUDE_SEARCH_DIRS "")
|
||||
list(APPEND _NCCL_INCLUDE_SEARCH_DIRS
|
||||
${_NCCL_ROOT}/include
|
||||
)
|
||||
find_path(NCCL_INCLUDE_DIR
|
||||
NAMES nccl.h
|
||||
PATHS ${_NCCL_INCLUDE_SEARCH_DIRS}
|
||||
)
|
||||
|
||||
set(_NCCL_LIBRARY_SEARCH_DIRS "")
|
||||
list(APPEND _NCCL_LIBRARY_SEARCH_DIRS
|
||||
${_NCCL_ROOT}/bin
|
||||
)
|
||||
find_library(NCCL_LIBRARY
|
||||
NAMES nccl
|
||||
PATHS ${_NCCL_LIBRARY_SEARCH_DIRS}
|
||||
)
|
||||
|
||||
find_package_handle_standard_args(NCCL REQUIRED_VARS NCCL_INCLUDE_DIR NCCL_LIBRARY)
|
||||
|
||||
if (NCCL_FOUND)
|
||||
mark_as_advanced(NCCL_INCLUDE_DIR)
|
||||
mark_as_advanced(NCCL_LIBRARY)
|
||||
endif()
|
||||
|
||||
if (NCCL_FOUND AND NOT TARGET NCCL::NCCL)
|
||||
add_library(NCCL::NCCL SHARED IMPORTED)
|
||||
if(MSVC)
|
||||
string(REPLACE ".lib" ".dll" NCCL_DLL ${NCCL_LIBRARY})
|
||||
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_LOCATION ${NCCL_DLL})
|
||||
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_IMPLIB ${NCCL_LIBRARY})
|
||||
else()
|
||||
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_LOCATION ${NCCL_LIBRARY})
|
||||
endif()
|
||||
target_include_directories(NCCL::NCCL INTERFACE ${NCCL_INCLUDE_DIR})
|
||||
endif()
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -93,7 +93,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
+7
-31
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -109,7 +109,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
@@ -334,10 +334,8 @@ set(_OPENVDB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
set(OPENVDB_PYTHON_PATH_SUFFIXES
|
||||
lib64/python
|
||||
lib64/python2.7
|
||||
lib64/python3
|
||||
lib/python
|
||||
lib/python2.7
|
||||
lib/python3
|
||||
)
|
||||
|
||||
@@ -491,37 +489,11 @@ endif()
|
||||
# Add standard dependencies
|
||||
|
||||
find_package(TBB REQUIRED COMPONENTS tbb)
|
||||
find_package(Boost REQUIRED COMPONENTS iostreams)
|
||||
|
||||
# Add deps for pyopenvdb
|
||||
# @todo track for numpy
|
||||
|
||||
if(pyopenvdb IN_LIST OpenVDB_FIND_COMPONENTS)
|
||||
find_package(Python REQUIRED)
|
||||
|
||||
# Boost python handling - try and find both python and pythonXx (version suffixed).
|
||||
# Prioritize the version suffixed library, failing if neither exist.
|
||||
|
||||
find_package(Boost ${MINIMUM_BOOST_VERSION}
|
||||
QUIET COMPONENTS python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}
|
||||
)
|
||||
|
||||
if(TARGET Boost::python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR})
|
||||
set(BOOST_PYTHON_LIB "python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
|
||||
message(STATUS "Found boost_python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
|
||||
else()
|
||||
find_package(Boost ${MINIMUM_BOOST_VERSION} QUIET COMPONENTS python)
|
||||
if(TARGET Boost::python)
|
||||
set(BOOST_PYTHON_LIB "python")
|
||||
message(STATUS "Found non-suffixed boost_python, assuming to be python version "
|
||||
"\"${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}\" compatible"
|
||||
)
|
||||
else()
|
||||
message(FATAL_ERROR "Unable to find boost_python or "
|
||||
"boost_python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add deps for openvdb_ax
|
||||
@@ -656,6 +628,10 @@ if(OpenVDB_USES_IMATH_HALF)
|
||||
find_package(Imath REQUIRED CONFIG)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_DELAYED_LOADING)
|
||||
find_package(Boost REQUIRED COMPONENTS iostreams)
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
find_package(Threads REQUIRED)
|
||||
endif()
|
||||
@@ -766,7 +742,7 @@ if(OpenVDB_pyopenvdb_LIBRARY)
|
||||
set_target_properties(OpenVDB::pyopenvdb PROPERTIES
|
||||
IMPORTED_LOCATION "${OpenVDB_pyopenvdb_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_pyopenvdb_INCLUDE_DIR};${PYTHON_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;Boost::${BOOST_PYTHON_LIB};${PYTHON_LIBRARIES}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;${PYTHON_LIBRARIES}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
)
|
||||
endif()
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -93,7 +93,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -47,7 +47,7 @@ The following variables may be provided to tell this module where to look.
|
||||
# Find the glfw3 installation and use glfw's CMake to initialize
|
||||
# the glfw lib
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
set(_FIND_GLFW3_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
@@ -109,18 +109,6 @@ endif()
|
||||
set(glfw3_FIND_VERSION ${MINIMUM_GLFW_VERSION})
|
||||
find_package(glfw3 ${MINIMUM_GLFW_VERSION} REQUIRED)
|
||||
|
||||
# We only use find_package_handle_standard_args to verify and print
|
||||
# appropriate messages. This now explicitly errors in 3.19...
|
||||
# @todo Improve this entire GLFW3 search
|
||||
# https://gitlab.kitware.com/cmake/cmake/-/issues/21505
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.19)
|
||||
find_package(PackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(glfw3
|
||||
REQUIRED_VARS glfw3_DIR glfw3_FOUND
|
||||
VERSION_VAR glfw3_VERSION
|
||||
)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_GLFW_VERSION)
|
||||
if(glfw3_VERSION VERSION_LESS ${FUTURE_MINIMUM_GLFW_VERSION})
|
||||
message(DEPRECATION "Support for GLFW versions < ${FUTURE_MINIMUM_GLFW_VERSION} "
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -73,7 +73,7 @@ may be provided to tell this module where to look.
|
||||
# Find the Houdini installation and use Houdini's CMake to initialize
|
||||
# the Houdini lib
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
# Include utility functions for version information
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -51,7 +51,7 @@ variables may be provided to tell this module where to look.
|
||||
# Find the Maya installation and use Maya's CMake to initialize
|
||||
# the Maya lib
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
|
||||
set(_FIND_MAYA_ADDITIONAL_OPTIONS "")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -57,7 +57,7 @@ The following functions are provided:
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
|
||||
function(OPENVDB_GET_VERSION_DEFINE HEADER KEY VALUE)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -16,7 +16,7 @@ existing from a previous run of cmake.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt")
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -184,20 +184,23 @@ if(OPENVDB_CXX_STRICT)
|
||||
add_compile_options("$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,9.3.0>>:-Wimplicit-fallthrough>")
|
||||
# Only check global constructors for libraries (we should really check for
|
||||
# executables too but gtest relies on these types of constructors for its
|
||||
# framework).
|
||||
add_compile_options("$<$<AND:$<NOT:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>>:-Wglobal-constructors>")
|
||||
# framework). nanobind also incorporates these constructors so skip it as well.
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>>>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>>:-Wglobal-constructors>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wno-sign-conversion>")
|
||||
# GNU
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Werror>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wall>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wextra>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-pedantic>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wcast-align>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wcast-qual>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wconversion>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wdisabled-optimization>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Woverloaded-virtual>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wnon-virtual-dtor>")
|
||||
# Disable select warnings for the nanobind static library
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-pedantic>")
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wcast-qual>")
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wconversion>")
|
||||
add_compile_options("$<$<AND:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wno-unused-variable>")
|
||||
add_compile_options("$<$<AND:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wno-unused-but-set-parameter>")
|
||||
else()
|
||||
# NO OPENVDB_CXX_STRICT, suppress some warnings
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -27,59 +27,59 @@ set(OPENVDB_DEPRECATED_ABI_LIST ${MINIMUM_OPENVDB_ABI_VERSION} ${_PREV_ABI})
|
||||
unset(_PREV_ABI)
|
||||
|
||||
if(NOT DISABLE_DEPENDENCY_VERSION_CHECKS)
|
||||
# @note Currently tracking CY2022 of the VFX platform where available
|
||||
# @note Currently tracking CY2024 of the VFX platform where available
|
||||
# (that is, our minimum requirements are for the current VFX platform)
|
||||
# minus 2 years to be able to build with legacy ABI)
|
||||
|
||||
# @Note Compiler versions are not really a hard and fast rule, you just need
|
||||
# a compiler with complete support for our MINIMUM_CXX_STANDARD (currently 17).
|
||||
# What's usually important is that the version of libstdc++ and glibc in use
|
||||
# matches. Compilers other than GCC should provide options to ensure this
|
||||
# targetting e.g. --gcc-toolchain and -fgnuc-version with Clang.
|
||||
set(MINIMUM_GCC_VERSION 9.3.1)
|
||||
set(MINIMUM_GCC_VERSION 11.2.1)
|
||||
set(MINIMUM_CLANG_VERSION 5.0)
|
||||
set(MINIMUM_ICC_VERSION 19)
|
||||
set(MINIMUM_MSVC_VERSION 19.28) # 1928 (Visual Studio 2019 Version 16.8 + 16.9)
|
||||
set(MINIMUM_MSVC_VERSION 19.30) # 1928 (Visual Studio 2019 Version 16.8 + 16.9)
|
||||
|
||||
# Should be 1.76 for VFX 22, but only version in apt is 1.73
|
||||
set(MINIMUM_BOOST_VERSION 1.73)
|
||||
set(MINIMUM_PYBIND_VERSION 2.9.1)
|
||||
set(MINIMUM_IMATH_VERSION 3.1)
|
||||
set(MINIMUM_OPENEXR_VERSION 3.1)
|
||||
set(MINIMUM_BOOST_VERSION 1.82)
|
||||
set(MINIMUM_OPENEXR_VERSION 3.2)
|
||||
set(MINIMUM_IMATH_VERSION 3.2)
|
||||
set(MINIMUM_ZLIB_VERSION 1.2.7)
|
||||
set(MINIMUM_TBB_VERSION 2020.3)
|
||||
set(MINIMUM_LLVM_VERSION 10.0.0)
|
||||
set(MINIMUM_LLVM_VERSION 15.0.0)
|
||||
set(MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
set(MINIMUM_GLFW_VERSION 3.1)
|
||||
set(MINIMUM_GLFW_VERSION 3.3)
|
||||
|
||||
set(MINIMUM_PYTHON_VERSION 3.9.1)
|
||||
set(MINIMUM_NUMPY_VERSION 1.20.0)
|
||||
set(MINIMUM_PYTHON_VERSION 3.11)
|
||||
|
||||
set(MINIMUM_GOOGLETEST_VERSION 1.10)
|
||||
set(MINIMUM_LOG4CPLUS_VERSION 1.1.2)
|
||||
set(MINIMUM_HOUDINI_VERSION 19.5)
|
||||
set(MINIMUM_LOG4CPLUS_VERSION 2.0)
|
||||
set(MINIMUM_HOUDINI_VERSION 20.5)
|
||||
|
||||
# These always promote warnings rather than errors
|
||||
set(MINIMUM_MAYA_VERSION 2017)
|
||||
set(MINIMUM_DOXYGEN_VERSION 1.8.8)
|
||||
endif()
|
||||
|
||||
# VFX 23 deprecations to transition to MINIMUM_* variables in OpenVDB 12.0.0
|
||||
# VFX 24 deprecations to transition to MINIMUM_* variables in OpenVDB 14.0.0
|
||||
# @note At the time of writing, any variables that are commented out don't
|
||||
# have target transitional versions.
|
||||
|
||||
set(FUTURE_MINIMUM_GCC_VERSION 11.2.1)
|
||||
set(FUTURE_MINIMUM_MSVC_VERSION 19.30) # 1930 (Visual Studio 2022)
|
||||
# set(FUTURE_MINIMUM_GCC_VERSION 11.2.1)
|
||||
# set(FUTURE_MINIMUM_MSVC_VERSION 19.30)
|
||||
# set(FUTURE_MINIMUM_ICC_VERSION 19)
|
||||
|
||||
# set(FUTURE_MINIMUM_CXX_STANDARD 20)
|
||||
set(FUTURE_MINIMUM_CMAKE_VERSION 3.20)
|
||||
# set(FUTURE_MINIMUM_OPENEXR_VERSION 3.1)
|
||||
set(FUTURE_MINIMUM_BOOST_VERSION 1.80)
|
||||
set(FUTURE_MINIMUM_GLFW_VERSION 3.3)
|
||||
set(FUTURE_MINIMUM_LOG4CPLUS_VERSION 2.0)
|
||||
set(FUTURE_MINIMUM_CMAKE_VERSION 4.0)
|
||||
set(FUTURE_MINIMUM_OPENEXR_VERSION 3.3)
|
||||
set(FUTURE_MINIMUM_IMATH_VERSION 3.3)
|
||||
set(FUTURE_MINIMUM_TBB_VERSION 2021)
|
||||
set(FUTURE_MINIMUM_BOOST_VERSION 1.85)
|
||||
#set(FUTURE_MINIMUM_GLFW_VERSION 3.3)
|
||||
#set(FUTURE_MINIMUM_LOG4CPLUS_VERSION 2.0)
|
||||
set(FUTURE_MINIMUM_NANOBIND_VERSION 2.5.0)
|
||||
|
||||
# set(FUTURE_MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
# set(FUTURE_MINIMUM_TBB_VERSION 2020.3)
|
||||
set(FUTURE_MINIMUM_PYTHON_VERSION 3.10)
|
||||
set(FUTURE_MINIMUM_NUMPY_VERSION 1.23.0)
|
||||
# set(FUTURE_MINIMUM_PYTHON_VERSION 3.11)
|
||||
# set(FUTURE_MINIMUM_HOUDINI_VERSION 20.0)
|
||||
set(FUTURE_MINIMUM_LLVM_VERSION 13.0.0)
|
||||
set(FUTURE_MINIMUM_LLVM_VERSION 18.0.0)
|
||||
|
||||
+3
-2
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(OpenVDBDocs LANGUAGES NONE)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -44,6 +44,7 @@ set(DOXY_FILES
|
||||
openvdb/openvdb/points/impl
|
||||
openvdb/openvdb/python/pyopenvdb.h
|
||||
openvdb/openvdb/tools
|
||||
openvdb/openvdb/tools/impl
|
||||
openvdb/openvdb/tree
|
||||
openvdb/openvdb/util
|
||||
doc/build.txt
|
||||
|
||||
+10
-21
@@ -238,10 +238,8 @@ it's a good idea to read the above section on
|
||||
|
||||
DCC | Supported Version | OpenVDB ABI |
|
||||
-------- | ----------------- | ----------- |
|
||||
Houdini | 19.5 | 9 |
|
||||
Houdini | 20.0 | 10 |
|
||||
Maya | 2018 | Any |
|
||||
Maya | 2019 | Any |
|
||||
Houdini | 20.5 | 11 |
|
||||
Houdini | 21.0 | 12 |
|
||||
|
||||
@subsection buildBuildHou Building Against Houdini
|
||||
|
||||
@@ -259,15 +257,13 @@ CMake | Cross-platform family of tools designed to help build software
|
||||
C++17 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams | All |
|
||||
GoogleTest | A unit testing framework module for C++ | Unit Tests |
|
||||
CppUnit | A unit testing framework module for C++ | Unit Tests (AX) |
|
||||
GLFW | Simple API for OpenGL development | OpenVDB View |
|
||||
Doxygen | Documentation generation from C++ | Documentation |
|
||||
Log4cplus | An optional dependency for improved OpenVDB Logging | Optional (All) |
|
||||
PyBind11 | C++/python bindings | Optional (Python) |
|
||||
NumPy | Scientific computing with Python | Optional (Python) |
|
||||
nanobind | C++/python bindings | Optional (Python) |
|
||||
LLVM | Target-independent code generation | OpenVDB AX |
|
||||
|
||||
At a minimum, boost, a matching C++17 compiler and CMake will be required. See
|
||||
At a minimum a matching C++17 compiler and CMake will be required. See
|
||||
the full [dependency list](@ref dependencies) for help with downloading and
|
||||
installing the above software. Note that as Blosc and ZLib are provided as part
|
||||
of the Houdini installation `USE_BLOSC` and `USE_ZLIB` should be left `ON`.
|
||||
@@ -351,14 +347,12 @@ Boost | Components: iostreams
|
||||
ZLIB | Compression library for disk serialization compression | All |
|
||||
Blosc | Recommended dependency for improved disk compression | All* |
|
||||
GoogleTest | A unit testing framework module for C++ | Unit Tests |
|
||||
CppUnit | A unit testing framework module for C++ | Unit Tests (AX) |
|
||||
GLFW | Simple API for OpenGL development | OpenVDB View |
|
||||
Doxygen | Documentation generation from C++ | Documentation |
|
||||
OpenEXR | EXR serialization support | OpenVDB Render |
|
||||
Imath | Used half precision floating points and EXR serialization support | Optional (All) |
|
||||
Log4cplus | An optional dependency for improved OpenVDB Logging | Optional (All) |
|
||||
PyBind11 | C++/python bindings | Optional (Python) |
|
||||
NumPy | Scientific computing with Python | Optional (Python) |
|
||||
nanobind | C++/python bindings | Optional (Python) |
|
||||
LLVM | Target-independent code generation | OpenVDB AX |
|
||||
|
||||
|
||||
@@ -514,7 +508,7 @@ You can add the below CMake snippet to your main `CMakeLists.txt` to bring in
|
||||
OpenVDB as a dependency:
|
||||
|
||||
@code{.cmake}
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
list(APPEND CMAKE_MODULE_PATH "/location/of/openvdb/install/lib/cmake/OpenVDB")
|
||||
find_package(OpenVDB REQUIRED)
|
||||
target_link_libraries(myapp OpenVDB::openvdb)
|
||||
@@ -607,17 +601,12 @@ OpenVDB uses [imported targets](https://cmake.org/cmake/help/latest/command/add_
|
||||
for all its dependencies. For imported Boost compatibility, the following
|
||||
versions of CMake are required:
|
||||
|
||||
- Boost 1.73 requires CMake 3.17.2 or newer.
|
||||
- Boost 1.74 requires CMake 3.19 or newer.
|
||||
- Boost 1.75 requires CMake 3.19.5 or newer.
|
||||
- Boost 1.76 requires CMake 3.20.3 or newer.
|
||||
- Boost 1.77 requires CMake 3.21.3 or newer.
|
||||
- Boost 1.78 requires CMake 3.22.2 or newer.
|
||||
- Boost 1.79 requires CMake 3.23.2 or newer.
|
||||
- Boost 1.80 requires CMake 3.24.2 or newer.
|
||||
- Boost 1.81 requires CMake 3.25.2 or newer.
|
||||
- Boost 1.82 requires CMake 3.27.0 or newer.
|
||||
- Boost 1.83 requires CMake 3.27.4 or newer.
|
||||
- Boost 1.84 requires CMake 3.28.2 or newer.
|
||||
- Boost 1.85 requires CMake 3.29.3 or newer.
|
||||
- Boost 1.86 requires CMake 3.30.6, 3.31.1, or newer.
|
||||
- Boost 1.87 requires CMake 3.31.4 or newer.
|
||||
|
||||
Use the above list to identify the version of CMake you require for your version
|
||||
of Boost. Note that this may be implemented into the OpenVDB CMake in the future.
|
||||
|
||||
+409
@@ -2,6 +2,415 @@
|
||||
|
||||
@page changes Release Notes
|
||||
|
||||
@htmlonly <a name="v12_1_2_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.1.2</B> - <I>In development</I>
|
||||
|
||||
|
||||
@htmlonly <a name="v12_1_1_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.1.1</B> - <I>September 30, 2025</I>
|
||||
|
||||
@par
|
||||
OpenVDB AX:
|
||||
- Fixes:
|
||||
- Fixed an issue which was causing host specific optimization passes to be
|
||||
omitted when using LLVM 16 and higher.
|
||||
|
||||
@par
|
||||
Houdini:
|
||||
- Fixed a compilation issue with the OpenVDB Activate SOP with Houdini 21
|
||||
[Reported by @callen128]
|
||||
|
||||
|
||||
@htmlonly <a name="v12_1_0_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.1.0</B> - <I>August 8, 2025</I>
|
||||
|
||||
@par
|
||||
OpenVDB:
|
||||
- New features:
|
||||
- New level set constructor tools::createLevelSetCapsule creates a grid
|
||||
containing a narrow-band level set representation of a capsule (tube
|
||||
with constant radius and sphere caps).
|
||||
- New level set constructor tools::createLevelSetTaperedCapsule creates a
|
||||
grid containing a narrow-band level set representation of a tapered
|
||||
capsule (tube with sphere caps and different radii at both ends, or
|
||||
equivalently the convex hull of two spheres with possibly different
|
||||
centers and radii).
|
||||
- New level set constructor tools::createLevelSetTubeComplex creates a grid
|
||||
containing a narrow-band level set representation of a tube complex (a
|
||||
collection of capsules or tapered capsules defined by endpoint coordinates
|
||||
and segment indices).
|
||||
- New level set constructor tools::createLevelSetDilatedMesh creates a grid
|
||||
containing a narrow-band level set representation of a dilated surface
|
||||
mesh (dilated by a radius in all directions).
|
||||
- New class tools::ConvexVoxelizer, used by the above methods, which can be
|
||||
inherited to implement a convex level set constructor.
|
||||
- Introduced anisotropic surfacing tools in points/PointRasterizeSDF.h and
|
||||
principal component analysis (PCA) methods in points/PrincipalComponentAnalysis.h.
|
||||
The latter tool analyses point neighborhoods and computes affine
|
||||
transformations representing elliptical distributions. The prior tool
|
||||
takes rotational and stretch point attributes (optionally computed from
|
||||
the prior PCA methods) and generates anisotropic surfaces.
|
||||
|
||||
- Improvements:
|
||||
- Significantly improved the performance of all LeafNode ValueIterators,
|
||||
up to 5x on some platforms and up to 10x when delay loading is enabled.
|
||||
Construction of a ValueIterator from a leaf node now requests the leaf
|
||||
buffers ahead of iteration to avoid potentially expensive API calls.
|
||||
- Improved the performance of PointRasterizeSDF.h tools with larger radii
|
||||
with better bound computation approximations.
|
||||
- Significant performance improvement to delay loaded files - the warning
|
||||
logic which checks the underlying mapped file for the last modified time
|
||||
has been removed, resulting in performance gains upwards of 10x when
|
||||
loading in node data buffers. Note that the check that was removed is
|
||||
entirely redundant on Windows and would only print a warning on other
|
||||
system.
|
||||
[Contributed by jjtParadox]
|
||||
- Added OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION and OPENVDB_HAS_MEMBER_FUNCTION
|
||||
macros to help determine the presence and compatibility of interface
|
||||
member functions at compile time.
|
||||
- Added OPENVDB_ASSUME macros to mimic builtin assume and C++23 assume
|
||||
attributes.
|
||||
- Improved read and write of PLY files with vdb_tool so they support Vec3d
|
||||
and 64 bit attributes. Changed vdb_tool version number from 10.6.1 to
|
||||
10.7.0.
|
||||
|
||||
- API Changes:
|
||||
- Mat3 and Mat4 functions have been marked [[nodiscard]] where it may be
|
||||
confusing if they are operating in place or returning a result, in
|
||||
particular tranpose, invert, adjoint, and timesDiagonal.
|
||||
- Re-worked the API in PointRasterizeSDF.h with the addition of anisotropic
|
||||
surfacing kernels. The new API exposes more concise free functions which
|
||||
take structs of parameters. The old API remains supported but is
|
||||
deprecated.
|
||||
- Deprecated providing a filter or interrupter as arguments to
|
||||
points::rasterize. These can instead be implemented on user transfer
|
||||
schemes.
|
||||
- Transfer schemes provided to points::rasterize can now optionally
|
||||
implement a rasterizePoints callback that takes a range of points per
|
||||
voxel.
|
||||
|
||||
- Fixes:
|
||||
- Fixed a bug in points::rasterizeSpheres and points::rasterizeSmoothSpheres
|
||||
which could cause sections of the generated surface to incorrectly be
|
||||
marked as negative interior values.
|
||||
- Fixed a bug in points::rasterizeSmoothSpheres which could result in
|
||||
incomplete surface reconstruction with significantly larger search
|
||||
distances.
|
||||
- Fixed some precision issues in various Matrix methods.
|
||||
- Fixed bugs in vdb_tool that prevented build with newer namespaces in
|
||||
nanovdb.
|
||||
|
||||
@par
|
||||
OpenVDB AX:
|
||||
- Improvements:
|
||||
- Added support for LLVM versions greater than 15. Upgraded CI to test with
|
||||
LLVM versions 16, 17, 18, 19 and 20.
|
||||
- As of this release, LLVM 15 is the minimum required version for OpenVDB
|
||||
AX. Note that there is an issue with LLVM 17 symbols which makes it
|
||||
incompatible with the OpenVDB Python plugin. AS such, LLVM version 18 and
|
||||
greater are the recommended LLVM versions to use, with LLVM 18 being the
|
||||
new future minimum version.
|
||||
- Significant performance improvement to the compilation of AX kernels when
|
||||
using LLVM 18 and greater.
|
||||
- Significant backend refactoring to AX IR generation to support newer
|
||||
versions of LLVM. In particular, parts of the codegen::Function and
|
||||
codegen::FunctionBuilder API require new usage from LLVM 16 due to
|
||||
the LLVM opaque pointer changes. If you're not using the OpenVDB AX
|
||||
Function codegen API then no client changes should be necessary.
|
||||
- Migrated OpenVDB AX unit tests from cppunit to gtest
|
||||
[Contributed by Tim Straubinger]
|
||||
|
||||
- Fixes:
|
||||
- Fixed a case of undefined behaviour when explicitly casting variables to
|
||||
the same type as their storage type e.g:
|
||||
double a; double b = double(a);
|
||||
- Fixed an AX compiler error which would produce invalid IR when using 64bit
|
||||
integer variables for matrix array offsetting e.g:
|
||||
int64 a = 0; mat4f b = 1; float c = b[a,a];
|
||||
|
||||
@par
|
||||
NanoVDB:
|
||||
- Added nanovdb::openToIndexVDB, which can convert an OpenVDB grid into a
|
||||
NanoVDB IndexGrid.
|
||||
- Added new options "--index" and "--onIndex" to the command-line tool
|
||||
nanovdb_convert so it can produce IndexGrids.
|
||||
- Fixed memory leak in DeviceBuffer.
|
||||
- Added constructor for DeviceBuffer from an existing HostBuffer.
|
||||
- Added VoxelBlockManager, an acceleration structure for sequential access
|
||||
and stencil ops over active voxels.
|
||||
- Added helper functions for kernel launches with shared memory.
|
||||
- Added support for CUDA 13.0.
|
||||
- Fix warnings and compilation errors for GCC and Clang.
|
||||
- Fixed inconsistent usage of util::cuda::mallocAsync/freeAsync that
|
||||
affected vGPUs.
|
||||
- Added support for custom memory resources in PointsToGrid.
|
||||
- Fixed race condition in split/mergeGridHandles.
|
||||
- Fixed offset bug in nanovdb::tools::cuda::IndexToGrid related to non-POD
|
||||
build types.
|
||||
[Contributed by Andreas Henne]
|
||||
|
||||
@par
|
||||
Houdini:
|
||||
- Define OP_InputIdx and OP_OutputIdx for Houdini 21.0 compatibility
|
||||
- Add Houdini 21 style camera interface to support LOP cameras
|
||||
- Include env flag for avoiding stream writing (was backported to 19.5)
|
||||
|
||||
|
||||
@htmlonly <a name="v12_0_1_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.0.1</B> - <I>April 3, 2025</I>
|
||||
|
||||
@par
|
||||
OpenVDB:
|
||||
- New features:
|
||||
- Added read and write support for OFF (Object File Format) files to vdb_tool
|
||||
|
||||
- Build:
|
||||
- Fixed a build issue with vdb_render on Windows with newer versions of glew not including glu.h by default
|
||||
- Fixed issues with newer versions of clang refusing to accept older ::template syntax
|
||||
|
||||
@par
|
||||
NanoVDB:
|
||||
- New features:
|
||||
- Added support for multiple GPUs to DeviceBuffer
|
||||
- Added a UnifiedBuffer class that wraps CUDA unified memory
|
||||
- Added example for multiGPU sparse convolution
|
||||
- Added CUDA utility functions for device queries
|
||||
- Added functions to independently stop and compute the elapsed time for timer classes
|
||||
|
||||
- Improvements:
|
||||
- Replaced CUB's CachingDeviceAllocator with the default asynchronous stream ordered allocator in PointsToGrid for improved performance
|
||||
|
||||
- Bug fix:
|
||||
- Map is now properly transposed when converting NanoVDB to OpenVDB.
|
||||
- Fixed ostream specializations being hidden within the nanovdb namespace
|
||||
- Fixed a call to a non-existent method in GridBuild.h
|
||||
|
||||
|
||||
@htmlonly <a name="v1_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.0.0</B> - <I>October 31, 2024</I>
|
||||
|
||||
@par
|
||||
<BLOCKQUOTE>
|
||||
OpenVDB is now licensed under the Apache 2.0 license, instead of the MPL 2.0 license.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
@par
|
||||
<BLOCKQUOTE>
|
||||
This version introduces ABI changes relative to older major releases, so to
|
||||
preserve ABI compatibility it might be necessary to define the macro
|
||||
<TT>OPENVDB_ABI_VERSION_NUMBER=</TT><I>N</I>, where, for example,
|
||||
<I>N</I> is 10 for Houdini 20.0 and 11 for Houdini 20.5.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
@par
|
||||
<BLOCKQUOTE>
|
||||
GCC 9 is no longer supported.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
@par
|
||||
OpenVDB:
|
||||
- New features:
|
||||
- Added tools::LevelSetFilter::fillet() method to round off concave edges
|
||||
to create smoother transition between surfaces.
|
||||
|
||||
- Improvements:
|
||||
- Added openvdb::assertAbort to replace cassert and a
|
||||
@c OPENVDB_ENABLE_ASSERTS cmake argument/compile define to toggle
|
||||
assertions in OpenVDB code, independantly of NDEBUG. Asserts are
|
||||
no longer enabled by default in when NDEBUG is absent (e.g.
|
||||
Debug builds).
|
||||
- Removed last traces of Boost when @c OPENVDB_USE_DELAYED_LOADING is OFF
|
||||
<I>[Reported by Brian McKinnon]</I>
|
||||
- RootNode code cleanup to eliminate redundant key conversion and
|
||||
to create map values in-place.
|
||||
- Add RootNode::deleteChildOrTile() to delete a child or tile of
|
||||
the root node.
|
||||
- ValueAccessors are now defined and created in the Tree class
|
||||
instead of in the Grid class so that custom Tree implementations
|
||||
may define and create their own ValueAccessors if desired.
|
||||
- Added support for PDAL to vdb_tool [Contributed by Tom Matterson]
|
||||
- LeafManager and NodeManager now use Index64 for leaf counts internally.
|
||||
- Added RootNode::probeChild() const.
|
||||
- Added RootNode::probeChild() and RootNode::probeConstChild().
|
||||
- Added RootNode::probe() and RootNode::probeConst() to query key presence,
|
||||
child node, value and active state.
|
||||
- Added InternalNode::probeChild() const.
|
||||
- Added InternalNode::probeChild() and probeChildConst() with coord access
|
||||
and optionally value and active state.
|
||||
- Added InternalNode::probeChild() and probeChildConst() with index access
|
||||
and optionally value and active state.
|
||||
- Added InternalNode::isValueOff(), LeafNode::isValueOff(),
|
||||
LeafNodeBool::isValueOff(), LeafNodeMask::isValueOff().
|
||||
- Added LeafNodeMask::probeValue(Index,val), LeafNodeBool::probeValue(Index,val).
|
||||
- Added RootNode::getValueUnsafe(), RootNode::getChildUnsafe(),
|
||||
RootNode::getConstChildUnsafe().
|
||||
- Added InternalNode::getValueUnsafe(), InternalNode::getChildUnsafe(),
|
||||
InternalNode::getConstChildUnsafe().
|
||||
- Added InternalNode::setActiveStateUnsafe(), InternalNode::setValueOnlyUnsafe(),
|
||||
InternalNode::setValueOnUnsafe(), InternalNode::setValueOffUnsafe().
|
||||
- Added InternalNode::setChildUnsafe(), InternalNode::resetChildUnsafe(),
|
||||
InternalNode::stealChildUnsafe(), InternalNode::deleteChildUnsafe().
|
||||
- For LeafNode, LeafNodeBool and LeafNodeMask - added
|
||||
LeafNode::getValueUnsafe(), LeafNode::setActiveStateunsafe(),
|
||||
LeafNode::setValueOnlyUnsafe(), LeafNode::setValueOnUnsafe(),
|
||||
LeafNode::setValueOffUnsafe().
|
||||
|
||||
- ABI changes:
|
||||
- Tree::leafCount(), Tree::unallocatedLeafCount(),
|
||||
Tree::nonLeafCount() and Tree::nodeCount() now use Index64 in their
|
||||
return types instead of Index32.
|
||||
|
||||
- API Changes:
|
||||
- RootNode::tileCount(), RootNode::activeTileCount() and
|
||||
RootNode::inactiveTileCount() are now public.
|
||||
- RootNode::hasKey() and RootNode::coordToKey() are now public.
|
||||
- RootNode::leafCount(), RootNode::nonLeafCount() and RootNode::nodeCount()
|
||||
now use Index64 instead of Index32. The Index32 variant is deprecated.
|
||||
- InternalNode::leafCount(), InternalNode::nonLeafCount() and
|
||||
InternalNode::nodeCount() now use Index64 instead of Index32. The Index32
|
||||
variant is deprecated.
|
||||
- LeafNode::leafCount() and LeafNode::nonLeafCount() now use Index64 instead
|
||||
of Index32. The Index32 variant is deprecated.
|
||||
|
||||
- Bug Fixes:
|
||||
- Fix potential crash reading corrupt .vdb files with invalid
|
||||
blosc or zip chunks.
|
||||
<I>[Reported by Matthias Ueberheide]</I>
|
||||
|
||||
- Fix a bug in RootNode::setOrigin() where the origin was updated
|
||||
before the error was thrown potentially leaving the root in an
|
||||
invalid state.
|
||||
- Fixed a thread sanitizer issue which could cause undefined
|
||||
behaviour in VolumeToSpheres::fillWithSpheres
|
||||
<I>[Reported by Jérémie Dumas]</I>
|
||||
- Fixed an occurance of undefined behaviour in tools::activate
|
||||
(though this would typically not have manifested with any
|
||||
unintended behaviour)
|
||||
|
||||
@par
|
||||
NanoVDB:
|
||||
- Bug fix:
|
||||
- nanovdb::readGrids works with raw grid buffer.
|
||||
|
||||
- Improvements:
|
||||
- Restructure files location and namespace to be more align with
|
||||
OpenVDB. The namespaces touched by the restructuring are: io,
|
||||
cuda, util, tools, and math.
|
||||
- Add two scripts updateFiles.sh and updateFiles.py to update the
|
||||
files using NanoVDB. The script updateFiles.py works on both
|
||||
Windows and Linux. For a more complete list of changes, see API
|
||||
Changes (details).
|
||||
|
||||
- cuda::PointsToGrid supports target density.
|
||||
- Add support for NanoVDB Grid of type UInt8.
|
||||
- Add ability to use externally managed CUDA buffer.
|
||||
- Add create methods for CudaDeviceBuffer and exceptions.
|
||||
- Improve GridValidator logic, e.g. include check for grid count.
|
||||
- Add operator > and >= for class Coord according to lexicographical order.
|
||||
- Add toCodec to convert string to Codec enumeration type.
|
||||
- Add nanovdb::strlen<GridType>().
|
||||
- Add strncpy util.
|
||||
- Add @c NANOVDB_DISABLE_SYNC_CUDA_MALLOC that maps cudaMallocAsync
|
||||
and cudaFreeAsync to cudaMalloc and cudaFree respectively.
|
||||
- Add guard to @c UINT64_C.
|
||||
- Remove use of cudaMallocAsync in PointsToGrid.cuh.
|
||||
- Align PNanoVDB blind metadata to NanoVDB.
|
||||
|
||||
- API Changes:
|
||||
- Change mapToGridType to toGridType.
|
||||
- Change mapToMagic to toMagic.
|
||||
- Change <TT>CpuTimer.h</TT> to <TT>Timer.h</TT>.
|
||||
|
||||
- API Changes (details):
|
||||
- These APIs are now under the math namespace: Ray, DDA, HDDA,
|
||||
Vec3, Vec4, BBox, ZeroCrossing, TreeMarcher, PointTreeMarcher,
|
||||
BoxStencil, CurvatureStencil, GradStencil, WenoStencil, AlignUp,
|
||||
Min, Max, Abs, Clamp, Sqrt, Sign, Maximum, Delta, RoundDown, pi,
|
||||
isApproxZero, Round, createSampler, SampleFromVoxels.
|
||||
|
||||
- These APIs are now under the tools namespace: createNanoGrid,
|
||||
StatsMode, createLevelSetSphere, createFogVolumeSphere,
|
||||
createFogVolumeSphere, createFogVolumeSphere,
|
||||
createFogVolumeTorus, createLevelSetBox, CreateNanoGrid,
|
||||
updateGridStats, evalChecksum, validateChecksum, checkGrid,
|
||||
Extrema.
|
||||
- These APIs are now under the util namespace: is_floating_point,
|
||||
findLowestOn, findHighestOn, Range, streq, strcpy, strcat,
|
||||
empty, Split, invoke, forEach, reduce, prefixSum, is_same,
|
||||
is_specialization, PtrAdd, PtrDiff.
|
||||
|
||||
- Move nanovdb::build to nanovdb::tools::build.
|
||||
- Rename nanovdb::BBoxR to nanovdb::Vec3dBBox.
|
||||
- Rename nanovdb::BBox<nanovdb::Vec3d> to nanovdb::Vec3dBbox.
|
||||
- Move nanovdb::cudaCreateNodeManager to nanovdb::cuda::createNodeManager.
|
||||
- Move and rename nanovdb::cudaVoxelsToGrid to nanovdb::cuda::voxelsToGrid.
|
||||
- Move and rename nanovdb::cudaPointsToGrid to nanovdb::cuda::pointsToGrid.
|
||||
- Move nanovdb::DitherLUT to nanovdb::math::DitherLUT.
|
||||
- Move and rename nanovdb::PackedRGBA8 to nanovdb::math::Rgba8.
|
||||
- Move nanovdb::Rgba8 to nanovdb::math::Rgba8.
|
||||
- Move and rename nanovdb::CpuTimer to nanovdb::util::Timer.
|
||||
- Move nanovdb::GpuTimer to nanovdb::util::cuda::Timer.
|
||||
- Move and rename nanovdb::CountOn to nanovdb::util::countOn.
|
||||
|
||||
- Move <TT>util/GridHandle.h</TT> to <TT>GridHandle.h</TT>.
|
||||
- Move <TT>util/BuildGrid.h</TT> to <TT>tools/GridBuilder.h</TT>.
|
||||
- Move <TT>util/GridBuilder.h</TT> to <TT>tools/GridBuilder.h</TT>.
|
||||
- Move <TT>util/IO.h</TT> to <TT>io/IO.h</TT>.
|
||||
- Move <TT>util/CSampleFromVoxels.h</TT> to <TT>math/CSampleFromVoxels.h</TT>.
|
||||
- Move <TT>util/DitherLUT.h</TT> to <TT>math/DitherLUT.h</TT>.
|
||||
- Move <TT>util/HDDA.h</TT> to <TT>math/HDDA.h</TT>.
|
||||
- Move <TT>util/Ray.h</TT> to <TT>math/Ray.h</TT>.
|
||||
- Move <TT>util/SampleFromVoxels.h</TT> to <TT>math/SampleFromVoxels.h</TT>.
|
||||
- Move <TT>util/Stencils.h</TT> to <TT>nanovdb/math/Stencils.h</TT>.
|
||||
- Move <TT>util/CreateNanoGrid.h</TT> to <TT>tools/CreateNanoGrid.h</TT>.
|
||||
- Move and rename <TT>util/Primitives.h</TT> to <TT>tools/CreatePrimitives.h</TT>.
|
||||
- Move <TT>util/GridChecksum.h</TT> to <TT>tools/GridChecksum.h</TT>.
|
||||
- Move <TT>util/GridStats.h</TT> to <TT>tools/GridStats.h</TT>.
|
||||
- Move <TT>util/GridChecksum.h</TT> to <TT>tools/GridChecksum.h</TT>.
|
||||
- Move <TT>util/GridValidator.h</TT> to <TT>tools/GridValidator.h</TT>.
|
||||
- Move <TT>util/NanoToOpenVDB.h</TT> to <TT>tools/NanoToOpenVDB.h</TT>.
|
||||
- Move <TT>util/cuda/CudaGridChecksum.cuh</TT> to <TT>tools/cuda/CudaGridChecksum.cuh</TT>.
|
||||
- Move <TT>util/cuda/CudaGridStats.cuh</TT> to <TT>tools/cuda/CudaGridStats.cuh</TT>.
|
||||
- Move <TT>util/cuda/CudaGridValidator.cuh</TT> to <TT>tools/cuda/CudaGridValidator.cuh</TT>.
|
||||
- Move <TT>util/cuda/CudaIndexToGrid.cuh</TT> to <TT>tools/cuda/CudaIndexToGrid.cuh</TT>.
|
||||
- Move and rename <TT>util/cuda/CudaPointsToGrid.cuh</TT> to <TT>tools/cuda/PointsToGrid.cuh</TT>.
|
||||
- Move <TT>util/cuda/CudaSignedFloodFill.cuh</TT> to <TT>tools/cuda/CudaSignedFloodFill.cuh</TT>.
|
||||
- Move and rename <TT>util/cuda/CudaDeviceBuffer.h</TT> to <TT>cuda/DeviceBuffer.h</TT>.
|
||||
- Move and rename <TT>util/cuda/CudaGridHandle.cuh</TT> to <TT>cuda/GridHandle.cuh</TT>.
|
||||
- Move and rename <TT>util/cuda/CudaUtils.h</TT> to <TT>util/cuda/Util.h</TT>.
|
||||
- Move and consolidate <TT>util/cuda/GpuTimer.h</TT> to <TT>util/cuda/Timer.h</TT>.
|
||||
|
||||
@par
|
||||
Python:
|
||||
- OpenVDB Python bindings are now implemented using nanobind
|
||||
instead of pybind11
|
||||
- The OpenVDB Python module has been changed from pyopenvdb to openvdb
|
||||
- Added Python bindings for NanoVDB
|
||||
|
||||
@par
|
||||
Houdini:
|
||||
- When @c OPENVDB_ENABLE_RPATH is @c ON, the location of
|
||||
libopenvdb_houdini is now added to the rpath of all Houdini
|
||||
dsos.
|
||||
|
||||
@par
|
||||
Build:
|
||||
- Fixed an issue with OpenVDB AX's CMake on Windows where the
|
||||
static and shared library targets would have the same name
|
||||
<I>[Reported by Nicholas Yue]</I>
|
||||
- @c USE_EXPLICIT_INSTANTIATION is now disabled on Windows by default
|
||||
due to OOM linker issues.
|
||||
- Jemalloc is now the preferred allocator of choice on all
|
||||
platforms when @c CONCURRENT_MALLOC is set to Auto.
|
||||
- Fixed an issue with the Blosc CMake FindPackage for the OpenVDB
|
||||
Windows static library.
|
||||
|
||||
|
||||
@htmlonly <a name="v11_0_0_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 11.0.0</B> - <I>November 1, 2023</I>
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
This document details the coding practices that are used in the OpenVDB
|
||||
codebase. Contributed code should conform to these guidelines to maintain
|
||||
consistency and maintainability. If there is a rule that you would like
|
||||
clarified, changed, or added, please send a note to openvdb@gmail.com.
|
||||
clarified, changed, or added, please send a note to openvdb-dev@lists.aswf.io.
|
||||
|
||||
|
||||
@section sStyleContents Contents
|
||||
|
||||
+31
-32
@@ -36,19 +36,19 @@ Reference Platform, but for those that do, their specified versions are
|
||||
|
||||
Component | Requirements | Optional
|
||||
----------------------- | ----------------------------------------------- | --------
|
||||
OpenVDB Core Library | CMake, C++17 compiler, TBB::tbb, Boost::headers | Blosc, ZLib, Log4cplus, Imath::Imath, Boost::iostream
|
||||
OpenVDB Core Library | CMake, C++17 compiler, TBB::tbb | Blosc, ZLib, Log4cplus, Imath::Imath, Boost::iostream
|
||||
OpenVDB Print | Core Library dependencies | -
|
||||
OpenVDB LOD | Core Library dependencies | -
|
||||
OpenVDB Render | Core Library dependencies | OpenEXR, Imath::Imath, libpng
|
||||
OpenVDB View | Core Library dependencies, OpenGL, GLFW3, GLEW* | -
|
||||
OpenVDB Python | Core Library dependencies, Python, PyBind11 | NumPy
|
||||
OpenVDB Python | Core Library dependencies, Python, nanobind | -
|
||||
OpenVDB AX | Core Library dependencies, LLVM | Bison, Flex
|
||||
NanoVDB | - | Core Library, CUDA, TBB, Blosc, ZLib
|
||||
OpenVDB UnitTests | Core Library dependencies, GoogleTest | CppUnit**
|
||||
OpenVDB UnitTests | Core Library dependencies, GoogleTest, numpy* | -
|
||||
OpenVDB Documentation | Doxygen | -
|
||||
|
||||
- @b * GLEW is only required for building the vdb_view binary on Windows.
|
||||
- @b ** CppUnit is only required for building the AX unit tests.
|
||||
- @b * numpy only required for python binding unit tests
|
||||
- @b Note - Bison and Flex are only required for re-generation of the AX
|
||||
grammar which is not typically necessary for the majority of users.
|
||||
|
||||
@@ -56,41 +56,39 @@ OpenVDB Documentation | Doxygen | -
|
||||
|
||||
Package | Minimum | Recommended | Description | apt-get | Homebrew | Source
|
||||
-------------- | ------- | ----------- | ----------------------------------------------------------------- | ------- | -------- | ------
|
||||
CMake | 3.18 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
|
||||
GCC | 9.3.1 | 11.2.1 | C++ 17 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
|
||||
CMake | 3.24 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
|
||||
GCC | 11.2.1 | 11.2.1 | C++ 17 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
|
||||
Clang | 5.0 | Latest | C++ 17 Compiler: A C language family frontend for LLVM | Y | Y | https://clang.llvm.org
|
||||
Intel ICC | 19 | Latest | C++ 17 Compiler: Intels C++ Compiler | Y | Y | https://software.intel.com/en-us/c-compilers
|
||||
MSVC | 19.28 | 19.30 | C++ 17 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
|
||||
Imath | 3.1 | Latest | Half precision floating points | Y | Y | http://www.openexr.com
|
||||
OpenEXR | 3.1 | Latest | EXR serialization support | Y | Y | http://www.openexr.com
|
||||
TBB | 2020.2 | 2020.3 | Threading Building Blocks - template library for task parallelism | Y | Y | https://www.threadingbuildingblocks.org
|
||||
MSVC | 19.30 | 19.30 | C++ 17 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
|
||||
Imath | 3.2 | >= 3.3 | Half precision floating points | Y | Y | http://www.openexr.com
|
||||
OpenEXR | 3.2 | >= 3.3 | EXR serialization support | Y | Y | http://www.openexr.com
|
||||
TBB | 2020.3 | >= 2021 | Threading Building Blocks - template library for task parallelism | Y | Y | https://www.threadingbuildingblocks.org
|
||||
ZLIB | 1.2.7 | Latest | Compression library for disk serialization compression | Y | Y | https://www.zlib.net
|
||||
Boost | 1.73 | 1.80 | Components: headers, iostreams | Y | Y | https://www.boost.org
|
||||
LLVM | 10.0.0 | 13.0.0* | Target-independent code generation | Y | Y | https://llvm.org/
|
||||
Bison | 3.0.0 | 3.7.0 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
|
||||
Flex | 2.6.0 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
|
||||
Python | 3.9.1 | 3.10 | The python interpreter and libraries | Y | Y | https://www.python.org
|
||||
PyBind11 | 2.9.1 | Latest | C++/python bindings | Y | Y | https://pybind11.readthedocs.io
|
||||
NumPy | 1.20.0 | 1.23.0 | Scientific computing with Python | Y | Y | http://www.numpy.org
|
||||
Boost | 1.82 | >= 1.85 | Components: iostreams | Y | Y | https://www.boost.org
|
||||
LLVM | 15.0.0* | 18.0.0 | Target-independent code generation | Y | Y | https://llvm.org/
|
||||
Bison | 3.7.0 | 3.7.0 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
|
||||
Flex | 2.6.4 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
|
||||
Python | 3.10 | 3.11 | The python interpreter and libraries | Y | Y | https://www.python.org
|
||||
nanobind** | 2.0.0 | >= 2.5.0 | C++/python bindings | Y | Y | https://nanobind.readthedocs.io
|
||||
GoogleTest | 1.10 | Latest | A unit testing framework module for C++ | Y | Y | https://github.com/google/googletest
|
||||
CppUnit | 1.10 | Latest | A unit testing framework module for C++ | N | Y | https://freedesktop.org/wiki/Software/cppunit
|
||||
Blosc | 1.17.0* | 1.17.0 | Recommended dependency for improved disk compression | Y | Y | https://github.com/Blosc/c-blosc/releases
|
||||
Blosc | 1.17.0* | Latest | Recommended dependency for improved disk compression | Y | Y | https://github.com/Blosc/c-blosc/releases
|
||||
Log4cplus | 1.1.2 | Latest | An optional dependency for improved OpenVDB Logging | Y | Y | https://github.com/log4cplus/log4cplus
|
||||
libpng | - | Latest | Library for manipulating PNG images | Y | Y | http://www.libpng.org/pub/png/libpng.html
|
||||
GLFW | 3.1 | > 3.3 | Simple API for OpenGL development | Y | Y | https://www.glfw.org
|
||||
GLFW | 3.3 | Latest | Simple API for OpenGL development | Y | Y | https://www.glfw.org
|
||||
OpenGL | 3.2 | Latest | Environment for developing portable graphics applications | Y | Y | https://www.opengl.org
|
||||
GLEW | 1.0.0 | Latest | A cross-platform OpenGL extension loading library. | Y | Y | http://glew.sourceforge.net
|
||||
CUDA | - | Latest | Parallel computing platform for graphical processing units. | Y | N | https://developer.nvidia.com/cuda-downloads
|
||||
Doxygen | 1.8.8 | 1.8.11 | Documentation generation from C++ | Y | Y | http://www.doxygen.nl
|
||||
|
||||
- @b * See the note in [known issues](@ref depKnownIssues) regarding supported blosc/llvm versions.
|
||||
- @b * See the note in [known issues](@ref depKnownIssues) regarding supported blosc/llvm versions.
|
||||
- @b ** See the note in [known issues](@ref depKnownIssues) regarding supported nanobind build issues.
|
||||
|
||||
@subsection depKnownIssues Known Issues
|
||||
|
||||
- @b LLVM >= 15. LLVM has recently changed their IR pointer data types to be
|
||||
completely opaque. Some support is provided in LLVM 15 but tests with AX show
|
||||
that this is extremely unstable. AX currently only supports LLVM versions up
|
||||
until 14.X.X. See https://llvm.org/docs/OpaquePointers.html for more details.
|
||||
- @b On Linux, LLVM == 17 has symbol issues which makes it incompatible when
|
||||
used with the OpenVDB Python plugin. LLVM versions greater than 18 should be
|
||||
preferred.
|
||||
|
||||
- @b GLFW: Crash with GLFW 3.2.1 when used with EGL on Linux. OpenVDB View may
|
||||
segfault on closure. Fixed in GLFW 3.3
|
||||
@@ -112,6 +110,11 @@ Doxygen | 1.8.8 | 1.8.11 | Documentation generation from C++
|
||||
- https://github.com/Blosc/c-blosc/issues/260
|
||||
- https://github.com/Blosc/c-blosc/issues/261
|
||||
|
||||
- @b nanobind: Nanobind requires a fast-hash-map implementation library called
|
||||
tsl-robin-map. If you're installing nanobind through homebrew, this library
|
||||
may not be installed correctly and OpenVDB's CMake will only produce a warning.
|
||||
Make sure to also: `brew install robin-map`.
|
||||
|
||||
@section depInstallingDependencies Installing Dependencies
|
||||
|
||||
This section details a number of ways to get you up and running with the
|
||||
@@ -145,17 +148,15 @@ apt-get install zlibc # zlib
|
||||
apt-get install libboost-iostreams-dev # Boost::iostream
|
||||
apt-get install libblosc-dev # Blosc
|
||||
# AX
|
||||
apt-get install llvm-10-dev # LLVM
|
||||
apt-get install llvm-15-dev # LLVM
|
||||
# Python
|
||||
apt-get install pybind11-dev # Python
|
||||
apt-get install python-dev # Python
|
||||
apt-get install python-numpy # NumPy
|
||||
pip install nanobind # nanobind
|
||||
# Optional
|
||||
apt-get install libpng-dev # libpng
|
||||
apt-get install libopenexr-dev # OpenEXR
|
||||
apt-get install liblog4cplus-dev # Log4cplus
|
||||
apt-get install googletest # GoogleTest
|
||||
apt-get install libcppunit-dev # CppUnit
|
||||
# vdb_view
|
||||
apt-get install libglfw3-dev # GLFW
|
||||
# Documentation
|
||||
@@ -180,12 +181,10 @@ brew install c-blosc # blosc
|
||||
# AX
|
||||
brew install llvm # LLVM
|
||||
# Python
|
||||
brew install pybind11 # PyBind11
|
||||
brew install python # Python
|
||||
brew install numpy # NumPy
|
||||
brew install nanobind robin-map # nanobind
|
||||
# Unit Tests
|
||||
brew install gtest # GoogleTest
|
||||
brew install cppunit # CppUnit
|
||||
# vdb_view
|
||||
brew install glfw # GLFW
|
||||
# vdb_render
|
||||
|
||||
+4
-4
@@ -40,10 +40,10 @@ details of VDB are described in the paper
|
||||
<a href="http://www.museth.org/Ken/Publications.html" target="_blank">"VDB: High-Resolution Sparse Volumes with Dynamic Topology"</a>.
|
||||
|
||||
@section sWhatLicense What license is OpenVDB distributed under?
|
||||
OpenVDB is released under the Mozilla Public License Version 2.0, which is a
|
||||
free, open source software license developed and maintained by the Mozilla
|
||||
Foundation. For more information about this license, see the
|
||||
<a href="https://www.mozilla.org/en-US/MPL/" target="_blank">Mozilla FAQ</a>.
|
||||
OpenVDB is released under the Apache License Version 2.0, which is a
|
||||
free, open source software license developed and maintained by the Apache Software
|
||||
Foundation. For more information about this license, see
|
||||
<a href="https://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License, Version 2</a>.
|
||||
|
||||
@section sWhatCLA Is there a Contributor License Agreement for OpenVDB?
|
||||
Yes, developers who wish to contribute code to be considered for inclusion
|
||||
|
||||
+52
-23
@@ -5,12 +5,12 @@
|
||||
* [NanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/NanoVDB.h) C++11 implementation of the core data structure and its access methods.
|
||||
* [CNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/CNanoVDB.h) Incomplete but useable C99 implementation of the core data structure and its access methods. Designed in particular for use in OpenCL kernels. Note that this relies on zero-sized arrays for the _reserved padding, so will not work on all compilers (with MSVC being a particular example)
|
||||
* [PNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/PNanoVDB.h) C99 implementation of the core data structure and its access methods. More complete coverage than CNanoVDB. This version is pointer-less and supports virtually all graphics APIs.
|
||||
* [util/GridHandle.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/GridHandle.h) defines a handler for the memory allocated to a NanoVDB grid.
|
||||
* [util/IO.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/IO.h) implements I/O support.
|
||||
* [util/OpenToNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/OpenToNanoVDB.h) defines the converter from OpenVDB to NanoVDB and obviously depends on the OpenVDB library (as the only header file).
|
||||
* [Ray.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/Ray.h) Ray class.
|
||||
* [HDDA.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/HDDA.h) HDDA related.
|
||||
* [SampleFromVoxels.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/SampleFromVoxels.h) interpolation.
|
||||
* [GridHandle.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/GridHandle.h) defines a handler for the memory allocated to a NanoVDB grid.
|
||||
* [io/IO.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/io/IO.h) implements I/O support.
|
||||
* [tools/CreateNanoGrid.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/tools/CreateNanoGrid.h) defines the converter from OpenVDB to NanoVDB and obviously depends on the OpenVDB library (as the only header file).
|
||||
* [math/Ray.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/Ray.h) Ray class.
|
||||
* [math/HDDA.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/HDDA.h) HDDA related.
|
||||
* [math/SampleFromVoxels.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/SampleFromVoxels.h) interpolation.
|
||||
|
||||
```bash
|
||||
foo@bar:~$ tree
|
||||
@@ -22,25 +22,19 @@ foo@bar:~$ tree
|
||||
│ │ └── nanovdb_convert.cc
|
||||
│ ├── print
|
||||
│ │ └── nanovdb_print.cc
|
||||
│ ├── updateFiles.sh
|
||||
│ └── validate
|
||||
│ └── nanovdb_validate.cc
|
||||
├── CNanoVDB.h
|
||||
├── cuda
|
||||
│ ├── DeviceBuffer.h
|
||||
│ ├── GridHandle.cuh
|
||||
│ └── NodeManager.cuh
|
||||
├── docs
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── codingstyle.txt
|
||||
│ └── doxygen-config
|
||||
├── examples
|
||||
│ ├── benchmark
|
||||
│ │ ├── BenchKernels_dense.cu
|
||||
│ │ ├── BenchKernels_nano.cu
|
||||
│ │ ├── Benchmark_dense.cu
|
||||
│ │ ├── Benchmark_nano.cu
|
||||
│ │ ├── Camera.h
|
||||
│ │ ├── CMakeLists.txt
|
||||
│ │ ├── DenseGrid.h
|
||||
│ │ ├── Image.h
|
||||
│ │ ├── TestBenchmark.cc
|
||||
│ │ └── TestBenchmark.cu
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── ex_bump_pool_buffer
|
||||
│ │ └── bump_pool_buffer.cc
|
||||
@@ -50,7 +44,7 @@ foo@bar:~$ tree
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_index_grid_cuda
|
||||
│ │ ├── index_grid_cuda.cu
|
||||
│ │ ├── index_grid_cuda.cc
|
||||
│ │ └── index_grid_cuda_kernel.cu
|
||||
│ ├── ex_make_custom_nanovdb
|
||||
│ │ └── make_custom_nanovdb.cc
|
||||
@@ -66,6 +60,7 @@ foo@bar:~$ tree
|
||||
│ ├── ex_map_pool_buffer
|
||||
│ │ └── map_pool_buffer.cc
|
||||
│ ├── ex_modify_nanovdb_thrust
|
||||
│ │ ├── modify_nanovdb_thrust.cc
|
||||
│ │ └── modify_nanovdb_thrust.cu
|
||||
│ ├── ex_nodemanager_cuda
|
||||
│ │ ├── nodemanager_cuda.cc
|
||||
@@ -103,9 +98,38 @@ foo@bar:~$ tree
|
||||
│ │ └── VoxToNanoVDB.h
|
||||
│ └── ex_write_nanovdb_grids
|
||||
│ └── write_nanovdb_grids.cc
|
||||
├── GridHandle.h
|
||||
├── HostBuffer.h
|
||||
├── io
|
||||
│ └── IO.h
|
||||
├── math
|
||||
│ ├── CSampleFromVoxels.h
|
||||
│ ├── DitherLUT.h
|
||||
│ ├── HDDA.h
|
||||
│ ├── Math.h
|
||||
│ ├── Ray.h
|
||||
│ ├── SampleFromVoxels.h
|
||||
│ └── Stencils.h
|
||||
├── NanoVDB.h
|
||||
├── NodeManager.h
|
||||
├── PNanoVDB.h
|
||||
├── Readme.md
|
||||
├── tools
|
||||
│ ├── CreateNanoGrid.h
|
||||
│ ├── CreatePrimitives.h
|
||||
│ ├── cuda
|
||||
│ │ ├── AddBlindData.cuh
|
||||
│ │ ├── GridChecksum.cuh
|
||||
│ │ ├── GridStats.cuh
|
||||
│ │ ├── GridValidator.cuh
|
||||
│ │ ├── IndexToGrid.cuh
|
||||
│ │ ├── PointsToGrid.cuh
|
||||
│ │ └── SignedFloodFill.cuh
|
||||
│ ├── GridBuilder.h
|
||||
│ ├── GridChecksum.h
|
||||
│ ├── GridStats.h
|
||||
│ ├── GridValidator.h
|
||||
│ └── NanoToOpenVDB.h
|
||||
├── unittest
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── pnanovdb_validate_strides.h
|
||||
@@ -115,21 +139,25 @@ foo@bar:~$ tree
|
||||
└── util
|
||||
├── CpuTimer.h
|
||||
├── CreateNanoGrid.h
|
||||
├── CSampleFromVoxels.h
|
||||
├── cuda
|
||||
│ ├── CudaAddBlindData.cuh
|
||||
│ ├── CudaDeviceBuffer.h
|
||||
│ ├── CudaGridChecksum.cuh
|
||||
│ ├── CudaGridHandle.cuh
|
||||
│ ├── CudaGridStats.cuh
|
||||
│ ├── CudaGridValidator.cuh
|
||||
│ ├── CudaIndexToGrid.cuh
|
||||
│ ├── CudaNodeManager.cuh
|
||||
│ ├── CudaPointsToGrid.cuh
|
||||
│ ├── CudaSignedFloodFill.cuh
|
||||
│ ├── CudaUtils.h
|
||||
│ └── GpuTimer.cuh
|
||||
│ ├── GpuTimer.h
|
||||
│ ├── Timer.h
|
||||
│ └── Util.h
|
||||
├── DitherLUT.h
|
||||
├── ForEach.h
|
||||
├── GridBuilder.h
|
||||
├── GridChecksum.h
|
||||
├── GridHandle.h
|
||||
├── GridStats.h
|
||||
├── GridValidator.h
|
||||
├── HDDA.h
|
||||
@@ -145,5 +173,6 @@ foo@bar:~$ tree
|
||||
├── Ray.h
|
||||
├── Reduce.h
|
||||
├── SampleFromVoxels.h
|
||||
└── Stencils.h
|
||||
```
|
||||
├── Stencils.h
|
||||
├── Timer.h
|
||||
└── Util.h
|
||||
+3
-5
@@ -441,11 +441,9 @@ not on their active states or other attributes.
|
||||
|
||||
Large data sets are often handled in Python using
|
||||
<a href="http://www.numpy.org/">NumPy</a>.
|
||||
The OpenVDB Python module can optionally be compiled with NumPy support.
|
||||
With NumPy enabled, the @b copyFromArray and @b copyToArray grid methods
|
||||
can be used to exchange data efficiently between scalar-valued grids
|
||||
and three-dimensional NumPy arrays and between vector-valued grids and
|
||||
four-dimensional NumPy arrays.
|
||||
The @b copyFromArray and @b copyToArray grid methods can be used to exchange
|
||||
data efficiently between scalar-valued grids and three-dimensional NumPy
|
||||
arrays and between vector-valued grids and four-dimensional NumPy arrays.
|
||||
@code{.py}
|
||||
>>> import pyopenvdb as vdb
|
||||
>>> import numpy
|
||||
|
||||
+138
-31
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(NanoVDB LANGUAGES C CXX)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -26,6 +26,7 @@ option(NANOVDB_BUILD_TOOLS "Build command-line tools" ON)
|
||||
option(NANOVDB_BUILD_UNITTESTS "Build Unit tests" OFF)
|
||||
option(NANOVDB_BUILD_EXAMPLES "Build examples" OFF)
|
||||
#option(NANOVDB_BUILD_BENCHMARK "Build benchmark in examples" OFF)
|
||||
option(NANOVDB_BUILD_PYTHON_MODULE "Build the nanovdb Python module" OFF)
|
||||
|
||||
option(NANOVDB_USE_INTRINSICS "Build with hardware intrinsics support" OFF)
|
||||
option(NANOVDB_USE_CUDA "Build with CUDA support" OFF)
|
||||
@@ -73,18 +74,16 @@ endif()
|
||||
|
||||
#if(NANOVDB_BUILD_UNITTESTS OR NANOVDB_BUILD_BENCHMARK)
|
||||
if(NANOVDB_BUILD_UNITTESTS)
|
||||
find_package(GTest REQUIRED)
|
||||
find_package(GTest ${MINIMUM_GOOGLETEST_VERSION} REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_CUDA)
|
||||
set(CMAKE_CUDA_STANDARD 17)
|
||||
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
|
||||
|
||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
|
||||
# Allow the user to provide CMAKE_CUDA_ARCHITECTURES
|
||||
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
|
||||
set(CMAKE_CUDA_ARCHITECTURES 75)
|
||||
endif()
|
||||
# Allow the user to provide CMAKE_CUDA_ARCHITECTURES
|
||||
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
|
||||
set(CMAKE_CUDA_ARCHITECTURES 75)
|
||||
endif()
|
||||
|
||||
enable_language(CUDA)
|
||||
@@ -114,6 +113,20 @@ if(NANOVDB_USE_CUDA)
|
||||
get_target_property(VDB_MSVC_RUNTIME_SELECTION openvdb MSVC_RUNTIME_LIBRARY)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(CUDAToolkit)
|
||||
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
# This will automatically clone CCCL from GitHub and make the exported cmake targets available
|
||||
CPMAddPackage(
|
||||
NAME CCCL
|
||||
GITHUB_REPOSITORY nvidia/cccl
|
||||
GIT_TAG main # Fetches the latest commit on the main branch
|
||||
)
|
||||
|
||||
find_package(NCCL)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_OPENVDB)
|
||||
@@ -123,15 +136,15 @@ if(NANOVDB_USE_OPENVDB)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_TBB AND NOT TARGET TBB::tbb)
|
||||
find_package(TBB REQUIRED)
|
||||
find_package(TBB ${MINIMUM_TBB_VERSION} REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_BLOSC AND NOT TARGET Blosc::blosc)
|
||||
find_package(Blosc REQUIRED)
|
||||
find_package(Blosc ${MINIMUM_BLOSC_VERSION} REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_ZLIB AND NOT TARGET ZLIB::ZLIB)
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(ZLIB ${MINIMUM_ZLIB_VERSION} REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_MAGICAVOXEL)
|
||||
@@ -160,31 +173,80 @@ endif()
|
||||
# NanoVDB header files
|
||||
set(NANOVDB_INCLUDE_FILES
|
||||
CNanoVDB.h
|
||||
GridHandle.h
|
||||
HostBuffer.h
|
||||
NanoVDB.h
|
||||
NodeManager.h
|
||||
PNanoVDB.h
|
||||
)
|
||||
|
||||
# NanoVDB cuda header files
|
||||
set(NANOVDB_INCLUDE_CUDA_FILES
|
||||
cuda/DeviceBuffer.h
|
||||
cuda/DeviceMesh.h
|
||||
cuda/DeviceResource.h
|
||||
cuda/DeviceStreamMap.h
|
||||
cuda/GridHandle.cuh
|
||||
cuda/NodeManager.cuh
|
||||
cuda/TempPool.h
|
||||
cuda/UnifiedBuffer.h
|
||||
)
|
||||
|
||||
# NanoVDB io header files
|
||||
set(NANOVDB_INCLUDE_IO_FILES
|
||||
io/IO.h
|
||||
)
|
||||
|
||||
# NanoVDB math header files
|
||||
set(NANOVDB_INCLUDE_MATH_FILES
|
||||
math/CSampleFromVoxels.h
|
||||
math/DitherLUT.h
|
||||
math/HDDA.h
|
||||
math/Math.h
|
||||
math/Ray.h
|
||||
math/SampleFromVoxels.h
|
||||
math/Stencils.h
|
||||
)
|
||||
|
||||
# NanoVDB tools header files
|
||||
set(NANOVDB_INCLUDE_TOOLS_FILES
|
||||
tools/CreateNanoGrid.h
|
||||
tools/CreatePrimitives.h
|
||||
tools/GridBuilder.h
|
||||
tools/GridChecksum.h
|
||||
tools/GridStats.h
|
||||
tools/GridValidator.h
|
||||
tools/NanoToOpenVDB.h
|
||||
tools/VoxelBlockManager.h
|
||||
)
|
||||
|
||||
# NanoVDB tools/cuda header files
|
||||
set(NANOVDB_INCLUDE_TOOLS_CUDA_FILES
|
||||
tools/cuda/AddBlindData.cuh
|
||||
tools/cuda/GridChecksum.cuh
|
||||
tools/cuda/GridStats.cuh
|
||||
tools/cuda/GridValidator.cuh
|
||||
tools/cuda/IndexToGrid.cuh
|
||||
tools/cuda/PointsToGrid.cuh
|
||||
tools/cuda/SignedFloodFill.cuh
|
||||
tools/cuda/MergeGrids.cuh
|
||||
tools/cuda/TopologyBuilder.cuh
|
||||
tools/cuda/RefineGrid.cuh
|
||||
tools/cuda/PruneGrid.cuh
|
||||
tools/cuda/DistributedPointsToGrid.cuh
|
||||
tools/cuda/DilateGrid.cuh
|
||||
tools/cuda/CoarsenGrid.cuh
|
||||
tools/cuda/VoxelBlockManager.cuh
|
||||
)
|
||||
|
||||
# NanoVDB util header files
|
||||
set(NANOVDB_INCLUDE_UTILFILES
|
||||
set(NANOVDB_INCLUDE_UTIL_FILES
|
||||
util/CpuTimer.h
|
||||
util/CreateNanoGrid.h
|
||||
util/CSampleFromVoxels.h
|
||||
util/cuda/CudaAddBlindData.cuh
|
||||
util/cuda/CudaDeviceBuffer.h
|
||||
util/cuda/CudaGridChecksum.cuh
|
||||
util/cuda/CudaGridHandle.cuh
|
||||
util/cuda/CudaGridStats.cuh
|
||||
util/cuda/CudaIndexToGrid.cuh
|
||||
util/cuda/CudaNodeManager.cuh
|
||||
util/cuda/CudaPointsToGrid.cuh
|
||||
util/cuda/CudaSignedFloodFill.cuh
|
||||
util/cuda/CudaUtils.h
|
||||
util/cuda/GpuTimer.h
|
||||
util/DitherLUT.h
|
||||
util/ForEach.h
|
||||
util/GridBuilder.h
|
||||
util/GridChecksum.h
|
||||
util/GridHandle.h
|
||||
util/GridStats.h
|
||||
util/GridValidator.h
|
||||
util/HDDA.h
|
||||
@@ -201,6 +263,31 @@ set(NANOVDB_INCLUDE_UTILFILES
|
||||
util/Reduce.h
|
||||
util/SampleFromVoxels.h
|
||||
util/Stencils.h
|
||||
util/Timer.h
|
||||
util/Util.h
|
||||
util/MorphologyHelpers.h
|
||||
)
|
||||
|
||||
# NanoVDB util/cuda header files
|
||||
set(NANOVDB_INCLUDE_UTIL_CUDA_FILES
|
||||
util/cuda/CudaAddBlindData.cuh
|
||||
util/cuda/CudaGridHandle.cuh
|
||||
util/cuda/CudaIndexToGrid.cuh
|
||||
util/cuda/CudaSignedFloodFill.cuh
|
||||
util/cuda/Timer.h
|
||||
util/cuda/CudaDeviceBuffer.h
|
||||
util/cuda/CudaGridStats.cuh
|
||||
util/cuda/CudaNodeManager.cuh
|
||||
util/cuda/CudaUtils.h
|
||||
util/cuda/Util.h
|
||||
util/cuda/CudaGridChecksum.cuh
|
||||
util/cuda/CudaGridValidator.cuh
|
||||
util/cuda/CudaPointsToGrid.cuh
|
||||
util/cuda/GpuTimer.h
|
||||
util/cuda/Morphology.cuh
|
||||
util/cuda/MorphologyHelpers.cuh
|
||||
util/cuda/DeviceGridTraits.cuh
|
||||
util/cuda/Injection.cuh
|
||||
)
|
||||
|
||||
add_library(nanovdb INTERFACE)
|
||||
@@ -253,8 +340,12 @@ if(NANOVDB_USE_CUDA)
|
||||
endif()
|
||||
|
||||
# Add CUDA includes to any C++ units which use NanoVDB
|
||||
target_include_directories(nanovdb INTERFACE
|
||||
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
|
||||
target_link_libraries(nanovdb INTERFACE CCCL::CCCL CUDA::cudart)
|
||||
|
||||
if(NCCL_FOUND)
|
||||
target_compile_definitions(nanovdb INTERFACE -DNANOVDB_USE_NCCL)
|
||||
target_link_libraries(nanovdb INTERFACE NCCL::NCCL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_MAGICAVOXEL)
|
||||
@@ -266,11 +357,23 @@ if(TARGET Threads::Threads)
|
||||
target_link_libraries(nanovdb INTERFACE Threads::Threads)
|
||||
endif()
|
||||
|
||||
set(NANOVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/nanovdb)
|
||||
set(NANOVDB_INSTALL_UTILDIR ${NANOVDB_INSTALL_INCLUDEDIR}/util)
|
||||
set(NANOVDB_INSTALL_ROOT_DIR ${NANOVDB_INSTALL_INCLUDEDIR}/nanovdb)
|
||||
set(NANOVDB_INSTALL_CUDA_DIR ${NANOVDB_INSTALL_ROOT_DIR}/cuda)
|
||||
set(NANOVDB_INSTALL_IO_DIR ${NANOVDB_INSTALL_ROOT_DIR}/io)
|
||||
set(NANOVDB_INSTALL_MATH_DIR ${NANOVDB_INSTALL_ROOT_DIR}/math)
|
||||
set(NANOVDB_INSTALL_TOOLS_DIR ${NANOVDB_INSTALL_ROOT_DIR}/tools)
|
||||
set(NANOVDB_INSTALL_TOOLS_CUDA_DIR ${NANOVDB_INSTALL_TOOLS_DIR}/cuda)
|
||||
set(NANOVDB_INSTALL_UTIL_DIR ${NANOVDB_INSTALL_ROOT_DIR}/util)
|
||||
set(NANOVDB_INSTALL_UTIL_CUDA_DIR ${NANOVDB_INSTALL_UTIL_DIR}/cuda)
|
||||
|
||||
install(FILES ${NANOVDB_INCLUDE_FILES} DESTINATION ${NANOVDB_INSTALL_INCLUDEDIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_UTILFILES} DESTINATION ${NANOVDB_INSTALL_UTILDIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_FILES} DESTINATION ${NANOVDB_INSTALL_ROOT_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_CUDA_FILES} DESTINATION ${NANOVDB_INSTALL_CUDA_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_IO_FILES} DESTINATION ${NANOVDB_INSTALL_IO_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_MATH_FILES} DESTINATION ${NANOVDB_INSTALL_MATH_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_TOOLS_FILES} DESTINATION ${NANOVDB_INSTALL_TOOLS_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_TOOLS_CUDA_FILES} DESTINATION ${NANOVDB_INSTALL_TOOLS_CUDA_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_UTIL_FILES} DESTINATION ${NANOVDB_INSTALL_UTIL_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_UTIL_CUDA_FILES} DESTINATION ${NANOVDB_INSTALL_UTIL_CUDA_DIR})
|
||||
|
||||
###############################################################################
|
||||
# Options
|
||||
@@ -287,3 +390,7 @@ endif()
|
||||
if(NANOVDB_BUILD_EXAMPLES)
|
||||
add_subdirectory(examples)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_BUILD_PYTHON_MODULE)
|
||||
add_subdirectory(python)
|
||||
endif()
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
//
|
||||
// Simple C-wrapper for the nanovdb structure
|
||||
// Meant for systems where you lack a C++ compiler.
|
||||
//
|
||||
|
||||
/// @warning This header file will soon be deprecated in favor of PNanoVDB.h
|
||||
|
||||
#ifndef __CNANOVDB__
|
||||
#define __CNANOVDB__
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file GridHandle.h
|
||||
\file nanovdb/GridHandle.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
#include <vector>
|
||||
#include <initializer_list>
|
||||
|
||||
#include <nanovdb/NanoVDB.h>// for mapToGridType
|
||||
#include <nanovdb/util/HostBuffer.h>
|
||||
#include <nanovdb/util/GridChecksum.h>// for updateGridCount
|
||||
#include <nanovdb/NanoVDB.h>// for toGridType
|
||||
#include <nanovdb/HostBuffer.h>
|
||||
#include <nanovdb/tools/GridChecksum.h>// for updateGridCount
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
@@ -45,16 +45,17 @@ class GridHandle
|
||||
public:
|
||||
using BufferType = BufferT;
|
||||
|
||||
/// @brief Move constructor from a host buffer
|
||||
/// @param buffer buffer containing one or more NanoGrids that will be moved into this GridHandle
|
||||
/// @throw Will throw and error with the buffer does not contain a valid NanoGrid!
|
||||
template<typename T = BufferT, typename enable_if<BufferTraits<T>::hasDeviceDual, int>::type = 0>
|
||||
GridHandle(T&& buffer);
|
||||
|
||||
/// @brief Move constructor from a dual host-device buffer
|
||||
/// @param buffer buffer containing one or more NanoGrids that will be moved into this GridHandle
|
||||
/// @throw Will throw and error with the buffer does not contain a valid NanoGrid!
|
||||
template<typename T = BufferT, typename disable_if<BufferTraits<T>::hasDeviceDual, int>::type = 0>
|
||||
/// @note The implementation of this template specialization is in nanovdb/cuda/GridHandle.cuh since it requires CUDA
|
||||
template<typename T = BufferT, typename util::enable_if<BufferTraits<T>::hasDeviceDual, int>::type = 0>
|
||||
GridHandle(T&& buffer);
|
||||
|
||||
/// @brief Move constructor from a host buffer
|
||||
/// @param buffer buffer containing one or more NanoGrids that will be moved into this GridHandle
|
||||
/// @throw Will throw and error with the buffer does not contain a valid NanoGrid!
|
||||
template<typename T = BufferT, typename util::disable_if<BufferTraits<T>::hasDeviceDual, int>::type = 0>
|
||||
GridHandle(T&& buffer);
|
||||
|
||||
/// @brief Constructs an empty GridHandle
|
||||
@@ -100,29 +101,38 @@ public:
|
||||
|
||||
/// @brief Returns a non-const pointer to the data.
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized
|
||||
uint8_t* data() { return mBuffer.data(); }
|
||||
void* data() { return mBuffer.data(); }
|
||||
|
||||
/// @brief Returns a const pointer to the data.
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized
|
||||
const uint8_t* data() const { return mBuffer.data(); }
|
||||
const void* data() const { return mBuffer.data(); }
|
||||
|
||||
template<typename U = BufferT>
|
||||
typename enable_if<BufferTraits<U>::hasDeviceDual, const uint8_t*>::type
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const void*>::type
|
||||
deviceData() const { return mBuffer.deviceData(); }
|
||||
template<typename U = BufferT>
|
||||
typename enable_if<BufferTraits<U>::hasDeviceDual, uint8_t*>::type
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const void*>::type
|
||||
deviceData(int device) const { return mBuffer.deviceData(device); }
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void*>::type
|
||||
deviceData() { return mBuffer.deviceData(); }
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void*>::type
|
||||
deviceData(int device) { return mBuffer.deviceData(device); }
|
||||
|
||||
//@{
|
||||
/// @brief Returns the size in bytes of the raw memory buffer managed by this GridHandle.
|
||||
uint64_t size() const { return mBuffer.size(); }
|
||||
[[deprecated("Use GridHandle::bufferSize instead.")]] uint64_t size() const { return mBuffer.size(); }
|
||||
uint64_t bufferSize() const { return mBuffer.size(); }
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/// @brief Return true if this handle is empty, i.e. has no allocated memory
|
||||
bool empty() const { return this->size() == 0; }
|
||||
bool isEmpty() const { return this->size() == 0; }
|
||||
bool empty() const { return mBuffer.size() == 0; }
|
||||
bool isEmpty() const { return mBuffer.size() == 0; }
|
||||
//@}
|
||||
|
||||
/// @brief Return true if this handle contains any grids
|
||||
/// @brief Return true if this handle is not empty, i.e. contains at least one grid
|
||||
operator bool() const { return !this->empty(); }
|
||||
|
||||
/// @brief Returns a const host pointer to the @a n'th NanoVDB grid encoded in this GridHandle.
|
||||
@@ -147,30 +157,42 @@ public:
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle has no device grid, @a n is invalid,
|
||||
/// or if the template parameter does not match the specified grid.
|
||||
template<typename ValueT, typename U = BufferT>
|
||||
typename enable_if<BufferTraits<U>::hasDeviceDual, const NanoGrid<ValueT>*>::type
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NanoGrid<ValueT>*>::type
|
||||
deviceGrid(uint32_t n=0) const;
|
||||
|
||||
/// @brief Return a const pointer to the @a n'th grid encoded in this GridHandle on the device, e.g. GPU
|
||||
/// @tparam ValueT Value type of the grid point to be returned
|
||||
/// @param n Index if of the grid pointer to be returned
|
||||
/// @param n Index of the grid pointer to be returned
|
||||
/// @param verbose if non-zero error messages will be printed in case something failed
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized, @a n is invalid,
|
||||
/// or if the template parameter does not match the specified grid.
|
||||
template<typename ValueT, typename U = BufferT>
|
||||
typename enable_if<BufferTraits<U>::hasDeviceDual, NanoGrid<ValueT>*>::type
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, NanoGrid<ValueT>*>::type
|
||||
deviceGrid(uint32_t n=0){return const_cast<NanoGrid<ValueT>*>(static_cast<const GridHandle*>(this)->template deviceGrid<ValueT>(n));}
|
||||
|
||||
/// @brief Upload the grid to the device, e.g. from CPU to GPU
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(void* stream = nullptr, bool sync = true) { mBuffer.deviceUpload(stream, sync); }
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(void* stream, bool sync = true) { mBuffer.deviceUpload(stream, sync); }
|
||||
|
||||
/// @brief Upload the host buffer to a specific device buffer. It device buffer doesn't exist it's created first
|
||||
/// @param device Device to upload host data to
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(int device = 0, void* stream = nullptr, bool sync = true) { mBuffer.deviceUpload(device, stream, sync); }
|
||||
|
||||
/// @brief Download the grid to from the device, e.g. from GPU to CPU
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(void* stream = nullptr, bool sync = true) { mBuffer.deviceDownload(stream, sync); }
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(void* stream, bool sync = true) { mBuffer.deviceDownload(stream, sync); }
|
||||
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(int device = 0, void* stream = nullptr, bool sync = true) { mBuffer.deviceDownload(device, stream, sync); }
|
||||
|
||||
/// @brief Check if the buffer is this handle has any padding, i.e. if the buffer is larger than the combined size of all its grids
|
||||
/// @return true is the combined size of all grid is smaller than the buffer size
|
||||
@@ -184,6 +206,23 @@ public:
|
||||
/// @return Return the byte size of the specified grid
|
||||
uint64_t gridSize(uint32_t n = 0) const {return mMetaData[n].size; }
|
||||
|
||||
/// @brief compute the total sum of memory footprints of all the grids in this buffer
|
||||
/// @return the number of bytes occupied by all grids associated with this buffer
|
||||
uint64_t totalGridSize() const {
|
||||
uint64_t sum = 0;
|
||||
for (auto &m : mMetaData) sum += m.size;
|
||||
NANOVDB_ASSERT(sum <= mBuffer.size());
|
||||
return sum;
|
||||
}
|
||||
|
||||
/// @brief compute the size of unused storage in this buffer
|
||||
/// @return the number of unused bytes in this buffer.
|
||||
uint64_t freeSize() const {return mBuffer.size() - this->totalGridSize();}
|
||||
|
||||
/// @brief Test if this buffer has any unused storage left, i.e. memory not occupied by grids
|
||||
/// @return true if there is no extra storage left in this buffer, i.e. empty or fully occupied with grids
|
||||
bool isFull() const { return this->totalGridSize() == mBuffer.size(); }
|
||||
|
||||
/// @brief Return the GridType of the @a n'th grid in this GridHandle
|
||||
/// @param n index of the grid (assumed to be less than gridCount())
|
||||
/// @return Return the GridType of the specified grid
|
||||
@@ -250,12 +289,12 @@ public:
|
||||
/// @param is input stream containing a raw grid buffer
|
||||
/// @param gridName string name of the grid to be read
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
/// @throw Will throw a std::logic_error if the stream does not contain a valid raw grid with the speficied name
|
||||
/// @throw Will throw a std::logic_error if the stream does not contain a valid raw grid with the specified name
|
||||
void read(std::istream& is, const std::string &gridName, const BufferT& pool = BufferT());
|
||||
|
||||
/// @brief Read a raw grid buffer from a file
|
||||
/// @param filename string name of the input file containing a raw grid buffer
|
||||
/// @param pool optional pool from which to allocate the new grid buffe
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
void read(const std::string &fileName, const BufferT& pool = BufferT()) {
|
||||
std::ifstream is(fileName, std::ios::in | std::ios::binary);
|
||||
if (!is.is_open()) throw std::ios_base::failure("Unable to open file named \"" + fileName + "\" for input");
|
||||
@@ -292,41 +331,40 @@ public:
|
||||
template<typename BufferT>
|
||||
inline const GridData* GridHandle<BufferT>::gridData(uint32_t n) const
|
||||
{
|
||||
const uint8_t *data = this->data();
|
||||
const void *data = this->data();
|
||||
if (data == nullptr || n >= mMetaData.size()) return nullptr;
|
||||
return reinterpret_cast<const GridData*>(data + mMetaData[n].offset);
|
||||
return util::PtrAdd<GridData>(data, mMetaData[n].offset);
|
||||
}// const GridData* GridHandle<BufferT>::gridData(uint32_t n) const
|
||||
|
||||
template<typename BufferT>
|
||||
inline const GridMetaData* GridHandle<BufferT>::gridMetaData(uint32_t n) const
|
||||
{
|
||||
const uint8_t *data = this->data();
|
||||
const auto *data = this->data();
|
||||
if (data == nullptr || n >= mMetaData.size()) return nullptr;
|
||||
return reinterpret_cast<const GridMetaData*>(data + mMetaData[n].offset);
|
||||
return util::PtrAdd<GridMetaData>(data, mMetaData[n].offset);
|
||||
}// const GridMetaData* GridHandle<BufferT>::gridMetaData(uint32_t n) const
|
||||
|
||||
namespace {// anonymous namespace
|
||||
inline __hostdev__ void cpyMetaData(const GridData *data, GridHandleMetaData *meta)
|
||||
inline __hostdev__ void cpyGridHandleMeta(const GridData *data, GridHandleMetaData *meta)
|
||||
{
|
||||
uint64_t offset = 0;
|
||||
for (auto *p=meta, *q=p+data->mGridCount; p!=q; ++p) {
|
||||
*p = {offset, data->mGridSize, data->mGridType};
|
||||
offset += p->size;
|
||||
data = PtrAdd<const GridData>(data, p->size);
|
||||
data = util::PtrAdd<GridData>(data, p->size);
|
||||
}
|
||||
}// void cpyMetaData(const GridData *data, GridHandleMetaData *meta)
|
||||
}// anonymous namespace
|
||||
}// void cpyGridHandleMeta(const GridData *data, GridHandleMetaData *meta)
|
||||
|
||||
// template specialization of move constructor from a host buffer
|
||||
template<typename BufferT>
|
||||
template<typename T, typename disable_if<BufferTraits<T>::hasDeviceDual, int>::type>
|
||||
template<typename T, typename util::disable_if<BufferTraits<T>::hasDeviceDual, int>::type>
|
||||
GridHandle<BufferT>::GridHandle(T&& buffer)
|
||||
{
|
||||
static_assert(is_same<T,BufferT>::value, "Expected U==BufferT");
|
||||
static_assert(util::is_same<T,BufferT>::value, "Expected U==BufferT");
|
||||
mBuffer = std::move(buffer);
|
||||
if (auto *data = reinterpret_cast<const GridData*>(mBuffer.data())) {
|
||||
if (!data->isValid()) throw std::runtime_error("GridHandle was constructed with an invalid host buffer");
|
||||
mMetaData.resize(data->mGridCount);
|
||||
cpyMetaData(data, mMetaData.data());
|
||||
cpyGridHandleMeta(data, mMetaData.data());
|
||||
}
|
||||
}// GridHandle<BufferT>::GridHandle(T&& buffer)
|
||||
|
||||
@@ -344,19 +382,19 @@ template<typename BufferT>
|
||||
template<typename ValueT>
|
||||
inline const NanoGrid<ValueT>* GridHandle<BufferT>::grid(uint32_t n) const
|
||||
{
|
||||
const uint8_t *data = mBuffer.data();
|
||||
if (data == nullptr || n >= mMetaData.size() || mMetaData[n].gridType != mapToGridType<ValueT>()) return nullptr;
|
||||
return reinterpret_cast<const NanoGrid<ValueT>*>(data + mMetaData[n].offset);
|
||||
const void *data = mBuffer.data();
|
||||
if (data == nullptr || n >= mMetaData.size() || mMetaData[n].gridType != toGridType<ValueT>()) return nullptr;
|
||||
return util::PtrAdd<NanoGrid<ValueT>>(data, mMetaData[n].offset);
|
||||
}// const NanoGrid<ValueT>* GridHandle<BufferT>::grid(uint32_t n) const
|
||||
|
||||
template<typename BufferT>
|
||||
template<typename ValueT, typename U>
|
||||
inline typename enable_if<BufferTraits<U>::hasDeviceDual, const NanoGrid<ValueT>*>::type
|
||||
inline typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NanoGrid<ValueT>*>::type
|
||||
GridHandle<BufferT>::deviceGrid(uint32_t n) const
|
||||
{
|
||||
const uint8_t *data = mBuffer.deviceData();
|
||||
if (data == nullptr || n >= mMetaData.size() || mMetaData[n].gridType != mapToGridType<ValueT>()) return nullptr;
|
||||
return reinterpret_cast<const NanoGrid<ValueT>*>(data + mMetaData[n].offset);
|
||||
const void *data = mBuffer.deviceData();
|
||||
if (data == nullptr || n >= mMetaData.size() || mMetaData[n].gridType != toGridType<ValueT>()) return nullptr;
|
||||
return util::PtrAdd<NanoGrid<ValueT>>(data, mMetaData[n].offset);
|
||||
}// GridHandle<BufferT>::deviceGrid(uint32_t n) cons
|
||||
|
||||
template<typename BufferT>
|
||||
@@ -395,7 +433,7 @@ void GridHandle<BufferT>::read(std::istream& is, uint32_t n, const BufferT& pool
|
||||
auto buffer = BufferT::create(data.mGridSize, &pool);
|
||||
is.seekg(-sizeof(GridData), std::ios::cur);// rewind
|
||||
is.read((char*)(buffer.data()), data.mGridSize);
|
||||
updateGridCount((GridData*)buffer.data(), 0u, 1u);
|
||||
tools::updateGridCount((GridData*)buffer.data(), 0u, 1u);
|
||||
*this = GridHandle(std::move(buffer));
|
||||
} else {
|
||||
is.seekg(-sizeof(GridData), std::ios::cur);// rewind sizeof(GridData) bytes to undo initial read
|
||||
@@ -420,7 +458,7 @@ void GridHandle<BufferT>::read(std::istream& is, const std::string &gridName, co
|
||||
if (n>data.mGridCount) throw std::runtime_error("No raw grid named \""+gridName+"\"");
|
||||
auto buffer = BufferT::create(data.mGridSize, &pool);
|
||||
is.read((char*)(buffer.data()), data.mGridSize);
|
||||
updateGridCount((GridData*)buffer.data(), 0u, 1u);
|
||||
tools::updateGridCount((GridData*)buffer.data(), 0u, 1u);
|
||||
*this = GridHandle(std::move(buffer));
|
||||
} else {
|
||||
throw std::logic_error("This file does not contain a valid raw buffer");
|
||||
@@ -439,7 +477,7 @@ inline VectorT<GridHandle<BufferT>>
|
||||
splitGrids(const GridHandle<BufferT> &handle, const BufferT* other = nullptr)
|
||||
{
|
||||
using HandleT = GridHandle<BufferT>;
|
||||
const uint8_t *ptr = handle.data();
|
||||
const void *ptr = handle.data();
|
||||
if (ptr == nullptr) return VectorT<HandleT>();
|
||||
VectorT<HandleT> handles(handle.gridCount());
|
||||
for (auto &h : handles) {
|
||||
@@ -448,11 +486,11 @@ splitGrids(const GridHandle<BufferT> &handle, const BufferT* other = nullptr)
|
||||
auto buffer = BufferT::create(src->mGridSize, other);
|
||||
GridData *dst = reinterpret_cast<GridData*>(buffer.data());
|
||||
std::memcpy(dst, src, src->mGridSize);
|
||||
updateGridCount(dst, 0u, 1u);
|
||||
tools::updateGridCount(dst, 0u, 1u);
|
||||
h = HandleT(std::move(buffer));
|
||||
ptr += src->mGridSize;
|
||||
ptr = util::PtrAdd(ptr, src->mGridSize);
|
||||
}
|
||||
return std::move(handles);
|
||||
return handles;
|
||||
}// splitGrids
|
||||
|
||||
/// @brief Combines (or merges) multiple GridHandles into a single GridHandle containing all grids
|
||||
@@ -471,16 +509,16 @@ mergeGrids(const VectorT<GridHandle<BufferT>> &handles, const BufferT* pool = nu
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) size += h.gridSize(n);
|
||||
}
|
||||
auto buffer = BufferT::create(size, pool);
|
||||
uint8_t *dst = buffer.data();
|
||||
void *dst = buffer.data();
|
||||
for (auto &h : handles) {
|
||||
const uint8_t *src = h.data();
|
||||
const void *src = h.data();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) {
|
||||
std::memcpy(dst, src, h.gridSize(n));
|
||||
GridData *data = reinterpret_cast<GridData*>(dst);
|
||||
NANOVDB_ASSERT(data->isValid());
|
||||
updateGridCount(data, counter++, gridCount);
|
||||
dst += data->mGridSize;
|
||||
src += data->mGridSize;
|
||||
tools::updateGridCount(data, counter++, gridCount);
|
||||
dst = util::PtrAdd(dst, data->mGridSize);
|
||||
src = util::PtrAdd(src, data->mGridSize);
|
||||
}
|
||||
}
|
||||
return GridHandle<BufferT>(std::move(buffer));
|
||||
@@ -489,7 +527,7 @@ mergeGrids(const VectorT<GridHandle<BufferT>> &handles, const BufferT* pool = nu
|
||||
} // namespace nanovdb
|
||||
|
||||
#if defined(__CUDACC__)
|
||||
#include <nanovdb/util/cuda/CudaGridHandle.cuh>
|
||||
#include <nanovdb/cuda/GridHandle.cuh>
|
||||
#endif// defined(__CUDACC__)
|
||||
|
||||
#endif // NANOVDB_GRID_HANDLE_H_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,591 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
@file nanovdb/HostBuffer.h
|
||||
|
||||
@date April 20, 2021
|
||||
|
||||
@brief HostBuffer - a buffer that contains a shared or private bump
|
||||
pool to either externally or internally managed host memory.
|
||||
|
||||
@details This HostBuffer can be used in multiple ways, most of which are
|
||||
demonstrated in the examples below. Memory in the pool can
|
||||
be managed or unmanged (e.g. internal or external) and can
|
||||
be shared between multiple buffers or belong to a single buffer.
|
||||
|
||||
Example that uses HostBuffer::create inside io::readGrids to create a
|
||||
full self-managed buffer, i.e. not shared and without padding, per grid in the file.
|
||||
@code
|
||||
auto handles = nanovdb::io::readGrids("file.nvdb");
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createFull. Assuming you have a raw pointer
|
||||
to a NanoVDB grid of unknown type, this examples shows how to create its
|
||||
GridHandle which can be used to enquire about the grid type and meta data.
|
||||
@code
|
||||
void *data;// pointer to a NanoVDB grid of unknown type
|
||||
uint64_t size;// byte size of NanoVDB grid of unknown type
|
||||
auto buffer = nanovdb::HostBuffer::createFull(size, data);
|
||||
nanovdb::GridHandle<> gridHandle(std::move(buffer));
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createPool for internally managed host memory.
|
||||
Suppose you want to read multiple grids in multiple files, but reuse the same
|
||||
fixed sized memory buffer to both avoid memory fragmentation as well as
|
||||
exceeding the fixed memory ceiling!
|
||||
@code
|
||||
auto pool = nanovdb::HostBuffer::createPool(1 << 30);// 1 GB memory pool
|
||||
std::vector<std::string>> frames;// vector of grid names
|
||||
for (int i=0; i<frames.size(); ++i) {
|
||||
auto handles = nanovdb::io::readGrids(frames[i], 0, pool);// throws if grids in file exceed 1 GB
|
||||
...
|
||||
pool.reset();// clears all handles and resets the memory pool for reuse
|
||||
}
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createPool for externally managed host memory.
|
||||
Note that in this example @c handles are allowed to outlive @c pool since
|
||||
they internally store a shared pointer to the memory pool. However @c data
|
||||
MUST outlive @c handles since the pool does not own its memory in this example.
|
||||
@code
|
||||
const size_t poolSize = 1 << 30;// 1 GB
|
||||
void *data = std::malloc(size + NANOVDB_DATA_ALIGNMENT);// 1 GB pool with padding
|
||||
void *buffer = nanovdb::alignPtr(data);// 32B aligned buffer
|
||||
//void *buffer = std::aligned_alloc(NANOVDB_DATA_ALIGNMENT, poolSize);// in C++17
|
||||
auto pool = nanovdb::HostBuffer::createPool(poolSize, buffer);
|
||||
auto handles1 = nanovdb::io::readGrids("file1.nvdb", 0, pool);
|
||||
auto handles2 = nanovdb::io::readGrids("file2.nvdb", 0, pool);
|
||||
....
|
||||
std::free(data);
|
||||
//std::free(buffer);
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createPool for externally managed host memory.
|
||||
Note that in this example @c handles are allowed to outlive @c pool since
|
||||
they internally store a shared pointer to the memory pool. However @c array
|
||||
MUST outlive @c handles since the pool does not own its memory in this example.
|
||||
@code
|
||||
const size_t poolSize = 1 << 30;// 1 GB
|
||||
std::unique_ptr<char[]> array(new char[size + NANOVDB_DATA_ALIGNMENT]);// scoped pool of 1 GB with padding
|
||||
void *buffer = nanovdb::alignPtr(array.get());// 32B aligned buffer
|
||||
auto pool = nanovdb::HostBuffer::createPool(poolSize, buffer);
|
||||
auto handles = nanovdb::io::readGrids("file.nvdb", 0, pool);
|
||||
@endcode
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/NanoVDB.h>// for NANOVDB_DATA_ALIGNMENT;
|
||||
#include <stdint.h> // for types like int32_t etc
|
||||
#include <cstdio> // for fprintf
|
||||
#include <cstdlib> // for std::malloc/std::realloc/std::free
|
||||
#include <memory>// for std::make_shared
|
||||
#include <mutex>// for std::mutex
|
||||
#include <unordered_set>// for std::unordered_set
|
||||
#include <cassert>// for assert
|
||||
#include <sstream>// for std::stringstream
|
||||
#include <cstring>// for memcpy
|
||||
|
||||
#define checkPtr(ptr, msg) \
|
||||
{ \
|
||||
ptrAssert((ptr), (msg), __FILE__, __LINE__); \
|
||||
}
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
template<typename BufferT>
|
||||
struct BufferTraits
|
||||
{
|
||||
static constexpr bool hasDeviceDual = false;
|
||||
};
|
||||
|
||||
// ----------------------------> HostBuffer <--------------------------------------
|
||||
|
||||
/// @brief This is a buffer that contains a shared or private pool
|
||||
/// to either externally or internally managed host memory.
|
||||
///
|
||||
/// @note Terminology:
|
||||
/// Pool: 0 = buffer.size() < buffer.poolSize()
|
||||
/// Buffer: 0 < buffer.size() < buffer.poolSize()
|
||||
/// Full: 0 < buffer.size() = buffer.poolSize()
|
||||
/// Empty: 0 = buffer.size() = buffer.poolSize()
|
||||
class HostBuffer
|
||||
{
|
||||
struct Pool;// forward declaration of private pool struct
|
||||
std::shared_ptr<Pool> mPool;
|
||||
uint64_t mSize; // total number of bytes for the NanoVDB grid.
|
||||
void* mData; // raw buffer for the NanoVDB grid.
|
||||
|
||||
#if defined(DEBUG) || defined(_DEBUG)
|
||||
static inline void ptrAssert(void* ptr, const char* msg, const char* file, int line, bool abort = true)
|
||||
{
|
||||
if (ptr == nullptr) {
|
||||
fprintf(stderr, "NULL pointer error: %s %s %d\n", msg, file, line);
|
||||
if (abort)
|
||||
exit(1);
|
||||
}
|
||||
if (uint64_t(ptr) % NANOVDB_DATA_ALIGNMENT) {
|
||||
fprintf(stderr, "Alignment pointer error: %s %s %d\n", msg, file, line);
|
||||
if (abort)
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void ptrAssert(void*, const char*, const char*, int, bool = true)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
public:
|
||||
/// @brief Return a full buffer or an empty buffer
|
||||
HostBuffer(uint64_t bufferSize = 0);
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
HostBuffer(HostBuffer&& other);
|
||||
|
||||
/// @brief Custom descructor
|
||||
~HostBuffer() { this->clear(); }
|
||||
|
||||
/// @brief Move copy assignment operation
|
||||
HostBuffer& operator=(HostBuffer&& other);
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
HostBuffer(const HostBuffer&) = delete;
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
HostBuffer& operator=(const HostBuffer&) = delete;
|
||||
|
||||
/// @brief Return a pool buffer which satisfies: buffer.size == 0,
|
||||
/// buffer.poolSize() == poolSize, and buffer.data() == nullptr.
|
||||
/// If data==nullptr, memory for the pool will be allocated.
|
||||
///
|
||||
/// @throw If poolSize is zero.
|
||||
static HostBuffer createPool(uint64_t poolSize, void *data = nullptr);
|
||||
|
||||
/// @brief Return a full buffer which satisfies: buffer.size == bufferSize,
|
||||
/// buffer.poolSize() == bufferSize, and buffer.data() == data.
|
||||
/// If data==nullptr, memory for the pool will be allocated.
|
||||
///
|
||||
/// @throw If bufferSize is zero.
|
||||
static HostBuffer createFull(uint64_t bufferSize, void *data = nullptr);
|
||||
|
||||
/// @brief Return a buffer with @c bufferSize bytes managed by
|
||||
/// the specified memory @c pool. If none is provided, i.e.
|
||||
/// @c pool == nullptr or @c pool->poolSize() == 0, one is
|
||||
/// created with size @c bufferSize, i.e. a full buffer is returned.
|
||||
///
|
||||
/// @throw If the specified @c pool has insufficient memory for
|
||||
/// the requested buffer size.
|
||||
static HostBuffer create(uint64_t bufferSize, const HostBuffer* pool = nullptr);
|
||||
|
||||
/// @brief Initialize as a full buffer with the specified size. If data is NULL
|
||||
/// the memory is internally allocated.
|
||||
void init(uint64_t bufferSize, void *data = nullptr);
|
||||
|
||||
//@{
|
||||
/// @brief Retuns a pointer to the raw memory buffer managed by this allocator.
|
||||
///
|
||||
/// @warning Note that the pointer can be NULL if the allocator was not initialized!
|
||||
const void* data() const { return mData; }
|
||||
void* data() { return mData; }
|
||||
//@}
|
||||
|
||||
/// @brief Returns an offset pointer of a specific type from the allocated host memory
|
||||
/// @tparam T Type of the pointer returned
|
||||
/// @param count Numbers of elements of @c parameter type T to skip
|
||||
/// @warning might return NULL
|
||||
template <typename T>
|
||||
T* data(ptrdiff_t count = 0) const {return mData ? reinterpret_cast<T*>(mData) + count : nullptr;}
|
||||
|
||||
//@{
|
||||
/// @brief Returns the size in bytes associated with this buffer.
|
||||
uint64_t bufferSize() const { return mSize; }
|
||||
uint64_t size() const { return this->bufferSize(); }
|
||||
//@}
|
||||
|
||||
/// @brief Returns the size in bytes of the memory pool shared with this instance.
|
||||
uint64_t poolSize() const;
|
||||
|
||||
/// @brief Return true if memory is managed (using std::malloc and std:free) by the
|
||||
/// shared pool in this buffer. Else memory is assumed to be managed externally.
|
||||
bool isManaged() const;
|
||||
|
||||
//@{
|
||||
/// @brief Returns true if this buffer has no memory associated with it
|
||||
bool isEmpty() const { return !mPool || mSize == 0 || mData == nullptr; }
|
||||
bool empty() const { return this->isEmpty(); }
|
||||
//@}
|
||||
|
||||
/// @brief Return true if this is a pool, i.e. an empty buffer with a nonempty
|
||||
/// internal pool, i.e. this->size() == 0 and this->poolSize() != 0
|
||||
bool isPool() const { return mSize == 0 && this->poolSize() > 0; }
|
||||
|
||||
/// @brief Return true if the pool exists, is nonempty but has no more available memory
|
||||
bool isFull() const;
|
||||
|
||||
/// @brief Clear this buffer so it is empty.
|
||||
void clear();
|
||||
|
||||
/// @brief Clears all existing buffers that are registered against the memory pool
|
||||
/// and resets the pool so it can be reused to create new buffers.
|
||||
///
|
||||
/// @throw If this instance is not empty or contains no pool.
|
||||
///
|
||||
/// @warning This method is not thread-safe!
|
||||
void reset();
|
||||
|
||||
/// @brief Total number of bytes from the pool currently in use by buffers
|
||||
uint64_t poolUsage() const;
|
||||
|
||||
/// @brief resize the pool size. It will attempt to resize the existing
|
||||
/// memory block, but if that fails a deep copy is performed.
|
||||
/// If @c data is not NULL it will be used as new externally
|
||||
/// managed memory for the pool. All registered buffers are
|
||||
/// updated so GridHandle::grid might return a new address (if
|
||||
/// deep copy was performed).
|
||||
///
|
||||
/// @note This method can be use to resize the memory pool and even
|
||||
/// change it from internally to externally managed memory or vice versa.
|
||||
///
|
||||
/// @throw if @c poolSize is less than this->poolUsage() the used memory
|
||||
/// or allocations fail.
|
||||
void resizePool(uint64_t poolSize, void *data = nullptr);
|
||||
|
||||
}; // HostBuffer class
|
||||
|
||||
// --------------------------> Implementation of HostBuffer::Pool <------------------------------------
|
||||
|
||||
// This is private struct of HostBuffer so you can safely ignore the API
|
||||
struct HostBuffer::Pool
|
||||
{
|
||||
using HashTableT = std::unordered_set<HostBuffer*>;
|
||||
std::mutex mMutex; // mutex for updating mRegister and mFree
|
||||
HashTableT mRegister;
|
||||
void *mData, *mFree;
|
||||
uint64_t mSize, mPadding;
|
||||
bool mManaged;
|
||||
|
||||
/// @brief External memory ctor
|
||||
Pool(uint64_t size = 0, void* data = nullptr)
|
||||
: mData(data)
|
||||
, mFree(mData)
|
||||
, mSize(size)
|
||||
, mPadding(0)
|
||||
, mManaged(data == nullptr)
|
||||
{
|
||||
if (mManaged) {
|
||||
mData = Pool::alloc(mSize);
|
||||
if (mData == nullptr) throw std::runtime_error("Pool::Pool malloc failed");
|
||||
}
|
||||
mPadding = alignmentPadding(mData);
|
||||
if (!mManaged && mPadding != 0) {
|
||||
throw std::runtime_error("Pool::Pool: external memory buffer is not aligned to " +
|
||||
std::to_string(NANOVDB_DATA_ALIGNMENT) +
|
||||
" bytes.\nHint: use nanovdb::alignPtr or std::aligned_alloc (C++17 only)");
|
||||
}
|
||||
mFree = util::PtrAdd(mData, mPadding);
|
||||
}
|
||||
|
||||
/// @brief Custom destructor
|
||||
~Pool()
|
||||
{
|
||||
assert(mRegister.empty());
|
||||
if (mManaged) std::free(mData);
|
||||
}
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
Pool(const Pool&) = delete;
|
||||
|
||||
/// @brief Disallow move-construction
|
||||
Pool(const Pool&&) = delete;
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
Pool& operator=(const Pool&) = delete;
|
||||
|
||||
/// @brief Disallow move assignment operation
|
||||
Pool& operator=(const Pool&&) = delete;
|
||||
|
||||
/// @brief Return the total number of bytes used from this Pool by buffers
|
||||
uint64_t usage() const { return util::PtrDiff(mFree, mData) - mPadding; }
|
||||
|
||||
/// @brief Allocate a buffer of the specified size and add it to the register
|
||||
void add(HostBuffer* buffer, uint64_t size)
|
||||
{
|
||||
void *alignedFree = util::PtrAdd(mFree, alignmentPadding(mFree));
|
||||
|
||||
if (util::PtrAdd(alignedFree, size) > util::PtrAdd(mData, mPadding + mSize)) {
|
||||
std::stringstream ss;
|
||||
ss << "HostBuffer::Pool: insufficient memory\n"
|
||||
<< "\tA buffer requested " << size << " bytes with " << NANOVDB_DATA_ALIGNMENT
|
||||
<< "-bytes alignment from a pool with "
|
||||
<< mSize << " bytes of which\n\t" << (util::PtrDiff(alignedFree, mData) - mPadding)
|
||||
<< " bytes are used by " << mRegister.size() << " other buffer(s). "
|
||||
<< "Pool is " << (mManaged ? "internally" : "externally") << " managed.\n";
|
||||
throw std::runtime_error(ss.str());
|
||||
}
|
||||
buffer->mSize = size;
|
||||
const std::lock_guard<std::mutex> lock(mMutex);
|
||||
mRegister.insert(buffer);
|
||||
buffer->mData = alignedFree;
|
||||
mFree = util::PtrAdd(alignedFree, size);
|
||||
}
|
||||
|
||||
/// @brief Remove the specified buffer from the register
|
||||
void remove(HostBuffer *buffer)
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(mMutex);
|
||||
mRegister.erase(buffer);
|
||||
}
|
||||
|
||||
/// @brief Replaces buffer1 with buffer2 in the register
|
||||
void replace(HostBuffer *buffer1, HostBuffer *buffer2)
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(mMutex);
|
||||
mRegister.erase( buffer1);
|
||||
mRegister.insert(buffer2);
|
||||
}
|
||||
|
||||
/// @brief Reset the register and all its buffers
|
||||
void reset()
|
||||
{
|
||||
for (HostBuffer *buffer : mRegister) {
|
||||
buffer->mPool.reset();
|
||||
buffer->mSize = 0;
|
||||
buffer->mData = nullptr;
|
||||
}
|
||||
mRegister.clear();
|
||||
mFree = util::PtrAdd(mData, mPadding);
|
||||
}
|
||||
|
||||
/// @brief Resize this Pool and update registered buffers as needed. If data is no NULL
|
||||
/// it is used as externally managed memory.
|
||||
void resize(uint64_t size, void *data = nullptr)
|
||||
{
|
||||
const uint64_t memUsage = this->usage();
|
||||
|
||||
const bool managed = (data == nullptr);
|
||||
|
||||
if (!managed && alignmentPadding(data) != 0) {
|
||||
throw std::runtime_error("Pool::resize: external memory buffer is not aligned to " +
|
||||
std::to_string(NANOVDB_DATA_ALIGNMENT) + " bytes");
|
||||
}
|
||||
|
||||
if (memUsage > size) {
|
||||
throw std::runtime_error("Pool::resize: insufficient memory");
|
||||
}
|
||||
|
||||
uint64_t padding = 0;
|
||||
if (mManaged && managed && size != mSize) { // managed -> managed
|
||||
padding = mPadding;
|
||||
data = Pool::realloc(mData, memUsage, size, padding); // performs both copy and free of mData
|
||||
} else if (!mManaged && managed) { // un-managed -> managed
|
||||
data = Pool::alloc(size);
|
||||
padding = alignmentPadding(data);
|
||||
}
|
||||
|
||||
if (data == nullptr) {
|
||||
throw std::runtime_error("Pool::resize: allocation failed");
|
||||
} else if (data != mData) {
|
||||
void* paddedData = util::PtrAdd(data, padding);
|
||||
|
||||
if (!(mManaged && managed)) { // no need to copy if managed -> managed
|
||||
memcpy(paddedData, util::PtrAdd(mData, mPadding), memUsage);
|
||||
}
|
||||
|
||||
for (HostBuffer* buffer : mRegister) { // update registered buffers
|
||||
buffer->mData = util::PtrAdd(paddedData, util::PtrDiff(buffer->mData, util::PtrAdd(mData, mPadding)));
|
||||
}
|
||||
mFree = util::PtrAdd(paddedData, memUsage); // update the free pointer
|
||||
if (mManaged && !managed) {// only free if managed -> un-managed
|
||||
std::free(mData);
|
||||
}
|
||||
|
||||
mData = data;
|
||||
mPadding = padding;
|
||||
}
|
||||
mSize = size;
|
||||
mManaged = managed;
|
||||
}
|
||||
/// @brief Return true is all the memory in this pool is in use.
|
||||
bool isFull() const
|
||||
{
|
||||
assert(mFree <= util::PtrAdd(mData, mPadding + mSize));
|
||||
return mSize > 0 ? mFree == util::PtrAdd(mData, mPadding + mSize) : false;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
static void* alloc(uint64_t size)
|
||||
{
|
||||
// make sure we alloc enough space to align the result
|
||||
return std::malloc(size + NANOVDB_DATA_ALIGNMENT);
|
||||
}
|
||||
|
||||
static void* realloc(void* const origData,
|
||||
uint64_t origSize,
|
||||
uint64_t desiredSize,
|
||||
uint64_t& padding)
|
||||
{
|
||||
// make sure we alloc enough space to align the result
|
||||
void* data = std::realloc(origData, desiredSize + NANOVDB_DATA_ALIGNMENT);
|
||||
|
||||
if (data != nullptr && data != origData) {
|
||||
uint64_t newPadding = alignmentPadding(data);
|
||||
// Number of padding bytes may have changed -- move data if that's the case
|
||||
if (newPadding != padding) {
|
||||
// Realloc should not happen when shrinking down buffer, but let's be safe
|
||||
std::memmove(util::PtrAdd(data, newPadding),
|
||||
util::PtrAdd(data, padding),
|
||||
math::Min(origSize, desiredSize));
|
||||
padding = newPadding;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
};// struct HostBuffer::Pool
|
||||
|
||||
// --------------------------> Implementation of HostBuffer <------------------------------------
|
||||
|
||||
inline HostBuffer::HostBuffer(uint64_t size) : mPool(nullptr), mSize(size), mData(nullptr)
|
||||
{
|
||||
if (size>0) {
|
||||
mPool = std::make_shared<Pool>(size);
|
||||
mData = mPool->mFree;
|
||||
mPool->mRegister.insert(this);
|
||||
mPool->mFree = util::PtrAdd(mPool->mFree, size);
|
||||
}
|
||||
}
|
||||
|
||||
inline HostBuffer::HostBuffer(HostBuffer&& other) : mPool(other.mPool), mSize(other.mSize), mData(other.mData)
|
||||
{
|
||||
if (mPool && mSize != 0) {
|
||||
mPool->replace(&other, this);
|
||||
}
|
||||
other.mPool.reset();
|
||||
other.mSize = 0;
|
||||
other.mData = nullptr;
|
||||
}
|
||||
|
||||
inline void HostBuffer::init(uint64_t bufferSize, void *data)
|
||||
{
|
||||
if (bufferSize == 0) {
|
||||
throw std::runtime_error("HostBuffer: invalid buffer size");
|
||||
}
|
||||
if (mPool) {
|
||||
mPool.reset();
|
||||
}
|
||||
if (!mPool || mPool->mSize != bufferSize) {
|
||||
mPool = std::make_shared<Pool>(bufferSize, data);
|
||||
}
|
||||
mPool->add(this, bufferSize);
|
||||
}
|
||||
|
||||
inline HostBuffer& HostBuffer::operator=(HostBuffer&& other)
|
||||
{
|
||||
if (mPool) {
|
||||
mPool->remove(this);
|
||||
}
|
||||
mPool = other.mPool;
|
||||
mSize = other.mSize;
|
||||
mData = other.mData;
|
||||
if (mPool && mSize != 0) {
|
||||
mPool->replace(&other, this);
|
||||
}
|
||||
other.mPool.reset();
|
||||
other.mSize = 0;
|
||||
other.mData = nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline uint64_t HostBuffer::poolSize() const
|
||||
{
|
||||
return mPool ? mPool->mSize : 0u;
|
||||
}
|
||||
|
||||
inline uint64_t HostBuffer::poolUsage() const
|
||||
{
|
||||
return mPool ? mPool->usage(): 0u;
|
||||
}
|
||||
|
||||
inline bool HostBuffer::isManaged() const
|
||||
{
|
||||
return mPool ? mPool->mManaged : false;
|
||||
}
|
||||
|
||||
inline bool HostBuffer::isFull() const
|
||||
{
|
||||
return mPool ? mPool->isFull() : false;
|
||||
}
|
||||
|
||||
inline HostBuffer HostBuffer::createPool(uint64_t poolSize, void *data)
|
||||
{
|
||||
if (poolSize == 0) {
|
||||
throw std::runtime_error("HostBuffer: invalid pool size");
|
||||
}
|
||||
HostBuffer buffer;
|
||||
buffer.mPool = std::make_shared<Pool>(poolSize, data);
|
||||
// note the buffer is NOT registered by its pool since it is not using its memory
|
||||
buffer.mSize = 0;
|
||||
buffer.mData = nullptr;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
inline HostBuffer HostBuffer::createFull(uint64_t bufferSize, void *data)
|
||||
{
|
||||
if (bufferSize == 0) {
|
||||
throw std::runtime_error("HostBuffer: invalid buffer size");
|
||||
}
|
||||
HostBuffer buffer;
|
||||
buffer.mPool = std::make_shared<Pool>(bufferSize, data);
|
||||
buffer.mPool->add(&buffer, bufferSize);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
inline HostBuffer HostBuffer::create(uint64_t bufferSize, const HostBuffer* pool)
|
||||
{
|
||||
HostBuffer buffer;
|
||||
if (pool == nullptr || !pool->mPool) {
|
||||
buffer.mPool = std::make_shared<Pool>(bufferSize);
|
||||
} else {
|
||||
buffer.mPool = pool->mPool;
|
||||
}
|
||||
buffer.mPool->add(&buffer, bufferSize);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
inline void HostBuffer::clear()
|
||||
{
|
||||
if (mPool) {// remove self from the buffer register in the pool
|
||||
mPool->remove(this);
|
||||
}
|
||||
mPool.reset();
|
||||
mSize = 0;
|
||||
mData = nullptr;
|
||||
}
|
||||
|
||||
inline void HostBuffer::reset()
|
||||
{
|
||||
if (this->size()>0) {
|
||||
throw std::runtime_error("HostBuffer: only empty buffers can call reset");
|
||||
}
|
||||
if (!mPool) {
|
||||
throw std::runtime_error("HostBuffer: this buffer contains no pool to reset");
|
||||
}
|
||||
mPool->reset();
|
||||
}
|
||||
|
||||
inline void HostBuffer::resizePool(uint64_t size, void *data)
|
||||
{
|
||||
if (!mPool) {
|
||||
throw std::runtime_error("HostBuffer: this buffer contains no pool to resize");
|
||||
}
|
||||
mPool->resize(size, data);
|
||||
}
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
|
||||
+1273
-3167
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,323 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/NodeManager.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date February 12, 2021
|
||||
|
||||
\brief This class allows for sequential access to nodes
|
||||
in a NanoVDB tree on both the host and device.
|
||||
|
||||
\details The ordering of the sequential access to nodes is always breadth-first!
|
||||
*/
|
||||
|
||||
#include <nanovdb/NanoVDB.h>// for NanoGrid etc
|
||||
#include <nanovdb/HostBuffer.h>// for HostBuffer
|
||||
|
||||
#ifndef NANOVDB_NODEMANAGER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_NODEMANAGER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
/// @brief NodeManager allows for sequential access to nodes
|
||||
template <typename BuildT>
|
||||
class NodeManager;
|
||||
|
||||
/// @brief NodeManagerHandle manages the memory of a NodeManager
|
||||
template<typename BufferT = HostBuffer>
|
||||
class NodeManagerHandle;
|
||||
|
||||
/// @brief brief Construct a NodeManager and return its handle
|
||||
///
|
||||
/// @param grid grid whose nodes will be accessed sequentially
|
||||
/// @param buffer buffer from which to allocate the output handle
|
||||
///
|
||||
/// @note This is the only way to create a NodeManager since it's using
|
||||
/// managed memory pointed to by a NodeManagerHandle.
|
||||
template <typename BuildT, typename BufferT = HostBuffer>
|
||||
NodeManagerHandle<BufferT> createNodeManager(const NanoGrid<BuildT> &grid,
|
||||
const BufferT& buffer = BufferT());
|
||||
|
||||
struct NodeManagerData
|
||||
{// 40B = 5*8B
|
||||
__hostdev__ NodeManagerData(void *grid) : mPadding{0}, mGrid(grid), mPtr{0,0,0}{}
|
||||
union {int64_t mPadding; uint8_t mLinear;};// 8B of which 1B is used for a binary flag
|
||||
void *mGrid;// 8B pointer to either host or device grid
|
||||
union {int64_t *mPtr[3], mOff[3];};// 24B, use mOff if mLinear!=0
|
||||
};
|
||||
|
||||
/// @brief This class serves to manage a raw memory buffer of a NanoVDB NodeManager or LeafManager.
|
||||
template<typename BufferT>
|
||||
class NodeManagerHandle
|
||||
{
|
||||
GridType mGridType{GridType::Unknown};
|
||||
BufferT mBuffer;
|
||||
|
||||
template<typename BuildT>
|
||||
const NodeManager<BuildT>* getMgr() const {
|
||||
return mGridType == toGridType<BuildT>() ? (const NodeManager<BuildT>*)mBuffer.data() : nullptr;
|
||||
}
|
||||
|
||||
template<typename BuildT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NodeManager<BuildT>*>::type
|
||||
getDeviceMgr() const {
|
||||
return mGridType == toGridType<BuildT>() ? (const NodeManager<BuildT>*)mBuffer.deviceData() : nullptr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static T* no_const(const T* ptr) { return const_cast<T*>(ptr); }
|
||||
|
||||
public:
|
||||
/// @brief Move constructor from a buffer
|
||||
NodeManagerHandle(GridType gridType, BufferT&& buffer) : mGridType(gridType) { mBuffer = std::move(buffer); }
|
||||
/// @brief Empty ctor
|
||||
NodeManagerHandle() = default;
|
||||
/// @brief Disallow copy-construction
|
||||
NodeManagerHandle(const NodeManagerHandle&) = delete;
|
||||
/// @brief Disallow copy assignment operation
|
||||
NodeManagerHandle& operator=(const NodeManagerHandle&) = delete;
|
||||
/// @brief Move copy assignment operation
|
||||
NodeManagerHandle& operator=(NodeManagerHandle&& other) noexcept {
|
||||
mGridType = other.mGridType;
|
||||
mBuffer = std::move(other.mBuffer);
|
||||
other.mGridType = GridType::Unknown;
|
||||
return *this;
|
||||
}
|
||||
/// @brief Move copy-constructor
|
||||
NodeManagerHandle(NodeManagerHandle&& other) noexcept {
|
||||
mGridType = other.mGridType;
|
||||
mBuffer = std::move(other.mBuffer);
|
||||
other.mGridType = GridType::Unknown;
|
||||
}
|
||||
/// @brief Default destructor
|
||||
~NodeManagerHandle() { this->reset(); }
|
||||
/// @brief clear the buffer
|
||||
void reset() { mBuffer.clear(); }
|
||||
|
||||
/// @brief Return a reference to the buffer
|
||||
BufferT& buffer() { return mBuffer; }
|
||||
|
||||
/// @brief Return a const reference to the buffer
|
||||
const BufferT& buffer() const { return mBuffer; }
|
||||
|
||||
/// @brief Returns a non-const pointer to the data.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the NodeManagerHandle was not initialized
|
||||
void* data() { return mBuffer.data(); }
|
||||
|
||||
/// @brief Returns a const pointer to the data.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the NodeManagerHandle was not initialized
|
||||
const void* data() const { return mBuffer.data(); }
|
||||
|
||||
/// @brief Returns the size in bytes of the raw memory buffer managed by this NodeManagerHandle's allocator.
|
||||
uint64_t size() const { return mBuffer.size(); }
|
||||
|
||||
/// @brief Returns a const pointer to the NodeManager encoded in this NodeManagerHandle.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT>
|
||||
const NodeManager<BuildT>* mgr() const { return this->template getMgr<BuildT>(); }
|
||||
|
||||
/// @brief Returns a pointer to the NodeManager encoded in this NodeManagerHandle.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT>
|
||||
NodeManager<BuildT>* mgr() { return no_const(this->template getMgr<BuildT>()); }
|
||||
|
||||
/// @brief Return a const pointer to the NodeManager encoded in this NodeManagerHandle on the device, e.g. GPU
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NodeManager<BuildT>*>::type
|
||||
deviceMgr() const { return this->template getDeviceMgr<BuildT>(); }
|
||||
|
||||
/// @brief Return a const pointer to the NodeManager encoded in this NodeManagerHandle on the device, e.g. GPU
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, NodeManager<BuildT>*>::type
|
||||
deviceMgr() { return no_const(this->template getDeviceMgr<BuildT>()); }
|
||||
|
||||
/// @brief Upload the NodeManager to the device, e.g. from CPU to GPU
|
||||
///
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(void* deviceGrid, void* stream = nullptr, bool sync = true)
|
||||
{
|
||||
assert(deviceGrid);
|
||||
auto *data = reinterpret_cast<NodeManagerData*>(mBuffer.data());
|
||||
void *tmp = data->mGrid;
|
||||
data->mGrid = deviceGrid;
|
||||
mBuffer.deviceUpload(stream, sync);
|
||||
data->mGrid = tmp;
|
||||
}
|
||||
|
||||
/// @brief Download the NodeManager to from the device, e.g. from GPU to CPU
|
||||
///
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(void* stream = nullptr, bool sync = true)
|
||||
{
|
||||
auto *data = reinterpret_cast<NodeManagerData*>(mBuffer.data());
|
||||
void *tmp = data->mGrid;
|
||||
mBuffer.deviceDownload(stream, sync);
|
||||
data->mGrid = tmp;
|
||||
}
|
||||
};// NodeManagerHandle
|
||||
|
||||
/// @brief This class allows for sequential access to nodes in a NanoVDB tree
|
||||
///
|
||||
/// @details Nodes are always arranged breadth first during sequential access of nodes
|
||||
/// at a particular level.
|
||||
template<typename BuildT>
|
||||
class NodeManager : private NodeManagerData
|
||||
{
|
||||
using DataT = NodeManagerData;
|
||||
using GridT = NanoGrid<BuildT>;
|
||||
using TreeT = typename GridTree<GridT>::type;
|
||||
template<int LEVEL>
|
||||
using NodeT = typename NodeTrait<TreeT, LEVEL>::type;
|
||||
using RootT = NodeT<3>;// root node
|
||||
using Node2 = NodeT<2>;// upper internal node
|
||||
using Node1 = NodeT<1>;// lower internal node
|
||||
using Node0 = NodeT<0>;// leaf node
|
||||
|
||||
public:
|
||||
static constexpr bool FIXED_SIZE = Node0::FIXED_SIZE && Node1::FIXED_SIZE && Node2::FIXED_SIZE;
|
||||
|
||||
NodeManager(const NodeManager&) = delete;
|
||||
NodeManager(NodeManager&&) = delete;
|
||||
NodeManager& operator=(const NodeManager&) = delete;
|
||||
NodeManager& operator=(NodeManager&&) = delete;
|
||||
~NodeManager() = delete;
|
||||
|
||||
/// @brief return true if the nodes have both fixed size and are arranged breadth-first in memory.
|
||||
/// This allows for direct and memory-efficient linear access to nodes.
|
||||
__hostdev__ static bool isLinear(const GridT &grid) {return FIXED_SIZE && grid.isBreadthFirst();}
|
||||
|
||||
/// @brief return true if the nodes have both fixed size and are arranged breadth-first in memory.
|
||||
/// This allows for direct and memory-efficient linear access to nodes.
|
||||
__hostdev__ bool isLinear() const {return DataT::mLinear!=0u;}
|
||||
|
||||
/// @brief Return the memory footprint in bytes of the NodeManager derived from the specified grid
|
||||
__hostdev__ static uint64_t memUsage(const GridT &grid) {
|
||||
uint64_t size = sizeof(NodeManagerData);
|
||||
if (!NodeManager::isLinear(grid)) {
|
||||
const uint32_t *p = grid.tree().mNodeCount;
|
||||
size += sizeof(int64_t)*(p[0]+p[1]+p[2]);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/// @brief Return the memory footprint in bytes of this instance
|
||||
__hostdev__ uint64_t memUsage() const {return NodeManager::memUsage(this->grid());}
|
||||
|
||||
/// @brief Return a reference to the grid
|
||||
__hostdev__ GridT& grid() { return *reinterpret_cast<GridT*>(DataT::mGrid); }
|
||||
__hostdev__ const GridT& grid() const { return *reinterpret_cast<const GridT*>(DataT::mGrid); }
|
||||
|
||||
/// @brief Return a reference to the tree
|
||||
__hostdev__ TreeT& tree() { return this->grid().tree(); }
|
||||
__hostdev__ const TreeT& tree() const { return this->grid().tree(); }
|
||||
|
||||
/// @brief Return a reference to the root
|
||||
__hostdev__ RootT& root() { return this->tree().root(); }
|
||||
__hostdev__ const RootT& root() const { return this->tree().root(); }
|
||||
|
||||
/// @brief Return the number of tree nodes at the specified level
|
||||
/// @details 0 is leaf, 1 is lower internal, and 2 is upper internal level
|
||||
__hostdev__ uint64_t nodeCount(int level) const { return this->tree().nodeCount(level); }
|
||||
|
||||
__hostdev__ uint64_t leafCount() const { return this->tree().nodeCount(0); }
|
||||
__hostdev__ uint64_t lowerCount() const { return this->tree().nodeCount(1); }
|
||||
__hostdev__ uint64_t upperCount() const { return this->tree().nodeCount(2); }
|
||||
|
||||
/// @brief Return the i'th leaf node with respect to breadth-first ordering
|
||||
template <int LEVEL>
|
||||
__hostdev__ const NodeT<LEVEL>& node(uint32_t i) const {
|
||||
NANOVDB_ASSERT(i < this->nodeCount(LEVEL));
|
||||
const NodeT<LEVEL>* ptr = nullptr;
|
||||
if (DataT::mLinear) {
|
||||
ptr = util::PtrAdd<const NodeT<LEVEL>>(DataT::mGrid, DataT::mOff[LEVEL]) + i;
|
||||
} else {
|
||||
ptr = util::PtrAdd<const NodeT<LEVEL>>(DataT::mGrid, DataT::mPtr[LEVEL][i]);
|
||||
}
|
||||
NANOVDB_ASSERT(ptr && isAligned(ptr));
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
/// @brief Return the i'th node with respect to breadth-first ordering
|
||||
template <int LEVEL>
|
||||
__hostdev__ NodeT<LEVEL>& node(uint32_t i) {
|
||||
NANOVDB_ASSERT(i < this->nodeCount(LEVEL));
|
||||
NodeT<LEVEL>* ptr = nullptr;
|
||||
if (DataT::mLinear) {
|
||||
ptr = util::PtrAdd<NodeT<LEVEL>>(DataT::mGrid, DataT::mOff[LEVEL]) + i;
|
||||
} else {
|
||||
ptr = util::PtrAdd<NodeT<LEVEL>>(DataT::mGrid, DataT::mPtr[LEVEL][i]);
|
||||
}
|
||||
NANOVDB_ASSERT(ptr && isAligned(ptr));
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
/// @brief Return the i'th leaf node with respect to breadth-first ordering
|
||||
__hostdev__ const Node0& leaf(uint32_t i) const { return this->node<0>(i); }
|
||||
__hostdev__ Node0& leaf(uint32_t i) { return this->node<0>(i); }
|
||||
|
||||
/// @brief Return the i'th lower internal node with respect to breadth-first ordering
|
||||
__hostdev__ const Node1& lower(uint32_t i) const { return this->node<1>(i); }
|
||||
__hostdev__ Node1& lower(uint32_t i) { return this->node<1>(i); }
|
||||
|
||||
/// @brief Return the i'th upper internal node with respect to breadth-first ordering
|
||||
__hostdev__ const Node2& upper(uint32_t i) const { return this->node<2>(i); }
|
||||
__hostdev__ Node2& upper(uint32_t i) { return this->node<2>(i); }
|
||||
|
||||
}; // NodeManager<BuildT> class
|
||||
|
||||
template <typename BuildT, typename BufferT>
|
||||
NodeManagerHandle<BufferT> createNodeManager(const NanoGrid<BuildT> &grid,
|
||||
const BufferT& buffer)
|
||||
{
|
||||
NodeManagerHandle<BufferT> handle(toGridType<BuildT>(), BufferT::create(NodeManager<BuildT>::memUsage(grid), &buffer));
|
||||
auto *data = reinterpret_cast<NodeManagerData*>(handle.data());
|
||||
NANOVDB_ASSERT(data && isAligned(data));
|
||||
NANOVDB_ASSERT(toGridType<BuildT>() == grid.gridType());
|
||||
*data = NodeManagerData((void*)&grid);
|
||||
|
||||
if (NodeManager<BuildT>::isLinear(grid)) {
|
||||
data->mLinear = uint8_t(1u);
|
||||
data->mOff[0] = util::PtrDiff(grid.tree().template getFirstNode<0>(), &grid);
|
||||
data->mOff[1] = util::PtrDiff(grid.tree().template getFirstNode<1>(), &grid);
|
||||
data->mOff[2] = util::PtrDiff(grid.tree().template getFirstNode<2>(), &grid);
|
||||
} else {
|
||||
int64_t *ptr0 = data->mPtr[0] = reinterpret_cast<int64_t*>(data + 1);
|
||||
int64_t *ptr1 = data->mPtr[1] = data->mPtr[0] + grid.tree().nodeCount(0);
|
||||
int64_t *ptr2 = data->mPtr[2] = data->mPtr[1] + grid.tree().nodeCount(1);
|
||||
// Performs depth first traversal but breadth first insertion
|
||||
for (auto it2 = grid.tree().root().cbeginChild(); it2; ++it2) {
|
||||
*ptr2++ = util::PtrDiff(&*it2, &grid);
|
||||
for (auto it1 = it2->cbeginChild(); it1; ++it1) {
|
||||
*ptr1++ = util::PtrDiff(&*it1, &grid);
|
||||
for (auto it0 = it1->cbeginChild(); it0; ++it0) {
|
||||
*ptr0++ = util::PtrDiff(&*it0, &grid);
|
||||
}// loop over child nodes of the lower internal node
|
||||
}// loop over child nodes of the upper internal node
|
||||
}// loop over child nodes of the root node
|
||||
}
|
||||
|
||||
return handle;// // is converted to r-value so return value is move constructed!
|
||||
}// createNodeManager
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#if defined(__CUDACC__)
|
||||
#include <nanovdb/cuda/NodeManager.cuh>
|
||||
#endif// defined(__CUDACC__)
|
||||
|
||||
#endif // NANOVDB_NODEMANAGER_H_HAS_BEEN_INCLUDED
|
||||
+367
-161
@@ -1,9 +1,9 @@
|
||||
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file PNanoVDB.h
|
||||
\file nanovdb/PNanoVDB.h
|
||||
|
||||
\author Andrew Reidmeyer
|
||||
|
||||
@@ -198,47 +198,110 @@ PNANOVDB_BUF_FORCE_INLINE void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uin
|
||||
typedef uint32_t pnanovdb_grid_type_t;
|
||||
#define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
|
||||
#elif defined(PNANOVDB_BUF_HLSL)
|
||||
#if defined(PNANOVDB_ADDRESS_32)
|
||||
#if defined(PNANOVDB_BUF_HLSL_RW)
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
#define pnanovdb_buf_t RWStructuredBuffer<uint2>
|
||||
#else
|
||||
#define pnanovdb_buf_t RWStructuredBuffer<uint>
|
||||
#endif
|
||||
#else
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
#define pnanovdb_buf_t StructuredBuffer<uint2>
|
||||
#else
|
||||
#define pnanovdb_buf_t StructuredBuffer<uint>
|
||||
#endif
|
||||
#endif
|
||||
#if defined(PNANOVDB_ADDRESS_32)
|
||||
uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
|
||||
{
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
uint2 val = buf[(byte_offset >> 3u)];
|
||||
return ((byte_offset & 4u) == 0u) ? val.x : val.y;
|
||||
#else
|
||||
return buf[(byte_offset >> 2u)];
|
||||
#endif
|
||||
}
|
||||
uint2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
|
||||
{
|
||||
uint2 ret;
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
ret = buf[(byte_offset >> 3u)];
|
||||
#else
|
||||
ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
|
||||
ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint byte_offset, uint value)
|
||||
{
|
||||
// NOP, by default no write in HLSL
|
||||
#if defined(PNANOVDB_BUF_HLSL_RW)
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
if ((byte_offset & 4u) == 0u) {buf[(byte_offset >> 3u)].x = value;}
|
||||
else {buf[(byte_offset >> 3u)].y = value;}
|
||||
#else
|
||||
buf[(byte_offset >> 2u)] = value;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint byte_offset, uint2 value)
|
||||
{
|
||||
// NOP, by default no write in HLSL
|
||||
#if defined(PNANOVDB_BUF_HLSL_RW)
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
buf[(byte_offset >> 3u)] = value;
|
||||
#else
|
||||
pnanovdb_buf_write_uint32(buf, byte_offset + 0u, value.x);
|
||||
pnanovdb_buf_write_uint32(buf, byte_offset + 4u, value.y);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#elif defined(PNANOVDB_ADDRESS_64)
|
||||
#define pnanovdb_buf_t StructuredBuffer<uint>
|
||||
uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
|
||||
{
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
uint2 val = buf[uint(byte_offset >> 3u)];
|
||||
return ((uint(byte_offset) & 4u) == 0u) ? val.x : val.y;
|
||||
#else
|
||||
return buf[uint(byte_offset >> 2u)];
|
||||
#endif
|
||||
}
|
||||
uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
|
||||
{
|
||||
uint64_t ret;
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
uint2 raw = buf[uint(byte_offset >> 3u)];
|
||||
ret = uint64_t(raw.x) | (uint64_t(raw.y) << 32u);
|
||||
#else
|
||||
ret = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
|
||||
ret = ret + (uint64_t(pnanovdb_buf_read_uint32(buf, byte_offset + 4u)) << 32u);
|
||||
ret = ret | (uint64_t(pnanovdb_buf_read_uint32(buf, byte_offset + 4u)) << 32u);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint64_t byte_offset, uint value)
|
||||
{
|
||||
// NOP, by default no write in HLSL
|
||||
#if defined(PNANOVDB_BUF_HLSL_RW)
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
if ((byte_offset & 4u) == 0u) {buf[uint(byte_offset >> 3u)].x = value;}
|
||||
else {buf[uint(byte_offset >> 3u)].y = value;}
|
||||
#else
|
||||
buf[uint(byte_offset >> 2u)] = value;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint64_t byte_offset, uint64_t value)
|
||||
{
|
||||
// NOP, by default no write in HLSL
|
||||
#if defined(PNANOVDB_BUF_HLSL_RW)
|
||||
#if defined(PNANOVDB_BUF_HLSL_64)
|
||||
uint2 raw = uint2(uint(value), uint(value >> 32u));
|
||||
buf[uint(byte_offset >> 3u)] = raw;
|
||||
#else
|
||||
pnanovdb_buf_write_uint32(buf, byte_offset + 0u, uint(value));
|
||||
pnanovdb_buf_write_uint32(buf, byte_offset + 4u, uint(value >> 32u));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#define pnanovdb_grid_type_t uint
|
||||
@@ -291,7 +354,11 @@ void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint byte_offset, uvec2 value
|
||||
// struct typedef, static const, inout
|
||||
#if defined(PNANOVDB_C)
|
||||
#define PNANOVDB_STRUCT_TYPEDEF(X) typedef struct X X;
|
||||
#if defined(__CUDA_ARCH__)
|
||||
#define PNANOVDB_STATIC_CONST constexpr __constant__
|
||||
#else
|
||||
#define PNANOVDB_STATIC_CONST static const
|
||||
#endif
|
||||
#define PNANOVDB_INOUT(X) X*
|
||||
#define PNANOVDB_IN(X) const X*
|
||||
#define PNANOVDB_DEREF(X) (*X)
|
||||
@@ -339,14 +406,26 @@ typedef struct pnanovdb_vec3_t
|
||||
{
|
||||
float x, y, z;
|
||||
}pnanovdb_vec3_t;
|
||||
typedef struct pnanovdb_uvec4_t
|
||||
{
|
||||
pnanovdb_uint32_t x, y, z, w;
|
||||
}pnanovdb_uvec4_t;
|
||||
typedef struct pnanovdb_ivec4_t
|
||||
{
|
||||
pnanovdb_int32_t x, y, z, w;
|
||||
}pnanovdb_ivec4_t;
|
||||
typedef struct pnanovdb_vec4_t
|
||||
{
|
||||
float x, y, z, w;
|
||||
}pnanovdb_vec4_t;
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return (pnanovdb_int32_t)v; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return (pnanovdb_int64_t)v; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return (pnanovdb_uint64_t)v; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return (pnanovdb_uint32_t)v; }
|
||||
PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { float vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { return *((pnanovdb_uint32_t*)(&v)); }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { pnanovdb_uint32_t vu; pnanovdb_memcpy(&vu, &v, sizeof(vu)); return vu; }
|
||||
PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { double vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { return *((pnanovdb_uint64_t*)(&v)); }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { pnanovdb_uint64_t vu; pnanovdb_memcpy(&vu, &v, sizeof(vu)); return vu; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)v; }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)(v >> 32u); }
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return ((pnanovdb_uint64_t)x) | (((pnanovdb_uint64_t)y) << 32u); }
|
||||
@@ -369,6 +448,9 @@ typedef bool pnanovdb_bool_t;
|
||||
#define PNANOVDB_TRUE true
|
||||
typedef int3 pnanovdb_coord_t;
|
||||
typedef float3 pnanovdb_vec3_t;
|
||||
typedef uint4 pnanovdb_uvec4_t;
|
||||
typedef int4 pnanovdb_ivec4_t;
|
||||
typedef float4 pnanovdb_vec4_t;
|
||||
pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
|
||||
pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
|
||||
float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return asfloat(v); }
|
||||
@@ -416,6 +498,9 @@ bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
|
||||
#define pnanovdb_int64_t ivec2
|
||||
#define pnanovdb_coord_t ivec3
|
||||
#define pnanovdb_vec3_t vec3
|
||||
#define pnanovdb_uvec4_t uvec4
|
||||
#define pnanovdb_ivec4_t ivec4
|
||||
#define pnanovdb_vec4_t vec4
|
||||
pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
|
||||
pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ivec2(v); }
|
||||
pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uvec2(v); }
|
||||
@@ -521,6 +606,35 @@ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pn
|
||||
v.z = a.z + b.z;
|
||||
return v;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uvec4_t pnanovdb_uvec4_add(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b)
|
||||
{
|
||||
pnanovdb_uvec4_t ret;
|
||||
ret.x = a.x + b.x;
|
||||
ret.y = a.y + b.y;
|
||||
ret.z = a.z + b.z;
|
||||
ret.w = a.w + b.w;
|
||||
return ret;
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uvec4_t pnanovdb_uvec4_sub(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b)
|
||||
{
|
||||
pnanovdb_uvec4_t ret;
|
||||
ret.x = a.x - b.x;
|
||||
ret.y = a.y - b.y;
|
||||
ret.z = a.z - b.z;
|
||||
ret.w = a.w - b.w;
|
||||
return ret;
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_vec4_t pnanovdb_vec4_add(pnanovdb_vec4_t a, pnanovdb_vec4_t b)
|
||||
{
|
||||
pnanovdb_vec4_t ret;
|
||||
ret.x = a.x + b.x;
|
||||
ret.y = a.y + b.y;
|
||||
ret.z = a.z + b.z;
|
||||
ret.w = a.w + b.w;
|
||||
return ret;
|
||||
}
|
||||
#elif defined(PNANOVDB_HLSL)
|
||||
pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return float3(a, a, a); }
|
||||
pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
|
||||
@@ -532,6 +646,9 @@ pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return
|
||||
pnanovdb_vec3_t pnanovdb_coord_to_vec3(pnanovdb_coord_t coord) { return float3(coord); }
|
||||
pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return int3(a, a, a); }
|
||||
pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
|
||||
pnanovdb_uvec4_t pnanovdb_uvec4_add(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a + b; }
|
||||
pnanovdb_uvec4_t pnanovdb_uvec4_sub(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a - b; }
|
||||
pnanovdb_vec4_t pnanovdb_vec4_add(pnanovdb_vec4_t a, pnanovdb_vec4_t b) { return a + b; }
|
||||
#elif defined(PNANOVDB_GLSL)
|
||||
pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return vec3(a, a, a); }
|
||||
pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
|
||||
@@ -543,6 +660,9 @@ pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return
|
||||
pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord) { return vec3(coord); }
|
||||
pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return ivec3(a, a, a); }
|
||||
pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
|
||||
pnanovdb_uvec4_t pnanovdb_uvec4_add(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a + b; }
|
||||
pnanovdb_uvec4_t pnanovdb_uvec4_sub(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a - b; }
|
||||
pnanovdb_vec4_t pnanovdb_vec4_add(pnanovdb_vec4_t a, pnanovdb_vec4_t b) { return a + b; }
|
||||
#endif
|
||||
|
||||
// ------------------------------------------------ Uint64 Utils -----------------------------------------------------------
|
||||
@@ -585,6 +705,19 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t
|
||||
return pnanovdb_uint32_as_uint64(low, high);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_diff(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
|
||||
{
|
||||
pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
|
||||
pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
|
||||
low -= pnanovdb_uint64_low(b);
|
||||
if (low > pnanovdb_uint64_low(a))
|
||||
{
|
||||
high -= 1u;
|
||||
}
|
||||
high -= pnanovdb_uint64_high(b);
|
||||
return pnanovdb_uint64_as_int64(pnanovdb_uint32_as_uint64(low, high));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
|
||||
{
|
||||
pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
|
||||
@@ -632,6 +765,11 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t
|
||||
return a + b;
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_diff(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
|
||||
{
|
||||
return pnanovdb_uint64_as_int64(a - b);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
|
||||
{
|
||||
return a - 1u;
|
||||
@@ -698,6 +836,10 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64_product(pnano
|
||||
ret.byte_offset += pnanovdb_uint64_low(byte_offset) * multiplier;
|
||||
return ret;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_address_diff(pnanovdb_address_t a, pnanovdb_address_t b)
|
||||
{
|
||||
return pnanovdb_uint64_diff(pnanovdb_uint32_as_uint64_low(a.byte_offset),pnanovdb_uint32_as_uint64_low(b.byte_offset));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
|
||||
{
|
||||
return address.byte_offset & mask;
|
||||
@@ -721,6 +863,12 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_addr
|
||||
{
|
||||
return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_add(pnanovdb_address_t a, pnanovdb_address_t b)
|
||||
{
|
||||
pnanovdb_address_t sum = a;
|
||||
sum.byte_offset += b.byte_offset;
|
||||
return sum;
|
||||
}
|
||||
#elif defined(PNANOVDB_ADDRESS_64)
|
||||
struct pnanovdb_address_t
|
||||
{
|
||||
@@ -758,6 +906,10 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64_product(pnano
|
||||
ret.byte_offset += byte_offset * pnanovdb_uint32_as_uint64_low(multiplier);
|
||||
return ret;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_address_diff(pnanovdb_address_t a, pnanovdb_address_t b)
|
||||
{
|
||||
return pnanovdb_uint64_diff(a.byte_offset, b.byte_offset);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
|
||||
{
|
||||
return pnanovdb_uint64_low(address.byte_offset) & mask;
|
||||
@@ -781,6 +933,12 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_addr
|
||||
{
|
||||
return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_add(pnanovdb_address_t a, pnanovdb_address_t b)
|
||||
{
|
||||
pnanovdb_address_t sum = a;
|
||||
sum.byte_offset += b.byte_offset;
|
||||
return sum;
|
||||
}
|
||||
#endif
|
||||
|
||||
// ------------------------------------------------ High Level Buffer Read -----------------------------------------------------------
|
||||
@@ -929,7 +1087,7 @@ PNANOVDB_FORCE_INLINE void pnanovdb_write_vec3(pnanovdb_buf_t buf, pnanovdb_addr
|
||||
#define PNANOVDB_MAGIC_FILE 0x324244566f6e614eUL// "NanoVDB2" in hex - little endian (uint64_t)
|
||||
|
||||
#define PNANOVDB_MAJOR_VERSION_NUMBER 32// reflects changes to the ABI
|
||||
#define PNANOVDB_MINOR_VERSION_NUMBER 6// reflects changes to the API but not ABI
|
||||
#define PNANOVDB_MINOR_VERSION_NUMBER 9// reflects changes to the API but not ABI
|
||||
#define PNANOVDB_PATCH_VERSION_NUMBER 0// reflects bug-fixes with no ABI or API changes
|
||||
|
||||
#define PNANOVDB_GRID_TYPE_UNKNOWN 0
|
||||
@@ -953,12 +1111,15 @@ PNANOVDB_FORCE_INLINE void pnanovdb_write_vec3(pnanovdb_buf_t buf, pnanovdb_addr
|
||||
#define PNANOVDB_GRID_TYPE_VEC4D 18
|
||||
#define PNANOVDB_GRID_TYPE_INDEX 19
|
||||
#define PNANOVDB_GRID_TYPE_ONINDEX 20
|
||||
#define PNANOVDB_GRID_TYPE_INDEXMASK 21
|
||||
#define PNANOVDB_GRID_TYPE_ONINDEXMASK 22
|
||||
//#define PNANOVDB_GRID_TYPE_INDEXMASK 21 // retired - available for future use
|
||||
//#define PNANOVDB_GRID_TYPE_ONINDEXMASK 22 // retired - available for future use
|
||||
#define PNANOVDB_GRID_TYPE_POINTINDEX 23
|
||||
#define PNANOVDB_GRID_TYPE_VEC3U8 24
|
||||
#define PNANOVDB_GRID_TYPE_VEC3U16 25
|
||||
#define PNANOVDB_GRID_TYPE_END 26
|
||||
#define PNANOVDB_GRID_TYPE_UINT8 26
|
||||
#define PNANOVDB_GRID_TYPE_END 27
|
||||
|
||||
#define PNANOVDB_GRID_TYPE_CAP 32
|
||||
|
||||
#define PNANOVDB_GRID_CLASS_UNKNOWN 0
|
||||
#define PNANOVDB_GRID_CLASS_LEVEL_SET 1 // narrow band level set, e.g. SDF
|
||||
@@ -984,22 +1145,22 @@ PNANOVDB_FORCE_INLINE void pnanovdb_write_vec3(pnanovdb_buf_t buf, pnanovdb_addr
|
||||
#define PNANOVDB_LEAF_TYPE_LITE 1
|
||||
#define PNANOVDB_LEAF_TYPE_FP 2
|
||||
#define PNANOVDB_LEAF_TYPE_INDEX 3
|
||||
#define PNANOVDB_LEAF_TYPE_INDEXMASK 4
|
||||
//#define PNANOVDB_LEAF_TYPE_INDEXMASK 4 // retired - available for future use
|
||||
#define PNANOVDB_LEAF_TYPE_POINTINDEX 5
|
||||
|
||||
// BuildType = Unknown, float, double, int16_t, int32_t, int64_t, Vec3f, Vec3d, Mask, ...
|
||||
// bit count of values in leaf nodes, i.e. 8*sizeof(*nanovdb::LeafNode<BuildType>::mValues) or zero if no values are stored
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 96, 192, 0, 16, 32, 1, 32, 4, 8, 16, 0, 128, 256, 0, 0, 0, 0, 16, 24, 48 };
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 16, 32, 64, 96, 192, 0, 16, 32, 1, 32, 4, 8, 16, 0, 128, 256, 0, 0, 0, 0, 16, 24, 48, 8, 0 };
|
||||
// bit count of the Tile union in InternalNodes, i.e. 8*sizeof(nanovdb::InternalData::Tile)
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[PNANOVDB_GRID_TYPE_END] = { 64, 64, 64, 64, 64, 64, 128, 192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 256, 64, 64, 64, 64, 64, 64, 64 };
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 64, 64, 64, 64, 64, 64, 128, 192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 256, 64, 64, 64, 64, 64, 64, 64, 64, 64 };
|
||||
// bit count of min/max values, i.e. 8*sizeof(nanovdb::LeafData::mMinimum) or zero if no min/max exists
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 96, 192, 8, 16, 32, 8, 32, 32, 32, 32, 32, 128, 256, 64, 64, 64, 64, 64, 24, 48 };
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 16, 32, 64, 96, 192, 8, 16, 32, 8, 32, 32, 32, 32, 32, 128, 256, 64, 64, 0, 0, 64, 24, 48, 8, 0 };
|
||||
// bit alignment of the value type, controlled by the smallest native type, which is why it is always 0, 8, 16, 32, or 64, e.g. for Vec3f it is 32
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 32, 64, 8, 16, 32, 8, 32, 32, 32, 32, 32, 32, 64, 64, 64, 64, 64, 64, 8, 16 };
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 16, 32, 64, 32, 64, 8, 16, 32, 8, 32, 32, 32, 32, 32, 32, 64, 64, 64, 0, 0, 64, 8, 16, 8, 0 };
|
||||
// bit alignment of the stats (avg/std-dev) types, e.g. 8*sizeof(nanovdb::LeafData::mAverage)
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 32, 32, 64, 32, 64, 8, 32, 32, 8, 32, 32, 32, 32, 32, 32, 64, 64, 64, 64, 64, 64, 32, 32 };
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 32, 32, 64, 32, 64, 8, 32, 32, 8, 32, 32, 32, 32, 32, 32, 64, 64, 64, 0, 0, 64, 32, 32, 32, 0 };
|
||||
// one of the 4 leaf types defined above, e.g. PNANOVDB_LEAF_TYPE_INDEX = 3
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[PNANOVDB_GRID_TYPE_END] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 2, 2, 2, 0, 0, 3, 3, 4, 4, 5, 0, 0 };
|
||||
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[PNANOVDB_GRID_TYPE_CAP] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 2, 2, 2, 0, 0, 3, 3, 0, 0, 5, 0, 0, 0, 0 };
|
||||
|
||||
struct pnanovdb_map_t
|
||||
{
|
||||
@@ -1094,7 +1255,9 @@ struct pnanovdb_grid_t
|
||||
pnanovdb_uint32_t grid_type; // 4 bytes, 636
|
||||
pnanovdb_int64_t blind_metadata_offset; // 8 bytes, 640
|
||||
pnanovdb_uint32_t blind_metadata_count; // 4 bytes, 648
|
||||
pnanovdb_uint32_t pad[5]; // 20 bytes, 652
|
||||
pnanovdb_uint32_t data0; // 4 bytes, 652
|
||||
pnanovdb_uint64_t data1; // 8 bytes, 656
|
||||
pnanovdb_uint64_t data2; // 8 bytes, 664
|
||||
};
|
||||
PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_t)
|
||||
struct pnanovdb_grid_handle_t { pnanovdb_address_t address; };
|
||||
@@ -1117,6 +1280,9 @@ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_handle_t)
|
||||
#define PNANOVDB_GRID_OFF_GRID_TYPE 636
|
||||
#define PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET 640
|
||||
#define PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT 648
|
||||
#define PNANOVDB_GRID_OFF_DATA0 652
|
||||
#define PNANOVDB_GRID_OFF_DATA1 656
|
||||
#define PNANOVDB_GRID_OFF_DATA2 664
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
|
||||
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC));
|
||||
@@ -1165,6 +1331,15 @@ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_grid_get_blind_metadata_offset(p
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_data0(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA0));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_data1(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
|
||||
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA1));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_data2(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
|
||||
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA2));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t magic) {
|
||||
pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC), magic);
|
||||
@@ -1208,6 +1383,15 @@ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_offset(pnanovdb_buf_
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t metadata_count) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT), metadata_count);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data0(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t data0) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA0), data0);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data1(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t data1) {
|
||||
pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA1), data1);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data2(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t data2) {
|
||||
pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA2), data2);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_make_version(pnanovdb_uint32_t major, pnanovdb_uint32_t minor, pnanovdb_uint32_t patch_num)
|
||||
{
|
||||
@@ -1227,11 +1411,30 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnanovdb_uint
|
||||
return version & ((1u << 10u) - 1u);
|
||||
}
|
||||
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_CLASS_UNKNOWN 0
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_CLASS_INDEX_ARRAY 1
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_CLASS_ATTRIBUTE_ARRAY 2
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_CLASS_GRID_NAME 3
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_CLASS_CHANNEL_ARRAY 4
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_CLASS_END 5
|
||||
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_UNKNOWN 0
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_POSITION 1
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_COLOR 2
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_NORMAL 3
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_RADIUS 4
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_VELOCITY 5
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_ID 6
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_WORLD_COORDS 7
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_GRID_COORDS 8
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_VOXEL_COORDS 9
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_END 10
|
||||
|
||||
struct pnanovdb_gridblindmetadata_t
|
||||
{
|
||||
pnanovdb_int64_t byte_offset; // 8 bytes, 0
|
||||
pnanovdb_uint64_t element_count; // 8 bytes, 8
|
||||
pnanovdb_uint32_t flags; // 4 bytes, 16
|
||||
pnanovdb_int64_t data_offset; // 8 bytes, 0
|
||||
pnanovdb_uint64_t value_count; // 8 bytes, 8
|
||||
pnanovdb_uint32_t value_size; // 4 bytes, 16
|
||||
pnanovdb_uint32_t semantic; // 4 bytes, 20
|
||||
pnanovdb_uint32_t data_class; // 4 bytes, 24
|
||||
pnanovdb_uint32_t data_type; // 4 bytes, 28
|
||||
@@ -1243,22 +1446,22 @@ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_handle_t)
|
||||
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_SIZE 288
|
||||
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET 0
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT 8
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS 16
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET 0
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT 8
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE 16
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC 20
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS 24
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE 28
|
||||
#define PNANOVDB_GRIDBLINDMETADATA_OFF_NAME 32
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_byte_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET));
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_element_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT));
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_flags(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS));
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC));
|
||||
@@ -1273,6 +1476,28 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_name(pnan
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_NAME + 4u * index));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_int64_t data_offset) {
|
||||
pnanovdb_write_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET), data_offset);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint64_t value_count) {
|
||||
pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT), value_count);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t value_size) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE), value_size);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t semantic) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC), semantic);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t data_class) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS), data_class);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t data_type) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE), data_type);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index, pnanovdb_uint32_t name) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_NAME + 4u * index), name);
|
||||
}
|
||||
|
||||
struct pnanovdb_tree_t
|
||||
{
|
||||
pnanovdb_uint64_t node_offset_leaf;
|
||||
@@ -1282,9 +1507,9 @@ struct pnanovdb_tree_t
|
||||
pnanovdb_uint32_t node_count_leaf;
|
||||
pnanovdb_uint32_t node_count_lower;
|
||||
pnanovdb_uint32_t node_count_upper;
|
||||
pnanovdb_uint32_t tile_count_leaf;
|
||||
pnanovdb_uint32_t tile_count_lower;
|
||||
pnanovdb_uint32_t tile_count_upper;
|
||||
pnanovdb_uint32_t tile_count_root;
|
||||
pnanovdb_uint64_t voxel_count;
|
||||
};
|
||||
PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_t)
|
||||
@@ -1300,9 +1525,9 @@ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_handle_t)
|
||||
#define PNANOVDB_TREE_OFF_NODE_COUNT_LEAF 32
|
||||
#define PNANOVDB_TREE_OFF_NODE_COUNT_LOWER 36
|
||||
#define PNANOVDB_TREE_OFF_NODE_COUNT_UPPER 40
|
||||
#define PNANOVDB_TREE_OFF_TILE_COUNT_LEAF 44
|
||||
#define PNANOVDB_TREE_OFF_TILE_COUNT_LOWER 48
|
||||
#define PNANOVDB_TREE_OFF_TILE_COUNT_UPPER 52
|
||||
#define PNANOVDB_TREE_OFF_TILE_COUNT_LOWER 44
|
||||
#define PNANOVDB_TREE_OFF_TILE_COUNT_UPPER 48
|
||||
#define PNANOVDB_TREE_OFF_TILE_COUNT_ROOT 52
|
||||
#define PNANOVDB_TREE_OFF_VOXEL_COUNT 56
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
@@ -1326,15 +1551,15 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lower(pnano
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LEAF));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_ROOT));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
|
||||
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT));
|
||||
}
|
||||
@@ -1360,15 +1585,15 @@ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_lower(pnanovdb_buf_t buf
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_upper) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER), node_count_upper);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_leaf) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LEAF), tile_count_leaf);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_lower) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER), tile_count_lower);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_upper) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER), tile_count_upper);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_root) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_ROOT), tile_count_root);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t voxel_count) {
|
||||
pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT), voxel_count);
|
||||
}
|
||||
@@ -1496,6 +1721,13 @@ PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_bbox_min(pnanovdb_buf_t buf, pnano
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
|
||||
pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MAX), bbox_max);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
|
||||
pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_VALUE_MASK + 4u * (bit_index >> 5u));
|
||||
pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
|
||||
if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
|
||||
if (value) valueMask |= (1u << (bit_index & 31u));
|
||||
pnanovdb_write_uint32(buf, addr, valueMask);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
|
||||
pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_CHILD_MASK + 4u * (bit_index >> 5u));
|
||||
pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
|
||||
@@ -1551,6 +1783,13 @@ PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_bbox_min(pnanovdb_buf_t buf, pnano
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
|
||||
pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MAX), bbox_max);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
|
||||
pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_VALUE_MASK + 4u * (bit_index >> 5u));
|
||||
pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
|
||||
if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
|
||||
if (value) valueMask |= (1u << (bit_index & 31u));
|
||||
pnanovdb_write_uint32(buf, addr, valueMask);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
|
||||
pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_CHILD_MASK + 4u * (bit_index >> 5u));
|
||||
pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
|
||||
@@ -1599,6 +1838,13 @@ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_bbox_min(pnanovdb_buf_t buf, pnanov
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bbox_dif_and_flags) {
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS), bbox_dif_and_flags);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
|
||||
pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * (bit_index >> 5u));
|
||||
pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
|
||||
if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
|
||||
if (value) valueMask |= (1u << (bit_index & 31u));
|
||||
pnanovdb_write_uint32(buf, addr, valueMask);
|
||||
}
|
||||
|
||||
struct pnanovdb_grid_type_constants_t
|
||||
{
|
||||
@@ -1634,7 +1880,7 @@ struct pnanovdb_grid_type_constants_t
|
||||
PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_type_constants_t)
|
||||
|
||||
// The following table with offsets will nedd to be updates as new GridTypes are added in NanoVDB.h
|
||||
PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[PNANOVDB_GRID_TYPE_END] =
|
||||
PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[PNANOVDB_GRID_TYPE_CAP] =
|
||||
{
|
||||
{28, 28, 28, 28, 28, 32, 0, 8, 20, 32, 8224, 8224, 8224, 8224, 8224, 270368, 1056, 1056, 1056, 1056, 1056, 33824, 80, 80, 80, 80, 96, 96},
|
||||
{28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
|
||||
@@ -1657,11 +1903,13 @@ PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constant
|
||||
{32, 64, 96, 128, 136, 160, 256, 32, 24, 64, 8224, 8256, 8288, 8296, 8320, 1056896, 1056, 1088, 1120, 1128, 1152, 132224, 80, 112, 144, 152, 160, 16544},
|
||||
{32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 96},
|
||||
{32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 96},
|
||||
{32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 160},
|
||||
{32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 160},
|
||||
{28, 28, 28, 28, 28, 32, 0, 8, 20, 32, 8224, 8224, 8224, 8224, 8224, 270368, 1056, 1056, 1056, 1056, 1056, 33824, 80, 80, 80, 80, 96, 96},
|
||||
{28, 28, 28, 28, 28, 32, 0, 8, 20, 32, 8224, 8224, 8224, 8224, 8224, 270368, 1056, 1056, 1056, 1056, 1056, 33824, 80, 80, 80, 80, 96, 96},
|
||||
{32, 40, 48, 56, 64, 96, 16, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 88, 96, 96, 96, 1120},
|
||||
{28, 31, 34, 40, 44, 64, 24, 8, 20, 32, 8224, 8227, 8232, 8236, 8256, 270400, 1056, 1059, 1064, 1068, 1088, 33856, 80, 83, 88, 92, 96, 1632},
|
||||
{28, 34, 40, 48, 52, 64, 48, 8, 20, 32, 8224, 8230, 8236, 8240, 8256, 270400, 1056, 1062, 1068, 1072, 1088, 33856, 80, 86, 92, 96, 128, 3200},
|
||||
{28, 29, 30, 32, 36, 64, 8, 8, 20, 32, 8224, 8225, 8228, 8232, 8256, 270400, 1056, 1057, 1060, 1064, 1088, 33856, 80, 81, 84, 88, 96, 608},
|
||||
{28, 28, 28, 28, 28, 32, 0, 8, 20, 32, 8224, 8224, 8224, 8224, 8224, 270368, 1056, 1056, 1056, 1056, 1056, 33824, 80, 80, 80, 80, 96, 96},
|
||||
};
|
||||
|
||||
// ------------------------------------------------ Basic Lookup -----------------------------------------------------------
|
||||
@@ -1678,7 +1926,7 @@ PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_grid
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_grid_get_gridblindmetadata_value_address(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
|
||||
{
|
||||
pnanovdb_gridblindmetadata_handle_t meta = pnanovdb_grid_get_gridblindmetadata(buf, grid, index);
|
||||
pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_byte_offset(buf, meta);
|
||||
pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_data_offset(buf, meta);
|
||||
pnanovdb_address_t address = pnanovdb_address_offset64(meta.address, pnanovdb_int64_as_uint64(byte_offset));
|
||||
return address;
|
||||
}
|
||||
@@ -1713,6 +1961,11 @@ PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile_zero(pn
|
||||
return tile;
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_tile_get_child_mask(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t tile)
|
||||
{
|
||||
return !pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile)
|
||||
{
|
||||
pnanovdb_upper_handle_t upper = { root.address };
|
||||
@@ -1720,6 +1973,11 @@ PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_g
|
||||
return upper;
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_root_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile, pnanovdb_upper_handle_t upper)
|
||||
{
|
||||
pnanovdb_root_tile_set_child(buf, tile, pnanovdb_address_diff(upper.address, root.address));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_coord_to_key(PNANOVDB_IN(pnanovdb_coord_t) ijk)
|
||||
{
|
||||
#if defined(PNANOVDB_NATIVE_64)
|
||||
@@ -1754,6 +2012,27 @@ PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_tile(pnanov
|
||||
return null_handle;
|
||||
}
|
||||
|
||||
// ----------------------------- Grid Type Safe Set ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_first_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_gridblindmetadata_handle_t gridblindmetadata) {
|
||||
pnanovdb_grid_set_blind_metadata_offset(buf, p, pnanovdb_address_diff(gridblindmetadata.address, p.address));
|
||||
}
|
||||
|
||||
// ----------------------------- Tree Type Safe Set ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_leaf_handle_t leaf) {
|
||||
pnanovdb_tree_set_node_offset_leaf(buf, p, pnanovdb_address_diff(leaf.address, p.address));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_lower_handle_t lower) {
|
||||
pnanovdb_tree_set_node_offset_lower(buf, p, pnanovdb_address_diff(lower.address, p.address));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_upper_handle_t upper) {
|
||||
pnanovdb_tree_set_node_offset_upper(buf, p, pnanovdb_address_diff(upper.address, p.address));
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_root_handle_t root) {
|
||||
pnanovdb_tree_set_node_offset_root(buf, p, pnanovdb_address_diff(root.address, p.address));
|
||||
}
|
||||
|
||||
// ----------------------------- Leaf Node ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
|
||||
@@ -1874,57 +2153,6 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_value_index(pnan
|
||||
return pnanovdb_uint64_offset(offset, n);
|
||||
}
|
||||
|
||||
// ----------------------------- Leaf IndexMask Specialization ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_indexmask_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
|
||||
{
|
||||
return pnanovdb_leaf_index_has_stats(buf, leaf);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
|
||||
{
|
||||
return pnanovdb_leaf_index_get_min_index(buf, min_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
|
||||
{
|
||||
return pnanovdb_leaf_index_get_max_index(buf, max_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
|
||||
{
|
||||
return pnanovdb_leaf_index_get_ave_index(buf, ave_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
|
||||
{
|
||||
return pnanovdb_leaf_index_get_dev_index(buf, dev_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
|
||||
{
|
||||
return pnanovdb_leaf_index_get_value_index(buf, value_address, ijk);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_indexmask_get_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n)
|
||||
{
|
||||
pnanovdb_uint32_t word_idx = n >> 5;
|
||||
pnanovdb_uint32_t bit_idx = n & 31;
|
||||
pnanovdb_uint32_t val_mask =
|
||||
pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
|
||||
return (val_mask & (1u << bit_idx)) != 0u;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_indexmask_set_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n, pnanovdb_bool_t v)
|
||||
{
|
||||
pnanovdb_uint32_t word_idx = n >> 5;
|
||||
pnanovdb_uint32_t bit_idx = n & 31;
|
||||
pnanovdb_uint32_t val_mask =
|
||||
pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
|
||||
if (v)
|
||||
{
|
||||
val_mask = val_mask | (1u << bit_idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
val_mask = val_mask & ~(1u << bit_idx);
|
||||
}
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx), val_mask);
|
||||
}
|
||||
|
||||
// ----------------------------- Leaf OnIndex Specialization ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindex_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
|
||||
@@ -2016,65 +2244,6 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_value_index(pn
|
||||
return value_index;
|
||||
}
|
||||
|
||||
// ----------------------------- Leaf OnIndexMask Specialization ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindexmask_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_value_count(buf, leaf);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_last_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_last_offset(buf, leaf);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindexmask_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_has_stats(buf, leaf);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_min_index(buf, min_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_max_index(buf, max_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_ave_index(buf, ave_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_dev_index(buf, dev_address);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
|
||||
{
|
||||
return pnanovdb_leaf_onindex_get_value_index(buf, value_address, ijk);
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindexmask_get_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n)
|
||||
{
|
||||
pnanovdb_uint32_t word_idx = n >> 5;
|
||||
pnanovdb_uint32_t bit_idx = n & 31;
|
||||
pnanovdb_uint32_t val_mask =
|
||||
pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
|
||||
return (val_mask & (1u << bit_idx)) != 0u;
|
||||
}
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_onindexmask_set_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n, pnanovdb_bool_t v)
|
||||
{
|
||||
pnanovdb_uint32_t word_idx = n >> 5;
|
||||
pnanovdb_uint32_t bit_idx = n & 31;
|
||||
pnanovdb_uint32_t val_mask =
|
||||
pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
|
||||
if (v)
|
||||
{
|
||||
val_mask = val_mask | (1u << bit_idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
val_mask = val_mask & ~(1u << bit_idx);
|
||||
}
|
||||
pnanovdb_write_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx), val_mask);
|
||||
}
|
||||
|
||||
// ----------------------------- Leaf PointIndex Specialization ---------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
|
||||
@@ -2204,6 +2373,17 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address(pnanov
|
||||
return pnanovdb_lower_get_value_address_and_level(grid_type, buf, lower, ijk, PNANOVDB_REF(level));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n, pnanovdb_int64_t child)
|
||||
{
|
||||
pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
|
||||
pnanovdb_write_int64(buf, table_address, child);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n, pnanovdb_leaf_handle_t leaf)
|
||||
{
|
||||
pnanovdb_lower_set_table_child(grid_type, buf, lower, n, pnanovdb_address_diff(leaf.address, lower.address));
|
||||
}
|
||||
|
||||
// ------------------------------------------------ Upper Node -----------------------------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
|
||||
@@ -2285,8 +2465,19 @@ PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_table_child(pnanovdb_grid_type_t g
|
||||
pnanovdb_write_int64(buf, bufAddress, child);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n, pnanovdb_lower_handle_t lower)
|
||||
{
|
||||
pnanovdb_upper_set_table_child(grid_type, buf, upper, n, pnanovdb_address_diff(lower.address, upper.address));
|
||||
}
|
||||
|
||||
// ------------------------------------------------ Root -----------------------------------------------------------
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_background_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
|
||||
{
|
||||
pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background);
|
||||
return pnanovdb_address_offset(root.address, byte_offset);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
|
||||
{
|
||||
pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_min);
|
||||
@@ -2585,12 +2776,6 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_ca
|
||||
return pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, lower, ijk, acc, PNANOVDB_REF(level));
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n, pnanovdb_int64_t child)
|
||||
{
|
||||
pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
|
||||
pnanovdb_write_int64(buf, table_address, child);
|
||||
}
|
||||
|
||||
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
|
||||
{
|
||||
pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
|
||||
@@ -3221,6 +3406,19 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_update(PNANOVDB_INOUT(pnanov
|
||||
{
|
||||
return PNANOVDB_FALSE;
|
||||
}
|
||||
|
||||
// compute valid voxel range
|
||||
pnanovdb_coord_t voxel_max = {
|
||||
(PNANOVDB_DEREF(hdda).voxel.x + PNANOVDB_DEREF(hdda).dim - 1) & (~(dim - 1)),
|
||||
(PNANOVDB_DEREF(hdda).voxel.y + PNANOVDB_DEREF(hdda).dim - 1) & (~(dim - 1)),
|
||||
(PNANOVDB_DEREF(hdda).voxel.z + PNANOVDB_DEREF(hdda).dim - 1) & (~(dim - 1))
|
||||
};
|
||||
pnanovdb_coord_t voxel_min = {
|
||||
PNANOVDB_DEREF(hdda).voxel.x & (~(dim - 1)),
|
||||
PNANOVDB_DEREF(hdda).voxel.y & (~(dim - 1)),
|
||||
PNANOVDB_DEREF(hdda).voxel.z & (~(dim - 1))
|
||||
};
|
||||
|
||||
PNANOVDB_DEREF(hdda).dim = dim;
|
||||
|
||||
pnanovdb_vec3_t pos = pnanovdb_vec3_add(
|
||||
@@ -3231,6 +3429,14 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_update(PNANOVDB_INOUT(pnanov
|
||||
|
||||
PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
|
||||
|
||||
// clamp voxel to valid range
|
||||
PNANOVDB_DEREF(hdda).voxel.x = PNANOVDB_DEREF(hdda).voxel.x < voxel_max.x ? PNANOVDB_DEREF(hdda).voxel.x : voxel_max.x;
|
||||
PNANOVDB_DEREF(hdda).voxel.y = PNANOVDB_DEREF(hdda).voxel.y < voxel_max.y ? PNANOVDB_DEREF(hdda).voxel.y : voxel_max.y;
|
||||
PNANOVDB_DEREF(hdda).voxel.z = PNANOVDB_DEREF(hdda).voxel.z < voxel_max.z ? PNANOVDB_DEREF(hdda).voxel.z : voxel_max.z;
|
||||
PNANOVDB_DEREF(hdda).voxel.x = PNANOVDB_DEREF(hdda).voxel.x > voxel_min.x ? PNANOVDB_DEREF(hdda).voxel.x : voxel_min.x;
|
||||
PNANOVDB_DEREF(hdda).voxel.y = PNANOVDB_DEREF(hdda).voxel.y > voxel_min.y ? PNANOVDB_DEREF(hdda).voxel.y : voxel_min.y;
|
||||
PNANOVDB_DEREF(hdda).voxel.z = PNANOVDB_DEREF(hdda).voxel.z > voxel_min.z ? PNANOVDB_DEREF(hdda).voxel.z : voxel_min.z;
|
||||
|
||||
if (PNANOVDB_DEREF(hdda).step.x != 0)
|
||||
{
|
||||
PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
|
||||
|
||||
@@ -9,6 +9,6 @@ A lightweight GPU friendly version of VDB initially targeting rendering applicat
|
||||
* [Examples](../../doc/nanovdb/HelloWorld.md)
|
||||
|
||||
### Copyright Contributors to the OpenVDB Project
|
||||
### SPDX-License-Identifier: MPL-2.0
|
||||
### SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[](https://circleci.com/gh/NVIDIA-Omniverse/NanoVDB)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(NanoVDBExamples LANGUAGES CXX)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -32,17 +32,17 @@ if(NOT NANOVDB_USE_OPENVDB)
|
||||
else()
|
||||
add_executable(nanovdb_convert convert/nanovdb_convert.cc)
|
||||
target_link_libraries(nanovdb_convert PRIVATE nanovdb)
|
||||
install(TARGETS nanovdb_convert RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
install(TARGETS nanovdb_convert RUNTIME DESTINATION ${NANOVDB_INSTALL_BINDIR})
|
||||
endif()
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# nanovdb_print
|
||||
add_executable(nanovdb_print print/nanovdb_print.cc)
|
||||
target_link_libraries(nanovdb_print PRIVATE nanovdb)
|
||||
install(TARGETS nanovdb_print RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
install(TARGETS nanovdb_print RUNTIME DESTINATION ${NANOVDB_INSTALL_BINDIR})
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# nanovdb_validate
|
||||
add_executable(nanovdb_validate validate/nanovdb_validate.cc)
|
||||
target_link_libraries(nanovdb_validate PRIVATE nanovdb)
|
||||
install(TARGETS nanovdb_validate RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
install(TARGETS nanovdb_validate RUNTIME DESTINATION ${NANOVDB_INSTALL_BINDIR})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb_convert.cc
|
||||
@@ -15,9 +15,9 @@
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/util/CreateNanoGrid.h>
|
||||
#include <nanovdb/util/NanoToOpenVDB.h>
|
||||
#include <nanovdb/io/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
#include <nanovdb/tools/NanoToOpenVDB.h>
|
||||
|
||||
void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAILURE)
|
||||
{
|
||||
@@ -35,6 +35,8 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
<< "--fp8\tQuantize float grids to 8 bits\n"
|
||||
<< "--fp16\tQuantize float grids to 16 bits\n"
|
||||
<< "--fpN\tQuantize float grids to variable bit depth (use -a or -r to specify a tolerance)\n"
|
||||
<< "--index\tProduce an IndexGrid where all float values are encoded as sidecar data\n"
|
||||
<< "--onIndex\tProduce an IndexGrid where active float values are encoded as sidecar data\n"
|
||||
<< "-g,--grid name\tConvert all grids matching the specified string name\n"
|
||||
<< "-h,--help\tPrints this message\n"
|
||||
<< "-r,--rel-error float\t Relative error tolerance used for variable bit depth quantization\n"
|
||||
@@ -47,7 +49,9 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
|
||||
void version [[noreturn]] (const char* progName, int exitStatus = EXIT_SUCCESS)
|
||||
{
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, nanovdb::Version().c_str());
|
||||
char str[8];
|
||||
nanovdb::toStr(str, nanovdb::Version());
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, str);
|
||||
exit(exitStatus);
|
||||
}
|
||||
|
||||
@@ -55,14 +59,14 @@ int main(int argc, char* argv[])
|
||||
{
|
||||
int exitStatus = EXIT_SUCCESS;
|
||||
|
||||
nanovdb::io::Codec codec = nanovdb::io::Codec::NONE;// compression codec for the file
|
||||
nanovdb::StatsMode sMode = nanovdb::StatsMode::Default;
|
||||
nanovdb::ChecksumMode cMode = nanovdb::ChecksumMode::Default;
|
||||
nanovdb::GridType qMode = nanovdb::GridType::Unknown;//specify the quantization mode
|
||||
bool verbose = false, overwrite = false, dither = false, absolute = true;
|
||||
float tolerance = -1.0f;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
nanovdb::io::Codec codec = nanovdb::io::Codec::NONE;// compression codec for the file
|
||||
nanovdb::tools::StatsMode sMode = nanovdb::tools::StatsMode::Default;
|
||||
nanovdb::CheckMode cMode = nanovdb::CheckMode::Default;
|
||||
nanovdb::GridType qMode = nanovdb::GridType::Unknown;//specify the quantization mode
|
||||
bool verbose = false, overwrite = false, dither = false, absolute = true;
|
||||
float tolerance = -1.0f;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
auto toLowerCase = [](std::string &str) {
|
||||
std::transform(str.begin(), str.end(), str.begin(),[](unsigned char c){return std::tolower(c);});
|
||||
};
|
||||
@@ -83,6 +87,10 @@ int main(int argc, char* argv[])
|
||||
qMode = nanovdb::GridType::Fp16;
|
||||
} else if (arg == "--fpN") {
|
||||
qMode = nanovdb::GridType::FpN;
|
||||
} else if (arg == "--index") {
|
||||
qMode = nanovdb::GridType::Index;
|
||||
} else if (arg == "--onIndex") {
|
||||
qMode = nanovdb::GridType::OnIndex;
|
||||
} else if (arg == "-h" || arg == "--help") {
|
||||
usage(argv[0], EXIT_SUCCESS);
|
||||
} else if (arg == "-b" || arg == "--blosc") {
|
||||
@@ -99,11 +107,11 @@ int main(int argc, char* argv[])
|
||||
std::string str(argv[++i]);
|
||||
toLowerCase(str);
|
||||
if (str == "none") {
|
||||
cMode = nanovdb::ChecksumMode::Disable;
|
||||
cMode = nanovdb::CheckMode::Disable;
|
||||
} else if (str == "partial") {
|
||||
cMode = nanovdb::ChecksumMode::Partial;
|
||||
cMode = nanovdb::CheckMode::Partial;
|
||||
} else if (str == "full") {
|
||||
cMode = nanovdb::ChecksumMode::Full;
|
||||
cMode = nanovdb::CheckMode::Full;
|
||||
} else {
|
||||
std::cerr << "Expected one of the following checksum modes: {none, partial, full}\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
@@ -117,13 +125,13 @@ int main(int argc, char* argv[])
|
||||
std::string str(argv[++i]);
|
||||
toLowerCase(str);
|
||||
if (str == "none") {
|
||||
sMode = nanovdb::StatsMode::Disable;
|
||||
sMode = nanovdb::tools::StatsMode::Disable;
|
||||
} else if (str == "bbox") {
|
||||
sMode = nanovdb::StatsMode::BBox;
|
||||
sMode = nanovdb::tools::StatsMode::BBox;
|
||||
} else if (str == "extrema") {
|
||||
sMode = nanovdb::StatsMode::MinMax;
|
||||
sMode = nanovdb::tools::StatsMode::MinMax;
|
||||
} else if (str == "all") {
|
||||
sMode = nanovdb::StatsMode::All;
|
||||
sMode = nanovdb::tools::StatsMode::All;
|
||||
} else {
|
||||
std::cerr << "Expected one of the following stats modes: {none, bbox, extrema, all}\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
@@ -136,7 +144,7 @@ int main(int argc, char* argv[])
|
||||
} else {
|
||||
qMode = nanovdb::GridType::FpN;
|
||||
absolute = true;
|
||||
tolerance = atof(argv[++i]);
|
||||
tolerance = static_cast<float>(atof(argv[++i]));
|
||||
}
|
||||
} else if (arg == "-r" || arg == "--rel-error") {
|
||||
if (i + 1 == argc) {
|
||||
@@ -145,7 +153,7 @@ int main(int argc, char* argv[])
|
||||
} else {
|
||||
qMode = nanovdb::GridType::FpN;
|
||||
absolute = false;
|
||||
tolerance = atof(argv[++i]);
|
||||
tolerance = static_cast<float>(atof(argv[++i]));
|
||||
}
|
||||
} else if (arg == "-g" || arg == "--grid") {
|
||||
if (i + 1 == argc) {
|
||||
@@ -167,17 +175,22 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "Expected at least one input file followed by exactly one output file\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
const std::string outputFile = fileNames.back();
|
||||
const std::string outputFile = fileNames.back();// last file is always the output file
|
||||
const std::string ext = outputFile.substr(outputFile.find_last_of(".") + 1);
|
||||
bool toNanoVDB = false;
|
||||
if (ext == "nvdb") {
|
||||
toNanoVDB = true;
|
||||
} else if (ext != "vdb") {
|
||||
} else if (ext == "vdb") {
|
||||
if (qMode != nanovdb::GridType::Unknown) {
|
||||
std::cerr << "The options are incompatible an output of type OpenVDB" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
} else {
|
||||
std::cerr << "Unrecognized file extension: \"" << ext << "\"\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
fileNames.pop_back();
|
||||
fileNames.pop_back();// remove the output file name
|
||||
|
||||
if (!overwrite) {
|
||||
std::ifstream is(outputFile, std::ios::in | std::ios::binary);
|
||||
@@ -201,9 +214,16 @@ int main(int argc, char* argv[])
|
||||
|
||||
auto openToNano = [&](const openvdb::GridBase::Ptr& base)
|
||||
{
|
||||
using SrcGridT = openvdb::FloatGrid;
|
||||
if (auto floatGrid = openvdb::GridBase::grid<SrcGridT>(base)) {
|
||||
nanovdb::CreateNanoGrid<SrcGridT> s(*floatGrid);
|
||||
const bool includeStats = false, includeTiles = false;
|
||||
const int verb = verbose ? 1 : 0;
|
||||
if (qMode == nanovdb::GridType::OnIndex) {
|
||||
return nanovdb::tools::openToIndexVDB<nanovdb::ValueOnIndex>(base, 1u, includeStats, includeTiles, verb);
|
||||
} else if (qMode == nanovdb::GridType::Index) {
|
||||
return nanovdb::tools::openToIndexVDB<nanovdb::ValueIndex>(base, 1u, includeStats, includeTiles, verb);
|
||||
}
|
||||
|
||||
if (auto floatGrid = openvdb::GridBase::grid<openvdb::FloatGrid>(base)) {
|
||||
nanovdb::tools::CreateNanoGrid<openvdb::FloatGrid> s(*floatGrid);
|
||||
s.setStats(sMode);
|
||||
s.setChecksum(cMode);
|
||||
s.enableDithering(dither);
|
||||
@@ -217,15 +237,15 @@ int main(int argc, char* argv[])
|
||||
return s.getHandle<nanovdb::Fp16>();
|
||||
case nanovdb::GridType::FpN:
|
||||
if (absolute) {
|
||||
return s.getHandle<nanovdb::FpN>(nanovdb::AbsDiff(tolerance));
|
||||
return s.getHandle<nanovdb::FpN>(nanovdb::tools::AbsDiff(tolerance));
|
||||
} else {
|
||||
return s.getHandle<nanovdb::FpN>(nanovdb::RelDiff(tolerance));
|
||||
return s.getHandle<nanovdb::FpN>(nanovdb::tools::RelDiff(tolerance));
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}// end of switch
|
||||
}
|
||||
return nanovdb::openToNanoVDB(base, sMode, cMode, verbose ? 1 : 0);
|
||||
return nanovdb::tools::openToNanoVDB(base, sMode, cMode, verb);
|
||||
};
|
||||
try {
|
||||
if (toNanoVDB) { // OpenVDB -> NanoVDB
|
||||
@@ -235,26 +255,21 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "Since the last file has extension .nvdb the remaining input files were expected to have extensions .vdb\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose)
|
||||
std::cout << "Opening OpenVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
if (verbose) std::cout << "Opening OpenVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
openvdb::io::File file(inputFile);
|
||||
file.open(false); //disable delayed loading
|
||||
if (gridName.empty()) {// convert all grid in the file
|
||||
auto grids = file.getGrids();
|
||||
std::vector<nanovdb::GridHandle<nanovdb::HostBuffer> > handles;
|
||||
for (auto& grid : *grids) {
|
||||
if (verbose) {
|
||||
std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
}
|
||||
if (verbose) std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
handles.push_back(openToNano(grid));
|
||||
} // loop over OpenVDB grids in file
|
||||
auto handle = nanovdb::mergeGrids<nanovdb::HostBuffer, std::vector>(handles);
|
||||
nanovdb::io::writeGrid(os, handle, codec);
|
||||
} else {// convert only grid with matching name
|
||||
auto grid = file.readGrid(gridName);
|
||||
if (verbose) {
|
||||
std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
}
|
||||
if (verbose) std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
auto handle = openToNano(grid);
|
||||
nanovdb::io::writeGrid(os, handle, codec);
|
||||
}
|
||||
@@ -267,15 +282,13 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "Since the last file has extension .vdb the remaining input files were expected to have extensions .nvdb\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose)
|
||||
std::cout << "Opening NanoVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
if (verbose) std::cout << "Opening NanoVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
if (gridName.empty()) {
|
||||
auto handles = nanovdb::io::readGrids(inputFile, verbose);
|
||||
for (auto &h : handles) {
|
||||
for (uint32_t i = 0; i < h.gridCount(); ++i) {
|
||||
if (verbose)
|
||||
std::cout << "Converting NanoVDB grid named \"" << h.gridMetaData(i)->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanoToOpenVDB(h, 0, i));
|
||||
if (verbose) std::cout << "Converting NanoVDB grid named \"" << h.gridMetaData(i)->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanovdb::tools::nanoToOpenVDB(h, i));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -284,9 +297,8 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "File did not contain a NanoVDB grid named \"" << gridName << "\"\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose)
|
||||
std::cout << "Converting NanoVDB grid named \"" << handle.gridMetaData()->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanoToOpenVDB(handle));
|
||||
if (verbose) std::cout << "Converting NanoVDB grid named \"" << handle.gridMetaData()->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanovdb::tools::nanoToOpenVDB(handle));
|
||||
}
|
||||
} // loop over input files
|
||||
file.write(*grids);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb_print.cc
|
||||
@@ -11,7 +11,7 @@
|
||||
\brief Command-line tool that prints information about grids in a nanovdb file
|
||||
*/
|
||||
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/io/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
@@ -31,7 +31,9 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
|
||||
void version [[noreturn]] (const char* progName, int exitStatus = EXIT_SUCCESS)
|
||||
{
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, nanovdb::Version().c_str());
|
||||
char str[8];
|
||||
nanovdb::toStr(str, nanovdb::Version());
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, str);
|
||||
exit(exitStatus);
|
||||
}
|
||||
|
||||
@@ -42,6 +44,7 @@ int main(int argc, char* argv[])
|
||||
enum Mode : int { Short = 0,
|
||||
Default = 1,
|
||||
Long = 2 } mode = Default;
|
||||
char str[32];
|
||||
bool verbose = false;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
@@ -109,7 +112,7 @@ int main(int argc, char* argv[])
|
||||
ss << "(" << v[0] << "," << v[1] << "," << v[2] << ")";
|
||||
return ss.str();
|
||||
};
|
||||
auto wbboxToStr = [](const nanovdb::BBox<nanovdb::Vec3d>& bbox) {
|
||||
auto wbboxToStr = [](const nanovdb::math::BBox<nanovdb::Vec3d>& bbox) {
|
||||
std::stringstream ss;
|
||||
if (bbox.empty()) {
|
||||
ss << "empty grid";
|
||||
@@ -163,7 +166,7 @@ int main(int argc, char* argv[])
|
||||
auto classWidth = std::string("Class").length() + padding;
|
||||
auto codecWidth = std::string("Codec").length() + padding;
|
||||
auto ibboxWidth = std::string("Index Bounding Box").length() + padding;
|
||||
auto wbboxWidth = std::string("World BBox").length() + padding;
|
||||
auto wbboxWidth = std::string("World Bounding Box").length() + padding;
|
||||
auto sizeWidth = std::string("Size").length() + padding;
|
||||
auto fileWidth = std::string("File").length() + padding;
|
||||
auto voxelsWidth = std::string("# Voxels").length() + padding;
|
||||
@@ -172,21 +175,23 @@ int main(int argc, char* argv[])
|
||||
auto configWidth = std::string("32^3->16^3->8^3").length() + padding;
|
||||
auto tileWidth = std::string("# Active tiles").length() + padding;
|
||||
auto resWidth = std::string("Resolution").length() + padding;
|
||||
auto blindWidth = std::string("Blind data count").length() + padding;
|
||||
for (auto& m : list) {
|
||||
width(nameWidth, m.gridName);
|
||||
width(typeWidth, nanovdb::toStr(m.gridType));
|
||||
width(classWidth, nanovdb::toStr(m.gridClass));
|
||||
width(codecWidth, nanovdb::io::toStr(m.codec));
|
||||
width(typeWidth, nanovdb::toStr(str, m.gridType));
|
||||
width(classWidth, nanovdb::toStr(str, m.gridClass));
|
||||
width(codecWidth, nanovdb::io::toStr(str, m.codec));
|
||||
width(wbboxWidth, wbboxToStr(m.worldBBox));
|
||||
width(ibboxWidth, ibboxToStr(m.indexBBox));
|
||||
width(resWidth, resToStr(m.indexBBox));
|
||||
width(sizeWidth, format(m.gridSize));
|
||||
width(fileWidth, format(m.fileSize));
|
||||
width(versionWidth, std::string(m.version.c_str()));
|
||||
width(versionWidth, nanovdb::toStr(str, m.version));
|
||||
width(configWidth, nodesToStr(m.nodeCount));
|
||||
width(tileWidth, nodesToStr(m.tileCount));
|
||||
width(voxelsWidth, std::to_string(m.voxelCount));
|
||||
width(voxelSizeWidth, Vec3dToStr(m.voxelSize));
|
||||
width(blindWidth, std::to_string(m.blindDataCount));
|
||||
}
|
||||
std::cout << "\nThe file \"" << file << "\" contains the following ";
|
||||
if (list.size()>1) {
|
||||
@@ -211,7 +216,8 @@ int main(int argc, char* argv[])
|
||||
std::cout << std::left << std::setw(configWidth) << "32^3->16^3->8^3"
|
||||
<< std::left << std::setw(tileWidth) << "# Active tiles"
|
||||
<< std::left << std::setw(ibboxWidth) << "Index Bounding Box"
|
||||
<< std::left << std::setw(wbboxWidth) << "World Bounding Box";
|
||||
<< std::left << std::setw(wbboxWidth) << "World Bounding Box"
|
||||
<< std::left << std::setw(blindWidth) << "Blind data count";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
int n = 0;
|
||||
@@ -220,11 +226,11 @@ int main(int argc, char* argv[])
|
||||
continue;
|
||||
std::cout << std::left << std::setw(numberWidth) << ++n
|
||||
<< std::left << std::setw(nameWidth) << m.gridName
|
||||
<< std::left << std::setw(typeWidth) << nanovdb::toStr(m.gridType);
|
||||
<< std::left << std::setw(typeWidth) << nanovdb::toStr(str, m.gridType);
|
||||
if (mode != Short) {
|
||||
std::cout << std::left << std::setw(classWidth) << nanovdb::toStr(m.gridClass)
|
||||
<< std::left << std::setw(versionWidth) << std::string(m.version.c_str())
|
||||
<< std::left << std::setw(codecWidth) << nanovdb::io::toStr(m.codec)
|
||||
std::cout << std::left << std::setw(classWidth) << nanovdb::toStr(str, m.gridClass)
|
||||
<< std::left << std::setw(versionWidth) << nanovdb::toStr(str+10, m.version)
|
||||
<< std::left << std::setw(codecWidth) << nanovdb::io::toStr(str + 20, m.codec)
|
||||
<< std::left << std::setw(sizeWidth) << format(m.gridSize)
|
||||
<< std::left << std::setw(fileWidth) << format(m.fileSize)
|
||||
<< std::left << std::setw(voxelSizeWidth) << Vec3dToStr(m.voxelSize);
|
||||
@@ -235,11 +241,12 @@ int main(int argc, char* argv[])
|
||||
std::cout << std::left << std::setw(configWidth) << nodesToStr(m.nodeCount)
|
||||
<< std::left << std::setw(tileWidth) << nodesToStr(m.tileCount)
|
||||
<< std::left << std::setw(ibboxWidth) << ibboxToStr(m.indexBBox)
|
||||
<< std::left << std::setw(wbboxWidth) << wbboxToStr(m.worldBBox);
|
||||
<< std::left << std::setw(wbboxWidth) << wbboxToStr(m.worldBBox)
|
||||
<< std::left << std::setw(blindWidth) << m.blindDataCount;
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
}// loop over FileGridMetaData in list from a single file
|
||||
}// loop over files
|
||||
if (verbose) {
|
||||
size_t w = 0;
|
||||
switch (mode) {
|
||||
@@ -321,4 +328,4 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
|
||||
return exitStatus;
|
||||
}
|
||||
}// main
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
import argparse
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def open_file(file_path):
|
||||
"""
|
||||
Opens a file. If utf-8 decoding fails, try windows-1252.
|
||||
|
||||
Args:
|
||||
file_path: Path of the file to open.
|
||||
|
||||
Returns:
|
||||
The content of the file in an arbitrary format.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "r", encoding="utf-8", errors="replace") as file:
|
||||
return file.read()
|
||||
except UnicodeDecodeError:
|
||||
with open(file_path, "r", encoding="windows-1252", errors="replace") as file:
|
||||
return file.read()
|
||||
|
||||
|
||||
def write_file(file_path, content):
|
||||
"""
|
||||
Writes a file. If utf-8 decoding fails, try windows-1252.
|
||||
|
||||
Args:
|
||||
file_path: Path of the file to open.
|
||||
|
||||
Returns:
|
||||
None.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "w", encoding="utf-8", errors="replace") as file:
|
||||
file.write(content)
|
||||
except UnicodeDecodeError:
|
||||
with open(file_path, "w", encoding="windows-1252", errors="replace") as file:
|
||||
file.write(content)
|
||||
|
||||
|
||||
def update_files(dir_path):
|
||||
"""
|
||||
Updates the content of files ending in .h, .cuh, .cc, .cu, and .cpp
|
||||
to call the appropriate API as we update NanoVDB from version 32.6 to
|
||||
version 32.7. This includes changes in namespaces, function names, and
|
||||
include directories.
|
||||
|
||||
Args:
|
||||
Directory path: will include files in downstream directories.
|
||||
|
||||
Returns:
|
||||
None. Writes the contents of the file.
|
||||
"""
|
||||
|
||||
# List of file extensions to search for
|
||||
file_extensions = [".h", ".cuh", ".cc", ".cu", ".cpp"]
|
||||
|
||||
nspace_dic = {
|
||||
"math": [
|
||||
"Ray",
|
||||
"DDA<",
|
||||
"HDDA",
|
||||
"Vec3<",
|
||||
"Vec4<",
|
||||
"BBox<",
|
||||
"ZeroCrossing",
|
||||
"TreeMarcher",
|
||||
"PointTreeMarcher",
|
||||
"BoxStencil<",
|
||||
"CurvatureStencil<",
|
||||
"GradStencil<",
|
||||
"WenoStencil<",
|
||||
"AlignUp",
|
||||
"Min",
|
||||
"Max",
|
||||
"Abs",
|
||||
"Clamp",
|
||||
"Sqrt",
|
||||
"Sign",
|
||||
"Maximum<",
|
||||
"Delta<",
|
||||
"RoundDown<",
|
||||
"pi<",
|
||||
"isApproxZero<",
|
||||
"Round<",
|
||||
"createSampler",
|
||||
"SampleFromVoxels<",
|
||||
],
|
||||
"tools": [
|
||||
"createNanoGrid",
|
||||
"StatsMode",
|
||||
"createLevelSetSphere",
|
||||
"createFogVolumeSphere",
|
||||
"createFogVolumeSphere createFogVolumeSphere",
|
||||
"createFogVolumeTorus",
|
||||
"createLevelSetBox",
|
||||
"CreateNanoGrid",
|
||||
"updateGridStats",
|
||||
"evalChecksum",
|
||||
"validateChecksum",
|
||||
"checkGrid",
|
||||
"Extrema",
|
||||
],
|
||||
"util": [
|
||||
"is_floating_point",
|
||||
"findLowestOn",
|
||||
"findHighestOn",
|
||||
"Range",
|
||||
"streq",
|
||||
"strcpy",
|
||||
"strcat",
|
||||
"empty(",
|
||||
"Split",
|
||||
"invoke",
|
||||
"forEach",
|
||||
"reduce",
|
||||
"prefixSum",
|
||||
"is_same",
|
||||
"is_specialization",
|
||||
"PtrAdd",
|
||||
"PtrDiff",
|
||||
],
|
||||
}
|
||||
|
||||
rename_dic = {
|
||||
# list from func4 in updateFiles.sh
|
||||
"nanovdb::build::": "nanovdb::tools::build::",
|
||||
"nanovdb::BBoxR": "nanovdb::Vec3dBBox",
|
||||
"nanovdb::BBox<nanovdb::Vec3d>": "nanovdb::Vec3dBbox",
|
||||
# scope and rename, i.e. list from func2 in updateFiles.sh
|
||||
"nanovdb::cudaCreateNodeManager": "nanovdb::cuda::createNodeManager",
|
||||
"nanovdb::cudaVoxelsToGrid": "nanovdb::cuda::voxelsToGrid",
|
||||
"nanovdb::cudaPointsToGrid": "nanovdb::cuda::pointsToGrid",
|
||||
"nanovdb::DitherLUT": "nanovdb::math::DitherLUT",
|
||||
"nanovdb::PackedRGBA8": "nanovdb::math::Rgba8",
|
||||
"nanovdb::Rgba8": "nanovdb::math::Rgba8",
|
||||
"nanovdb::CpuTimer": "nanovdb::util::Timer",
|
||||
"nanovdb::GpuTimer": "nanovdb::util::cuda::Timer",
|
||||
"nanovdb::CountOn": "nanovdb::util::countOn",
|
||||
}
|
||||
|
||||
movdir_dic = {
|
||||
# list comes from func3 calls on updateFiles.sh
|
||||
"util/GridHandle.h": "GridHandle.h",
|
||||
"util/BuildGrid.h": "tools/GridBuilder.h",
|
||||
"util/GridBuilder.h": "tools/GridBuilder.h",
|
||||
"util/IO.h": "io/IO.h",
|
||||
"util/CSampleFromVoxels.h": "math/CSampleFromVoxels.h",
|
||||
"util/DitherLUT.h": "math/DitherLUT.h",
|
||||
"util/HDDA.h": "math/HDDA.h",
|
||||
"util/Ray.h": "math/Ray.h",
|
||||
"util/SampleFromVoxels.h": "math/SampleFromVoxels.h",
|
||||
"util/Stencils.h": "nanovdb/math/Stencils.h",
|
||||
"util/CreateNanoGrid.h": "tools/CreateNanoGrid.h",
|
||||
"util/Primitives.h": "tools/CreatePrimitives.h",
|
||||
"util/GridChecksum.h": "tools/GridChecksum.h",
|
||||
"util/GridStats.h": "tools/GridStats.h",
|
||||
"util/GridChecksum.h": "tools/GridChecksum.h",
|
||||
"util/GridValidator.h": "tools/GridValidator.h",
|
||||
"util/NanoToOpenVDB.h": "tools/NanoToOpenVDB.h",
|
||||
"util/cuda/CudaGridChecksum.cuh": "tools/cuda/CudaGridChecksum.cuh",
|
||||
"util/cuda/CudaGridStats.cuh": "tools/cuda/CudaGridStats.cuh",
|
||||
"util/cuda/CudaGridValidator.cuh": "tools/cuda/CudaGridValidator.cuh",
|
||||
"util/cuda/CudaIndexToGrid.cuh": "tools/cuda/CudaIndexToGrid.cuh",
|
||||
"util/cuda/CudaPointsToGrid.cuh": "tools/cuda/PointsToGrid.cuh",
|
||||
"util/cuda/CudaSignedFloodFill.cuh": "tools/cuda/CudaSignedFloodFill.cuh",
|
||||
"util/cuda/CudaDeviceBuffer.h": "cuda/DeviceBuffer.h",
|
||||
"util/cuda/CudaGridHandle.cuh": "cuda/GridHandle.cuh",
|
||||
"util/cuda/CudaUtils.h": "util/cuda/Util.h",
|
||||
"util/cuda/GpuTimer.h": "util/cuda/Timer.h",
|
||||
}
|
||||
|
||||
# Iterate over files in the directory and its subdirectories
|
||||
for root, dirs, files in os.walk(dir_path):
|
||||
for file in files:
|
||||
if any(file.endswith(ext) for ext in file_extensions):
|
||||
file_path = os.path.join(root, file)
|
||||
print(f"Processing file: {file_path}")
|
||||
|
||||
content = open_file(file_path)
|
||||
|
||||
# Correspond to func1 $file in updateFiles.sh
|
||||
for key, vals in nspace_dic.items():
|
||||
for val in vals:
|
||||
old_word = "nanovdb::" + val
|
||||
new_word = "nanovdb::" + key + "::" + val
|
||||
content = content.replace(old_word, new_word)
|
||||
|
||||
# Correspond to func4 and func2 in updateFiles.sh
|
||||
for key, val in rename_dic.items():
|
||||
content = content.replace(key, val)
|
||||
|
||||
# Correspond to func3 in updateFiles.sh
|
||||
for key, val in movdir_dic.items():
|
||||
old_path = "<nanovdb/" + key + ">"
|
||||
new_path = "<nanovdb/" + val + ">"
|
||||
content = content.replace(old_path, new_path)
|
||||
|
||||
write_file(file_path, content)
|
||||
|
||||
# Example use:
|
||||
# To update all the files using NanoVDB in the current directory (and directories downstream):
|
||||
# python ./nanovdb/nanovdb/cmd/updateFiles.py
|
||||
# To update all the files using NanoVDB in a directory called foo (and directories downstream):
|
||||
# python ./nanovdb/nanovdb/cmd/updateFiles.py -d /path/to/foo
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Synthetic Data Generation for USD")
|
||||
parser.add_argument(
|
||||
"-d",
|
||||
"--directory",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Path to directory containing .h, .cc, and .cu files using NanoVDB.",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
dir_path = os.getcwd() if args.directory is None else Path(args.directory).resolve()
|
||||
|
||||
update_files(dir_path)
|
||||
Executable
+101
@@ -0,0 +1,101 @@
|
||||
#!/bin/bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#Usage process all files in this directory or optionally specify a target directory
|
||||
|
||||
# Define directory in which to find files
|
||||
dir="."
|
||||
if [ "$1" ]; then
|
||||
dir="$1"
|
||||
fi
|
||||
|
||||
# Check if dir is not a directory
|
||||
if [ ! -d "$dir" ]; then
|
||||
echo -e "\nUsage: '$0 <directory>'\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# E.g.: func1 $file "math" "Coord" "Vec3" "Vec4"
|
||||
func1 () {
|
||||
for ((i=3; i<=$#; i++)); do
|
||||
arg="s/nanovdb::${!i}/nanovdb::$2::${!i}/g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
done
|
||||
}
|
||||
|
||||
# E.G.: func2 file namespace old new : nanovdb::old -> nanovdb::namespace::new in file
|
||||
func2 () {
|
||||
arg="s/nanovdb::$3/nanovdb::$2::$4/g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
}
|
||||
|
||||
# E.G.: func3 file path1/old.h path2/new.h <nanovdb/path1/old.h> -> <nanovdb/path2/new.h> in file
|
||||
func3 () {
|
||||
arg="s;<nanovdb/$2>;<nanovdb/$3>;g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
}
|
||||
|
||||
# E.g.: func4 file old new new -> old
|
||||
func4 () {
|
||||
arg="s;$2;$3;g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
}
|
||||
|
||||
# Loop through files in the target directory
|
||||
for file in $(find "$dir" -name '*.h' -or -name '*.cuh' -or -name '*.cc' -or -name '*.cu' -or -name '*.cpp'); do
|
||||
if [ -f "$file" ]; then
|
||||
echo "Processing file: $file"
|
||||
func1 $file math Ray "DDA<" HDDA "Vec3<" "Vec4<" "BBox<" ZeroCrossing TreeMarcher PointTreeMarcher\
|
||||
"BoxStencil<" "CurvatureStencil<" "GradStencil<" "WenoStencil<" AlignUp Min Max Abs Clamp\
|
||||
Sqrt Sign "Maximum<" "Delta<" "RoundDown<" "pi<" "isApproxZero<" "Round<" createSampler "SampleFromVoxels<"
|
||||
func1 $file tools createNanoGrid StatsMode createLevelSetSphere\
|
||||
createFogVolumeSphere createFogVolumeSphere createFogVolumeSphere\
|
||||
createFogVolumeTorus createLevelSetBox CreateNanoGrid updateGridStats\
|
||||
evalChecksum validateChecksum checkGrid Extrema
|
||||
func1 $file util is_floating_point findLowestOn findHighestOn Range streq strcpy strcat "empty("\
|
||||
Split invoke forEach reduce prefixSum is_same is_specialization PtrAdd PtrDiff
|
||||
func4 $file "nanovdb::build::" "nanovdb::tools::build::"
|
||||
func4 $file "nanovdb::BBoxR" "nanovdb::Vec3dBBox"
|
||||
func4 $file "nanovdb::BBox<nanovdb::Vec3d>" "nanovdb::Vec3dBbox"
|
||||
func2 $file cuda cudaCreateNodeManager createNodeManager
|
||||
func2 $file cuda cudaVoxelsToGrid voxelsToGrid
|
||||
func2 $file cuda cudaPointsToGrid pointsToGrid
|
||||
func2 $file math DitherLUT DitherLUT
|
||||
func2 $file math PackedRGBA8 Rgba8
|
||||
func2 $file math Rgba8 Rgba8
|
||||
func2 $file util CpuTimer Timer
|
||||
func2 $file util GpuTimer "cuda::Timer"
|
||||
func2 $file util CountOn countOn
|
||||
func3 $file "util/GridHandle.h" "GridHandle.h"
|
||||
func3 $file "util/BuildGrid.h" "tools/GridBuilder.h"
|
||||
func3 $file "util/GridBuilder.h" "tools/GridBuilder.h"
|
||||
func3 $file "util/IO.h" "io/IO.h"
|
||||
func3 $file "util/CSampleFromVoxels.h" "math/CSampleFromVoxels.h"
|
||||
func3 $file "util/DitherLUT.h" "math/DitherLUT.h"
|
||||
func3 $file "util/HDDA.h" "math/HDDA.h"
|
||||
func3 $file "util/Ray.h" "math/Ray.h"
|
||||
func3 $file "util/SampleFromVoxels.h" "math/SampleFromVoxels.h"
|
||||
func3 $file "util/Stencils.h" "nanovdb/math/Stencils.h"
|
||||
func3 $file "util/CreateNanoGrid.h" "tools/CreateNanoGrid.h"
|
||||
func3 $file "util/Primitives.h" "tools/CreatePrimitives.h"
|
||||
func3 $file "util/GridChecksum.h" "tools/GridChecksum.h"
|
||||
func3 $file "util/GridStats.h" "tools/GridStats.h"
|
||||
func3 $file "util/GridChecksum.h" "tools/GridChecksum.h"
|
||||
func3 $file "util/GridValidator.h" "tools/GridValidator.h"
|
||||
func3 $file "util/NanoToOpenVDB.h" "tools/NanoToOpenVDB.h"
|
||||
func3 $file "util/cuda/CudaGridChecksum.cuh" "tools/cuda/CudaGridChecksum.cuh"
|
||||
func3 $file "util/cuda/CudaGridStats.cuh" "tools/cuda/CudaGridStats.cuh"
|
||||
func3 $file "util/cuda/CudaGridValidator.cuh" "tools/cuda/CudaGridValidator.cuh"
|
||||
func3 $file "util/cuda/CudaIndexToGrid.cuh" "tools/cuda/CudaIndexToGrid.cuh"
|
||||
func3 $file "util/cuda/CudaPointsToGrid.cuh" "tools/cuda/PointsToGrid.cuh"
|
||||
func3 $file "util/cuda/CudaSignedFloodFill.cuh" "tools/cuda/CudaSignedFloodFill.cuh"
|
||||
func3 $file "util/cuda/CudaDeviceBuffer.h" "cuda/DeviceBuffer.h"
|
||||
func3 $file "util/cuda/CudaGridHandle.cuh" "cuda/GridHandle.cuh"
|
||||
func3 $file "util/cuda/CudaUtils.h" "util/cuda/Util.h"
|
||||
func3 $file "util/cuda/GpuTimer.h" "util/cuda/Timer.h"
|
||||
fi
|
||||
done
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb_validate.cc
|
||||
@@ -11,8 +11,8 @@
|
||||
\brief Command-line tool that validates Grids in nanovdb files
|
||||
*/
|
||||
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/util/GridValidator.h>
|
||||
#include <nanovdb/io/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/tools/GridValidator.h>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
@@ -23,6 +23,7 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
<< "Options:\n"
|
||||
<< "-g,--grid name\tOnly validate grids matching the specified string name\n"
|
||||
<< "-h,--help\tPrints this message\n"
|
||||
<< "-p,--partial\tPerform partial (i.e. fast) validation tests\n"
|
||||
<< "-v,--verbose\tPrint verbose information information useful for debugging\n"
|
||||
<< "--version\tPrint version information to the terminal\n";
|
||||
exit(exitStatus);
|
||||
@@ -30,17 +31,18 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
|
||||
void version [[noreturn]] (const char* progName, int exitStatus = EXIT_SUCCESS)
|
||||
{
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, nanovdb::Version().c_str());
|
||||
char str[8];
|
||||
nanovdb::toStr(str, nanovdb::Version());
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, str);
|
||||
exit(exitStatus);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int exitStatus = EXIT_SUCCESS;
|
||||
|
||||
bool verbose = false;
|
||||
bool detailed = true;
|
||||
std::string gridName;
|
||||
int exitStatus = EXIT_SUCCESS;
|
||||
bool verbose = false;
|
||||
nanovdb::CheckMode mode = nanovdb::CheckMode::Full;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
std::string arg = argv[i];
|
||||
@@ -51,6 +53,8 @@ int main(int argc, char* argv[])
|
||||
version(argv[0]);
|
||||
} else if (arg == "-v" || arg == "--verbose") {
|
||||
verbose = true;
|
||||
} else if (arg == "-p" || arg == "--partial") {
|
||||
mode = nanovdb::CheckMode::Partial;
|
||||
} else if (arg == "-g" || arg == "--grid") {
|
||||
if (i + 1 == argc) {
|
||||
std::cerr << "\nExpected a grid name to follow the -g,--grid option\n";
|
||||
@@ -79,62 +83,17 @@ int main(int argc, char* argv[])
|
||||
if (!gridName.empty()) {
|
||||
std::vector<nanovdb::io::FileGridMetaData> tmp;
|
||||
for (auto& m : list) {
|
||||
if (nameKey == m.nameKey && gridName == m.gridName)
|
||||
tmp.emplace_back(m);
|
||||
if (nameKey == m.nameKey && gridName == m.gridName) tmp.emplace_back(m);
|
||||
}
|
||||
list = tmp;
|
||||
}
|
||||
if (list.size() == 0) {
|
||||
continue;
|
||||
list = std::move(tmp);
|
||||
}
|
||||
if (list.size() == 0) continue;
|
||||
|
||||
if (verbose) {
|
||||
std::cout << "\nThe file \"" << file << "\" contains the following matching " << list.size() << " grid(s):\n";
|
||||
}
|
||||
if (verbose) std::cout << "\nThe file \"" << file << "\" contains the following matching " << list.size() << " grid(s):\n";
|
||||
|
||||
for (auto& m : list) {
|
||||
auto handle = nanovdb::io::readGrid(file, m.gridName);
|
||||
auto gridType = handle.gridType();
|
||||
bool test = false;
|
||||
if (gridType == nanovdb::GridType::End) {
|
||||
std::cerr << "GridHandle was empty\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
} else if (auto* grid = handle.grid<float>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Vec3f>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<uint32_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int32_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int16_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int64_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int16_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<double>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Vec3d>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::ValueMask>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Rgba8>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Fp4>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Fp8>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Fp16>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::FpN>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<bool>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else {
|
||||
std::cerr << "Unsupported GridType: \"" << nanovdb::toStr(gridType) << "\"\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
const bool test = nanovdb::tools::validateGrids(handle, mode, verbose);
|
||||
if (verbose) {
|
||||
std::cout << "Grid named \"" << m.gridName << "\": " << (test ? "passed" : "failed") << std::endl;
|
||||
} else if (!test) {
|
||||
|
||||
@@ -0,0 +1,414 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file DeviceBuffer.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date January 8, 2020
|
||||
|
||||
\brief DeviceBuffer has one pinned host buffer and multiple device CUDA buffers
|
||||
|
||||
\note This file has no device-only kernel functions,
|
||||
which explains why it's a .h and not .cuh file.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_DEVICEBUFFER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICEBUFFER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda.h>
|
||||
#include <memory>// for std::shared_ptr
|
||||
#include <nanovdb/HostBuffer.h>// for BufferTraits
|
||||
#include <nanovdb/util/cuda/Util.h>// for cudaMalloc/cudaMallocManaged/cudaFree
|
||||
|
||||
namespace nanovdb {// ================================================================
|
||||
|
||||
namespace cuda {// ===================================================================
|
||||
|
||||
// ----------------------------> DeviceBuffer <--------------------------------------
|
||||
|
||||
/// @brief Simple memory buffer using un-managed pinned host memory when compiled with NVCC.
|
||||
/// Obviously this class is making explicit used of CUDA so replace it with your own memory
|
||||
/// allocator if you are not using CUDA.
|
||||
/// @note While CUDA's pinned host memory allows for asynchronous memory copy between host and device
|
||||
/// it is significantly slower then cached (un-pinned) memory on the host.
|
||||
class DeviceBuffer
|
||||
{
|
||||
uint64_t mSize; // total number of bytes managed by this buffer (assumed to be identical for host and device)
|
||||
void *mCpuData, **mGpuData; // raw pointers to the host and device buffers
|
||||
int mDeviceCount, mManaged;// if mManaged is non-zero this class is responsible for allocating and freeing memory buffers. Otherwise this is assumed to be handled externally
|
||||
|
||||
/// @brief Initialize buffer
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @note All existing buffers are first cleared
|
||||
/// @warning size is expected to be non-zero. Use clear() clear buffer!
|
||||
void init(uint64_t size, int device, cudaStream_t stream);
|
||||
|
||||
public:
|
||||
|
||||
using PtrT = std::shared_ptr<DeviceBuffer>;
|
||||
|
||||
/// @brief Default constructor of an empty buffer
|
||||
DeviceBuffer() : mSize(0), mCpuData(nullptr), mGpuData(nullptr), mDeviceCount(0), mManaged(0){}
|
||||
|
||||
/// @brief Constructor with a specified device and size
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
DeviceBuffer(uint64_t size, int device = cudaCpuDeviceId, cudaStream_t stream = 0) : DeviceBuffer()
|
||||
{
|
||||
this->init(size, device, stream);
|
||||
}
|
||||
|
||||
/// @brief Constructor
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param host If true buffer is initialized only on the host/CPU, else on the current device/GPU
|
||||
/// @param stream optional stream argument (defaults to stream NULL)
|
||||
DeviceBuffer(uint64_t size, bool host, void* stream) : DeviceBuffer()
|
||||
{
|
||||
int device = cudaCpuDeviceId;
|
||||
if (!host) cudaCheck(cudaGetDevice(&device));
|
||||
this->init(size, device, reinterpret_cast<cudaStream_t>(stream));
|
||||
}
|
||||
|
||||
/// @brief Constructor for externally managed host and device buffers
|
||||
/// @param size byte size of the two external buffers
|
||||
/// @param cpuData host buffer, assumed to NOT be NULL
|
||||
/// @param gpuData device buffer, assumed to NOT be NULL;
|
||||
/// @note The device buffer, @c gpuData, will be associated
|
||||
/// with the current device ID given by cudaGetDevice
|
||||
DeviceBuffer(uint64_t size, void* cpuData, void* gpuData)
|
||||
: mSize(size)
|
||||
, mCpuData(cpuData)
|
||||
, mManaged(0)
|
||||
{
|
||||
cudaCheck(cudaGetDeviceCount(&mDeviceCount));
|
||||
mGpuData = new void*[mDeviceCount]();// NULL initialization
|
||||
NANOVDB_ASSERT(cpuData);
|
||||
NANOVDB_ASSERT(gpuData);
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
mGpuData[device] = gpuData;
|
||||
}
|
||||
|
||||
/// @brief Constructor for externally managed host and multiple device buffers
|
||||
/// @param size byte size of the two external buffers
|
||||
/// @param cpuData host buffer, assumed to NOT be NULL
|
||||
/// @param list list of device IDs and external device buffers, all assumed to not be NULL
|
||||
DeviceBuffer(uint64_t size, void* cpuData, std::initializer_list<std::pair<int,void*>> list)
|
||||
: mSize(size)
|
||||
, mCpuData(cpuData)
|
||||
, mManaged(0)
|
||||
{
|
||||
NANOVDB_ASSERT(cpuData);
|
||||
cudaCheck(cudaGetDeviceCount(&mDeviceCount));
|
||||
mGpuData = new void*[mDeviceCount]();// NULL initialization
|
||||
for (auto &p : list) {
|
||||
NANOVDB_ASSERT(p.first>=0 && p.first<mDeviceCount);
|
||||
NANOVDB_ASSERT(p.second);
|
||||
mGpuData[p.first] = p.second;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
DeviceBuffer(const DeviceBuffer&) = delete;
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
DeviceBuffer(DeviceBuffer&& other) noexcept
|
||||
: mSize(other.mSize)
|
||||
, mCpuData(other.mCpuData)
|
||||
, mGpuData(other.mGpuData)
|
||||
, mDeviceCount(other.mDeviceCount)
|
||||
, mManaged(other.mManaged)
|
||||
{
|
||||
other.mCpuData = other.mGpuData = nullptr;
|
||||
other.mSize = other.mDeviceCount = other.mManaged = 0;
|
||||
}
|
||||
|
||||
/// @brief Copy-constructor from a HostBuffer
|
||||
/// @param buffer host buffer from which to copy data
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
DeviceBuffer(const HostBuffer& buffer, int device = cudaCpuDeviceId, cudaStream_t stream = 0)
|
||||
: DeviceBuffer(buffer.size(), device, stream)
|
||||
{
|
||||
if (mCpuData) {
|
||||
cudaCheck(cudaMemcpy(mCpuData, buffer.data(), mSize, cudaMemcpyHostToHost));
|
||||
} else if (mGpuData[device]) {
|
||||
cudaCheck(cudaMemcpyAsync(mGpuData[device], buffer.data(), mSize, cudaMemcpyHostToDevice, stream));
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Destructor frees memory on both the host and device
|
||||
~DeviceBuffer() { this->clear(); };
|
||||
|
||||
/// @brief Static factory method that return an instance of this buffer
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
|
||||
/// @param host If true buffer is initialized only on the host/CPU, else only on the device/GPU
|
||||
/// @param stream optional stream argument (defaults to stream NULL)
|
||||
/// @return An instance of this class using move semantics
|
||||
static DeviceBuffer create(uint64_t size, const DeviceBuffer* dummy, bool host, void* stream){return DeviceBuffer(size, host, stream);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
static DeviceBuffer create(uint64_t size, const DeviceBuffer* dummy = nullptr, int device = cudaCpuDeviceId, cudaStream_t stream = 0){return DeviceBuffer(size, device, stream);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer that wraps externally managed memory
|
||||
/// @param size byte size of buffer specified by external memory
|
||||
/// @param cpuData pointer to externally managed host memory
|
||||
/// @param gpuData pointer to externally managed device memory
|
||||
/// @return An instance of this class using move semantics
|
||||
static DeviceBuffer create(uint64_t size, void* cpuData, void* gpuData) {return DeviceBuffer(size, cpuData, gpuData);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer that wraps externally managed host and device memory
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param cpuData pointer to externally managed host memory
|
||||
/// @param list list of device IDs and device memory pointers
|
||||
static DeviceBuffer create(uint64_t size, void* cpuData, std::initializer_list<std::pair<int,void*>> list) {return DeviceBuffer(size, cpuData, list);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer constructed from a HostBuffer
|
||||
/// @param buffer host buffer from which to copy data
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
static DeviceBuffer create(const HostBuffer& buffer, int device = cudaCpuDeviceId, cudaStream_t stream = 0) {return DeviceBuffer(buffer, device, stream);}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @{
|
||||
/// @brief Factory methods that create a shared pointer to an DeviceBuffer instance
|
||||
static PtrT createPtr(uint64_t size, const DeviceBuffer* = nullptr, int device = cudaCpuDeviceId, cudaStream_t stream = 0) {return std::make_shared<DeviceBuffer>(size, device, stream);}
|
||||
static PtrT createPtr(uint64_t size, void* cpuData, void* gpuData) {return std::make_shared<DeviceBuffer>(size, cpuData, gpuData);}
|
||||
static PtrT createPtr(uint64_t size, void* cpuData, std::initializer_list<std::pair<int,void*>> list) {return std::make_shared<DeviceBuffer>(size, cpuData, list);}
|
||||
static PtrT createPtr(const HostBuffer& buffer, int device = cudaCpuDeviceId, cudaStream_t stream = 0) {return std::make_shared<DeviceBuffer>(buffer, device, stream);}
|
||||
/// @}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
DeviceBuffer& operator=(const DeviceBuffer&) = delete;
|
||||
|
||||
/// @brief Move copy assignment operation
|
||||
DeviceBuffer& operator=(DeviceBuffer&& other) noexcept;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Retuns a raw void pointer to the host/CPU buffer managed by this allocator.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* data() const { return mCpuData; }
|
||||
|
||||
/// @brief Returns an offset pointer of a specific type from the allocated host memory
|
||||
/// @tparam T Type of the pointer returned
|
||||
/// @param count Numbers of elements of @c parameter type T to skip
|
||||
/// @warning might return NULL
|
||||
template <typename T>
|
||||
T* data(ptrdiff_t count = 0, int device = cudaCpuDeviceId) const
|
||||
{
|
||||
NANOVDB_ASSERT(device >= cudaCpuDeviceId && device < mDeviceCount);
|
||||
void *ptr = device == cudaCpuDeviceId ? mCpuData : mGpuData[device];
|
||||
return ptr ? reinterpret_cast<T*>(ptr) + count : nullptr;
|
||||
}
|
||||
|
||||
/// @brief Returns a byte offset void pointer from the allocated host memory
|
||||
/// @param byteOffset offset of return pointer in units of bytes
|
||||
/// @warning assumes that this instance is not empty!
|
||||
void* data(ptrdiff_t byteOffset, int device = cudaCpuDeviceId) const
|
||||
{
|
||||
NANOVDB_ASSERT(device >= cudaCpuDeviceId && device < mDeviceCount);
|
||||
void *ptr = device == cudaCpuDeviceId ? mCpuData : mGpuData[device];
|
||||
return ptr ? reinterpret_cast<char*>(ptr) + byteOffset : nullptr;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Retuns a raw pointer to the specified device/GPU buffer managed by this allocator.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* deviceData(int device) const {
|
||||
NANOVDB_ASSERT(device >= 0 && device < mDeviceCount);
|
||||
return mGpuData[device];
|
||||
}
|
||||
|
||||
/// @brief Retuns a raw pointer to the current device/GPU buffer managed by this allocator.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* deviceData() const {
|
||||
int device = cudaCpuDeviceId;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
return this->deviceData(device);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Uploads buffer on the host to a specific device. If it doesn't exist it's created first.
|
||||
/// @param device Device ID that the data is copied to
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous.
|
||||
/// @warning Assumes that the host buffer already exists!
|
||||
/// @note determine the current device with cudaGetDevice
|
||||
void deviceUpload(int device = 0, cudaStream_t stream = 0, bool sync = true);
|
||||
void deviceUpload(int device, void* stream, bool sync){this->deviceUpload(device, cudaStream_t(stream), sync);}
|
||||
|
||||
/// @brief Upload buffer from the host to ALL the existing devices, i.e. CPU -> GPU.
|
||||
/// If no device buffers exist one is created for the current device (typically 0)
|
||||
/// and subsequently populated with the host data.
|
||||
/// @param stream CUDA stream.
|
||||
/// @param sync if false the memory copy is asynchronous.
|
||||
/// @warning Assumes that the host buffer already exists!
|
||||
void deviceUpload(cudaStream_t stream, bool sync);
|
||||
void deviceUpload(void* stream, bool sync) {this->deviceUpload(cudaStream_t(stream), sync);}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Download data from a specified device to the host. If the host buffer des not exist it will first be allocated
|
||||
/// @param device device ID to download source data from
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous.
|
||||
/// @warning Assumes that the specifed device buffer already exists!
|
||||
void deviceDownload(int device = 0, cudaStream_t stream = 0, bool sync = true);
|
||||
void deviceDownload(int device, void* stream , bool sync) {this->deviceDownload(device, cudaStream_t(stream), sync);}
|
||||
|
||||
/// @brief Download the buffer from the current device to the host, i.e. GPU -> CPU.
|
||||
/// If the host buffer des not exist it will first be allocated
|
||||
/// @param stream CUDA stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
/// @note If the host/CPU buffer does not exist it is first allocated
|
||||
/// @warning Assumes that the device/GPU buffer already exists
|
||||
void deviceDownload(void* stream, bool sync);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Returns the size in bytes of the raw memory buffer managed by this allocator.
|
||||
uint64_t size() const { return mSize; }
|
||||
uint64_t capacity() const {return this->size();}
|
||||
|
||||
/// @brief Returns the number of buffers that are not NULL
|
||||
int bufferCount() const {
|
||||
int count = mCpuData ? 1 : 0;
|
||||
for (int i=0; i<mDeviceCount; ++i) if (mGpuData[i]) ++count;
|
||||
return count;
|
||||
}
|
||||
|
||||
int deviceCount() const {return mDeviceCount;}
|
||||
|
||||
/// @{
|
||||
/// @brief Returns true if this allocator is empty, i.e. has no allocated memory
|
||||
bool empty() const { return mSize == 0; }
|
||||
bool isEmpty() const { return this->empty(); }
|
||||
/// @}
|
||||
|
||||
/// @brief De-allocate all memory managed by this allocator and set all pointers to NULL
|
||||
void clear(cudaStream_t stream = 0);
|
||||
void clear(void* stream){this->clear(cudaStream_t(stream));}
|
||||
|
||||
}; // DeviceBuffer class
|
||||
|
||||
// --------------------------> Implementations below <------------------------------------
|
||||
|
||||
inline DeviceBuffer& DeviceBuffer::operator=(DeviceBuffer&& other) noexcept
|
||||
{
|
||||
if (mManaged) {// first free all the managed data buffers
|
||||
cudaCheck(cudaFreeHost(mCpuData));
|
||||
for (int i=0; i<mDeviceCount; ++i) cudaCheck(util::cuda::freeAsync(mGpuData[i], 0));
|
||||
}
|
||||
delete [] mGpuData;
|
||||
mSize = other.mSize;
|
||||
mCpuData = other.mCpuData;
|
||||
mGpuData = other.mGpuData;
|
||||
mDeviceCount = other.mDeviceCount;
|
||||
mManaged = other.mManaged;
|
||||
other.mCpuData = nullptr;
|
||||
other.mGpuData = nullptr;
|
||||
other.mSize = 0;
|
||||
other.mDeviceCount = 0;
|
||||
other.mManaged = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline void DeviceBuffer::init(uint64_t size, int device, cudaStream_t stream)
|
||||
{
|
||||
if (size==0) return;
|
||||
cudaCheck(cudaGetDeviceCount(&mDeviceCount));
|
||||
mGpuData = new void*[mDeviceCount]();// NULL initialization
|
||||
NANOVDB_ASSERT(device >= cudaCpuDeviceId && device < mDeviceCount);
|
||||
if (device == cudaCpuDeviceId) {
|
||||
cudaCheck(cudaMallocHost((void**)&mCpuData, size)); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
|
||||
checkPtr(mCpuData, "cuda::DeviceBuffer::init: failed to allocate host buffer");
|
||||
} else {
|
||||
cudaCheck(util::cuda::mallocAsync(mGpuData+device, size, stream)); // un-managed memory on the device, always 32B aligned!
|
||||
checkPtr(mGpuData[device], "cuda::DeviceBuffer::init: failed to allocate device buffer");
|
||||
}
|
||||
mSize = size;
|
||||
mManaged = 1;// i.e. this instance is responsible for allocating and delete memory
|
||||
} // DeviceBuffer::init
|
||||
|
||||
inline void DeviceBuffer::deviceUpload(int device, cudaStream_t stream, bool sync)
|
||||
{
|
||||
NANOVDB_ASSERT(device >= 0 && device < mDeviceCount);// should be device and not the host
|
||||
checkPtr(mCpuData, "uninitialized cpu source data");
|
||||
if (mGpuData[device] == nullptr) {
|
||||
if (mManaged==0) throw std::runtime_error("DeviceBuffer::deviceUpload called on externally managed memory that wasn\'t allocated.");
|
||||
cudaCheck(util::cuda::mallocAsync(mGpuData+device, mSize, stream)); // un-managed memory on the device, always 32B aligned!
|
||||
}
|
||||
checkPtr(mGpuData[device], "uninitialized gpu destination data");
|
||||
cudaCheck(cudaMemcpyAsync(mGpuData[device], mCpuData, mSize, cudaMemcpyHostToDevice, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
} // DeviceBuffer::deviceUpload
|
||||
|
||||
inline void DeviceBuffer::deviceUpload(cudaStream_t stream, bool sync)
|
||||
{
|
||||
int device = 0;
|
||||
cudaGetDevice(&device);
|
||||
this->deviceUpload(device, stream, sync);
|
||||
} // DeviceBuffer::deviceUpload
|
||||
|
||||
inline void DeviceBuffer::deviceDownload(int device, cudaStream_t stream, bool sync)
|
||||
{
|
||||
NANOVDB_ASSERT(device >= 0 && device < mDeviceCount);
|
||||
checkPtr(mGpuData[device], "uninitialized gpu source data");// no source data on the specified device
|
||||
if (mCpuData == nullptr) {
|
||||
if (mManaged==0) throw std::runtime_error("DeviceBuffer::deviceDownload called on uninitialized cpu destination memory that is externally managed.");
|
||||
cudaCheck(cudaMallocHost((void**)&mCpuData, mSize)); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
|
||||
}
|
||||
checkPtr(mCpuData, "uninitialized cpu destination data");
|
||||
cudaCheck(cudaMemcpyAsync(mCpuData, mGpuData[device], mSize, cudaMemcpyDeviceToHost, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
} // DeviceBuffer::deviceDownload
|
||||
|
||||
inline void DeviceBuffer::deviceDownload(void* stream, bool sync)
|
||||
{
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
this->deviceDownload(device, cudaStream_t(stream), sync);
|
||||
} // DeviceBuffer::deviceDownload
|
||||
|
||||
inline void DeviceBuffer::clear(cudaStream_t stream)
|
||||
{
|
||||
if (mManaged) {// free all the managed data buffers
|
||||
cudaCheck(cudaFreeHost(mCpuData));
|
||||
for (int i=0; i<mDeviceCount; ++i) cudaCheck(util::cuda::freeAsync(mGpuData[i], stream));
|
||||
}
|
||||
delete [] mGpuData;
|
||||
mCpuData = nullptr;
|
||||
mGpuData = nullptr;
|
||||
mSize = 0;
|
||||
mDeviceCount = 0;
|
||||
mManaged = 0;
|
||||
} // DeviceBuffer::clear
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
using CudaDeviceBuffer [[deprecated("Use nanovdb::cuda::DeviceBuffer instead")]] = cuda::DeviceBuffer;
|
||||
|
||||
template<>
|
||||
struct BufferTraits<cuda::DeviceBuffer>
|
||||
{
|
||||
static constexpr bool hasDeviceDual = true;
|
||||
};
|
||||
|
||||
}// namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICEBUFFER_H_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,229 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file DeviceMesh.h
|
||||
|
||||
\brief nanovdb::cuda::DeviceMesh encapsulates device IDs, CUDA streams,
|
||||
and NCCL communicators in order to facilitate multi-GPU applications.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_DEVICEMESH_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICEMESH_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <thread>
|
||||
|
||||
#include <nanovdb/util/cuda/Util.h>
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
#include <nccl.h>
|
||||
#endif
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
namespace detail {
|
||||
|
||||
/// @brief RAII class that caches/restores the current device at construction/destruction
|
||||
class DeviceGuard {
|
||||
public:
|
||||
DeviceGuard() { cudaGetDevice(&deviceId); }
|
||||
~DeviceGuard() { cudaSetDevice(deviceId); }
|
||||
|
||||
/// @{
|
||||
/// @brief DeviceGuard is not copyable nor movable
|
||||
DeviceGuard(const DeviceGuard&) = delete;
|
||||
DeviceGuard& operator=(const DeviceGuard&) = delete;
|
||||
DeviceGuard(DeviceGuard&& other) = delete;
|
||||
DeviceGuard& operator=(DeviceGuard&& other) = delete;
|
||||
/// @}
|
||||
private:
|
||||
int deviceId = -1;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
/// @brief POD struct representing a device id and a stream on that device
|
||||
struct DeviceNode
|
||||
{
|
||||
int id = -1;
|
||||
cudaStream_t stream = cudaStream_t(0);
|
||||
};
|
||||
|
||||
/// @brief This class wraps a vector of per-device IDs and CUDA streams and holds inter-device connectivity information and NCCL comms.
|
||||
class DeviceMesh
|
||||
{
|
||||
using DeviceVecT = std::vector<DeviceNode>;
|
||||
using const_iterator = DeviceVecT::const_iterator;
|
||||
using size_type = DeviceVecT::size_type;
|
||||
public:
|
||||
/// @brief Constructs a device mesh for all devices on the host and initializes a CUDA stream (and NCCL communicator) for each device
|
||||
DeviceMesh();
|
||||
/// @brief Destroys the per-device CUDA stream and finalizes and destroys the per-device NCCL communicators
|
||||
~DeviceMesh();
|
||||
/// @brief Disallow copy-construction
|
||||
DeviceMesh(const DeviceMesh&) = delete;
|
||||
/// @brief Move constructor. Underlying CUDA streams and NCCL communicators are not reinitialized.
|
||||
/// @param DeviceMesh instance that will be moved into this DeviceMesh.
|
||||
DeviceMesh(DeviceMesh&&) noexcept;
|
||||
/// @brief Disallow copy-assignment
|
||||
DeviceMesh& operator=(const DeviceMesh&) = delete;
|
||||
/// @brief Move assignment. Underlying CUDA streams and NCCL communicators are not reinitialized.
|
||||
/// @param DeviceMesh instance that will be moved into this DeviceMesh.
|
||||
DeviceMesh& operator=(DeviceMesh&&) noexcept;
|
||||
|
||||
/// @brief Returns the number of devices
|
||||
size_type deviceCount() const { return mDeviceNodes.size(); };
|
||||
|
||||
/// @brief Returns a const reference to the DeviceNode for a particular device
|
||||
const DeviceNode& operator [](int deviceId) const { return mDeviceNodes[deviceId]; }
|
||||
|
||||
/// @brief Returns an iterator to the first device node
|
||||
const_iterator begin() const { return mDeviceNodes.begin(); };
|
||||
/// @brief Returns an iterator past the last device node
|
||||
const_iterator end() const { return mDeviceNodes.end(); };
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
/// @brief Returns the NCCL communicator for a particular device
|
||||
ncclComm_t comm(int deviceId) const { return mComms[deviceId]; }
|
||||
#endif
|
||||
|
||||
/// @brief Returns whether or not peer to peer access is supported between two devices.
|
||||
bool canAccessPeer(int deviceId, int peerId) const { return mConnectivity[deviceId][peerId] & (1 << cudaDevP2PAttrAccessSupported); }
|
||||
|
||||
private:
|
||||
/// @brief Returns whether or not a device supports managed memory
|
||||
bool hasManagedMemory(int deviceId) const {
|
||||
int managedMemoryValue = 0;
|
||||
cudaDeviceGetAttribute(&managedMemoryValue, cudaDevAttrManagedMemory, deviceId);
|
||||
return static_cast<bool>(managedMemoryValue);
|
||||
}
|
||||
|
||||
DeviceVecT mDeviceNodes;
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
std::vector<ncclComm_t> mComms;
|
||||
#endif
|
||||
std::vector<std::vector<uint32_t>> mConnectivity;
|
||||
};
|
||||
|
||||
inline DeviceMesh::DeviceMesh()
|
||||
{
|
||||
detail::DeviceGuard deviceGuard;
|
||||
|
||||
int deviceCount = -1;
|
||||
cudaGetDeviceCount(&deviceCount);
|
||||
|
||||
for (int deviceId = 0; deviceId < deviceCount; ++deviceId) {
|
||||
NANOVDB_ASSERT(hasManagedMemory(deviceId));
|
||||
cudaSetDevice(deviceId);
|
||||
cudaStream_t stream;
|
||||
cudaStreamCreate(&stream);
|
||||
mDeviceNodes.push_back({deviceId, stream});
|
||||
}
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
mComms.resize(deviceCount);
|
||||
ncclCommInitAll(mComms.data(), deviceCount, nullptr);
|
||||
#endif
|
||||
|
||||
mConnectivity.resize(deviceCount);
|
||||
for (const auto& deviceNode : mDeviceNodes) {
|
||||
mConnectivity[deviceNode.id].resize(deviceCount);
|
||||
for (const auto& peerNode : mDeviceNodes) {
|
||||
mConnectivity[deviceNode.id][peerNode.id] = 0;
|
||||
if (deviceNode.id != peerNode.id) {
|
||||
int peerAccessSupportedValue = 0;
|
||||
cudaDeviceGetP2PAttribute(&peerAccessSupportedValue, cudaDevP2PAttrAccessSupported, deviceNode.id, peerNode.id);
|
||||
if (peerAccessSupportedValue) {
|
||||
mConnectivity[deviceNode.id][peerNode.id] |= (1 << cudaDevP2PAttrAccessSupported);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline DeviceMesh::DeviceMesh(DeviceMesh&& other) noexcept
|
||||
: mDeviceNodes(std::move(other.mDeviceNodes)),
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
mComms(std::move(other.mComms)),
|
||||
#endif
|
||||
mConnectivity(std::move(other.mConnectivity))
|
||||
{
|
||||
}
|
||||
|
||||
inline DeviceMesh::~DeviceMesh()
|
||||
{
|
||||
detail::DeviceGuard deviceGuard;
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
std::for_each(mComms.begin(), mComms.end(), [](ncclComm_t comm) {
|
||||
ncclCommFinalize(comm);
|
||||
ncclCommDestroy(comm);
|
||||
});
|
||||
#endif
|
||||
|
||||
std::for_each(mDeviceNodes.begin(), mDeviceNodes.end(), [](DeviceNode& deviceNode) {
|
||||
cudaSetDevice(deviceNode.id);
|
||||
cudaStreamDestroy(deviceNode.stream);
|
||||
});
|
||||
}
|
||||
|
||||
inline DeviceMesh& DeviceMesh::operator=(DeviceMesh&& other) noexcept
|
||||
{
|
||||
mDeviceNodes = std::move(other.mDeviceNodes);
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
mComms = std::move(other.mComms);
|
||||
#endif
|
||||
mConnectivity = std::move(other.mConnectivity);
|
||||
return *this;
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
inline void* queryAllocationGranularityEntryPoint()
|
||||
{
|
||||
void* entryPoint = nullptr;
|
||||
#if CUDART_VERSION >= 12500 // cudaGetDriverEntryPointByVersion was added in CUDA 12.5 with cudaGetDriverEntryPoint being potentially deprecated
|
||||
cudaDriverEntryPointQueryResult queryResult = cudaDriverEntryPointSymbolNotFound;
|
||||
cudaCheck(cudaGetDriverEntryPointByVersion("cuMemGetAllocationGranularity", &entryPoint, 12000, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#elif CUDART_VERSION >= 12000 // queryResult argument was added in CUDA 12
|
||||
cudaDriverEntryPointQueryResult queryResult = cudaDriverEntryPointSymbolNotFound;
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#else
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault));
|
||||
#endif
|
||||
return entryPoint;
|
||||
}// queryAllocationGranularityEntryPoint
|
||||
|
||||
}
|
||||
|
||||
/// @brief Returns the minimum page size (in bytes) across all devices on the system
|
||||
inline size_t minDevicePageSize(const DeviceMesh& mesh)
|
||||
{
|
||||
using FuncT = CUresult(size_t*, const CUmemAllocationProp*, CUmemAllocationGranularity_flags);
|
||||
static FuncT* functPtr = reinterpret_cast<FuncT*>(detail::queryAllocationGranularityEntryPoint());
|
||||
|
||||
NANOVDB_ASSERT(functPtr);
|
||||
CUmemAllocationProp prop = {};
|
||||
prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
|
||||
prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
|
||||
size_t minGranularity = 0;
|
||||
for (const auto& node : mesh) {
|
||||
prop.location.id = node.id;
|
||||
size_t granularity = 0;
|
||||
(*functPtr)(&granularity, &prop, CU_MEM_ALLOC_GRANULARITY_MINIMUM);
|
||||
if (minGranularity < granularity) minGranularity = granularity;
|
||||
}
|
||||
return minGranularity;
|
||||
}// minDevicePageSize
|
||||
|
||||
} // namespace cuda
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICEMESH_H_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,35 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
#ifndef NANOVDB_CUDA_DEVICERESOURCE_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICERESOURCE_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda_runtime_api.h>
|
||||
#include <nanovdb/util/cuda/Util.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
class DeviceResource
|
||||
{
|
||||
public:
|
||||
// cudaMalloc aligns memory to 256 bytes by default
|
||||
static constexpr size_t DEFAULT_ALIGNMENT = 256;
|
||||
|
||||
static void* allocateAsync(size_t bytes, size_t, cudaStream_t stream) {
|
||||
void* p = nullptr;
|
||||
cudaCheck(util::cuda::mallocAsync(&p, bytes, stream));
|
||||
return p;
|
||||
}
|
||||
|
||||
static void deallocateAsync(void *p, size_t, size_t, cudaStream_t stream) {
|
||||
cudaCheck(util::cuda::freeAsync(p, stream));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
} // namespace nanovdb::cuda
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICERESOURCE_H_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,124 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file DeviceStreamMap.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date October 15, 2024
|
||||
|
||||
\brief nanovdb::cuda::DeviceStreamMap maps device IDs to CUDA streams,
|
||||
which is useful for multi-GPU applications.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_DEVICESTREAMMAP_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICESTREAMMAP_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda.h>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <nanovdb/util/cuda/Util.h>// for cudaCheck, deviceCount etc
|
||||
|
||||
namespace nanovdb {// ================================================================
|
||||
|
||||
namespace cuda {// ===================================================================
|
||||
|
||||
/// @brief map from a device ID to an associated cuda stream. Useful for multi-GPU applications.
|
||||
class DeviceStreamMap : public std::map<int, cudaStream_t>
|
||||
{
|
||||
using FuncT = CUresult(size_t*, const CUmemAllocationProp*, CUmemAllocationGranularity_flags);
|
||||
FuncT *mFunctPtr;
|
||||
|
||||
public:
|
||||
|
||||
enum DeviceType { Any = 0, PeerToPeer = 1, Unified = 3 };
|
||||
|
||||
/// @brief Initiates a map between CUDA device IDs and corresponding streams that satisfy certain constraints.
|
||||
/// All devices should be able to access memory on all the other devices!
|
||||
/// @param t Type of device to include in map. Any means all available devices, PeerToPeer means only devices that
|
||||
/// access all another devices are included, and Unified means all devices support unified memory, concurrent access,
|
||||
/// and can be access by all other devices.
|
||||
/// @param exclude optional list of device IDs to exclude from the map
|
||||
/// @param verbose 0 means quiet, 1 means print if a device is ignores and 2 means print is a device is included
|
||||
DeviceStreamMap(DeviceType t = DeviceType::Unified, std::vector<int> exclude = {}, int verbose = 0);
|
||||
|
||||
/// @brief Destructor
|
||||
~DeviceStreamMap();
|
||||
|
||||
/// @brief returns the minimum page size of all the devices in this map
|
||||
size_t getMinPageSize() const;
|
||||
|
||||
/// @brief Print information about all the devices included in this map
|
||||
void printDevInfo(std::FILE* file = stdout) const {for (auto &p : *this) util::cuda::printDevInfo(p.first, nullptr, file);}
|
||||
|
||||
/// @brief Returns the number of device associated with this map
|
||||
int deviceCount() const {return this->size();}
|
||||
|
||||
};// DeviceStreamMap
|
||||
|
||||
DeviceStreamMap::DeviceStreamMap(DeviceType t, std::vector<int> exclude, int verbose)
|
||||
{
|
||||
std::initializer_list<cudaDeviceAttr> filter = {cudaDevAttrUnifiedAddressing, cudaDevAttrConcurrentManagedAccess};
|
||||
const int devCount = util::cuda::deviceCount(), current = util::cuda::currentDevice();
|
||||
for (int dev = 0; dev < devCount; ++dev) {
|
||||
int check = 1;
|
||||
for (auto it=exclude.begin(); check && it!=exclude.end(); ++it) if (dev == *it) check = 0;
|
||||
for (auto it=filter.begin(); (t&2) && check && it!=filter.end(); ++it) cudaCheck(cudaDeviceGetAttribute( &check, *it, dev));
|
||||
for (auto it= this->begin(); (t&1) && check && it!= this->end(); ++it) cudaCheck(cudaDeviceCanAccessPeer(&check, dev, it->first));
|
||||
if (check) {
|
||||
cudaCheck(cudaSetDevice(dev));
|
||||
cudaStream_t stream;
|
||||
cudaCheck(cudaStreamCreate(&stream));
|
||||
if (verbose>1) util::cuda::printDevInfo(dev, "Using");
|
||||
(*this)[dev] = stream;
|
||||
} else if (verbose) util::cuda::printDevInfo(dev, "Ignoring");
|
||||
}
|
||||
cudaCheck(cudaSetDevice(current));// reset to the previous device
|
||||
|
||||
void* entryPoint = nullptr;
|
||||
#if CUDART_VERSION >= 13000
|
||||
cudaDriverEntryPointQueryResult queryResult;
|
||||
cudaCheck(cudaGetDriverEntryPointByVersion("cuMemGetAllocationGranularity", &entryPoint, 13000, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#elif CUDART_VERSION >= 12000// queryResult argument was added in CUDA 12
|
||||
cudaDriverEntryPointQueryResult queryResult;
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#else
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault));
|
||||
#endif
|
||||
mFunctPtr = reinterpret_cast<FuncT*>(entryPoint);
|
||||
}// DeviceStreamMap::DeviceStreamMap
|
||||
|
||||
DeviceStreamMap::~DeviceStreamMap()
|
||||
{
|
||||
const int current = util::cuda::currentDevice();
|
||||
for (auto& [device, stream] : *this) {
|
||||
cudaCheck(cudaSetDevice(device));
|
||||
cudaCheck(cudaStreamDestroy(stream));
|
||||
}
|
||||
cudaCheck(cudaSetDevice(current));// reset to the previous device
|
||||
}
|
||||
|
||||
inline size_t DeviceStreamMap::getMinPageSize() const
|
||||
{
|
||||
NANOVDB_ASSERT(mFunctPtr);
|
||||
CUmemAllocationProp prop = {};
|
||||
prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
|
||||
prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
|
||||
size_t minGranularity = 0;
|
||||
for (auto it = this->begin(); it!=this->end(); ++it) {
|
||||
prop.location.id = it->first;
|
||||
size_t granularity = 0;
|
||||
(*mFunctPtr)(&granularity, &prop, CU_MEM_ALLOC_GRANULARITY_MINIMUM);
|
||||
if (minGranularity < granularity) minGranularity = granularity;
|
||||
}
|
||||
return minGranularity;
|
||||
}// DeviceStreamMap::getMinPageSize
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
}// namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICESTREAMMAP_H_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,152 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/cuda/GridHandle.cuh
|
||||
|
||||
\author Ken Museth, Doyub Kim
|
||||
|
||||
\date August 3, 2023
|
||||
|
||||
\brief Contains cuda kernels for GridHandle
|
||||
|
||||
\warning The header file contains cuda device code so be sure
|
||||
to only include it in .cu files (or other .cuh files)
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_GRIDHANDLE_CUH_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_GRIDHANDLE_CUH_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>// required for instantiation of move c-tor of GridHandle
|
||||
#include <nanovdb/tools/cuda/GridChecksum.cuh>// for cuda::updateChecksum
|
||||
#include <nanovdb/GridHandle.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
namespace detail {
|
||||
|
||||
static __global__ void cpyGridHandleMeta(const GridData *d_data, GridHandleMetaData *d_meta)
|
||||
{
|
||||
nanovdb::cpyGridHandleMeta(d_data, d_meta);
|
||||
}
|
||||
|
||||
static __global__ void updateGridCount(GridData *d_data, uint32_t gridIndex, uint32_t gridCount, bool *d_dirty)
|
||||
{
|
||||
NANOVDB_ASSERT(gridIndex < gridCount);
|
||||
*d_dirty = (d_data->mGridIndex != gridIndex) || (d_data->mGridCount != gridCount);
|
||||
if (*d_dirty) {
|
||||
d_data->mGridIndex = gridIndex;
|
||||
d_data->mGridCount = gridCount;
|
||||
if (d_data->mChecksum.isEmpty()) *d_dirty = false;// no need to update checksum if it didn't already exist
|
||||
}
|
||||
}
|
||||
|
||||
}// namespace detail
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT = std::vector>
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, VectorT<GridHandle<BufferT>>>::type
|
||||
splitGridHandles(const GridHandle<BufferT> &handle, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{
|
||||
const void *ptr = handle.deviceData();
|
||||
if (ptr == nullptr) return VectorT<GridHandle<BufferT>>();
|
||||
VectorT<GridHandle<BufferT>> handles(handle.gridCount());
|
||||
bool dirty, *d_dirty;// use this to check if the checksum needs to be recomputed
|
||||
cudaCheck(util::cuda::mallocAsync((void**)&d_dirty, sizeof(bool), stream));
|
||||
int device = util::cuda::currentDevice();
|
||||
for (uint32_t n=0; n<handle.gridCount(); ++n) {
|
||||
auto buffer = BufferT::create(handle.gridSize(n), other, device, stream);
|
||||
GridData *dst = reinterpret_cast<GridData*>(buffer.deviceData());
|
||||
const GridData *src = reinterpret_cast<const GridData*>(ptr);
|
||||
cudaCheck(cudaMemcpyAsync(dst, src, handle.gridSize(n), cudaMemcpyDeviceToDevice, stream));
|
||||
detail::updateGridCount<<<1, 1, 0, stream>>>(dst, 0u, 1u, d_dirty);
|
||||
cudaCheckError();
|
||||
cudaCheck(cudaMemcpyAsync(&dirty, d_dirty, sizeof(bool), cudaMemcpyDeviceToHost, stream));
|
||||
cudaCheck(cudaStreamSynchronize(stream));
|
||||
if (dirty) tools::cuda::updateChecksum(dst, CheckMode::Partial, stream);
|
||||
handles[n] = nanovdb::GridHandle<BufferT>(std::move(buffer));
|
||||
ptr = util::PtrAdd(ptr, handle.gridSize(n));
|
||||
}
|
||||
cudaCheck(util::cuda::freeAsync(d_dirty, stream));
|
||||
return handles;
|
||||
}// cuda::splitGridHandles
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT>
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, GridHandle<BufferT>>::type
|
||||
mergeGridHandles(const VectorT<GridHandle<BufferT>> &handles, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{
|
||||
uint64_t size = 0u;
|
||||
uint32_t counter = 0u, gridCount = 0u;
|
||||
for (auto &h : handles) {
|
||||
gridCount += h.gridCount();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) size += h.gridSize(n);
|
||||
}
|
||||
int device = util::cuda::currentDevice();
|
||||
auto buffer = BufferT::create(size, other, device, stream);
|
||||
void *dst = buffer.deviceData();
|
||||
bool dirty, *d_dirty;// use this to check if the checksum needs to be recomputed
|
||||
cudaCheck(util::cuda::mallocAsync((void**)&d_dirty, sizeof(bool), stream));
|
||||
for (auto &h : handles) {
|
||||
const void *src = h.deviceData();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) {
|
||||
cudaCheck(cudaMemcpyAsync(dst, src, h.gridSize(n), cudaMemcpyDeviceToDevice, stream));
|
||||
GridData *data = reinterpret_cast<GridData*>(dst);
|
||||
detail::updateGridCount<<<1, 1, 0, stream>>>(data, counter++, gridCount, d_dirty);
|
||||
cudaCheckError();
|
||||
cudaCheck(cudaMemcpyAsync(&dirty, d_dirty, sizeof(bool), cudaMemcpyDeviceToHost, stream));
|
||||
cudaCheck(cudaStreamSynchronize(stream));
|
||||
if (dirty) tools::cuda::updateChecksum(data, CheckMode::Partial, stream);
|
||||
dst = util::PtrAdd(dst, h.gridSize(n));
|
||||
src = util::PtrAdd(src, h.gridSize(n));
|
||||
}
|
||||
}
|
||||
cudaCheck(util::cuda::freeAsync(d_dirty, stream));
|
||||
return GridHandle<BufferT>(std::move(buffer));
|
||||
}// cuda::mergeGridHandles
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT = std::vector>
|
||||
[[deprecated("Use nanovdb::cuda::splitGridHandles instead")]]
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, VectorT<GridHandle<BufferT>>>::type
|
||||
splitDeviceGrids(const GridHandle<BufferT> &handle, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{ return cuda::splitGridHandles(handle, other, stream); }
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT>
|
||||
[[deprecated("Use nanovdb::cuda::mergeGridHandles instead")]]
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, GridHandle<BufferT>>::type
|
||||
mergeDeviceGrids(const VectorT<GridHandle<BufferT>> &handles, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{ return cuda::mergeGridHandles<BufferT, VectorT>(handles, other, stream); }
|
||||
|
||||
template<typename BufferT>
|
||||
template<typename T, typename util::enable_if<BufferTraits<T>::hasDeviceDual, int>::type>
|
||||
GridHandle<BufferT>::GridHandle(T&& buffer)
|
||||
{
|
||||
static_assert(util::is_same<T,BufferT>::value, "Expected U==BufferT");
|
||||
mBuffer = std::move(buffer);
|
||||
if (auto *data = reinterpret_cast<const GridData*>(mBuffer.data())) {
|
||||
if (!data->isValid()) throw std::runtime_error("GridHandle was constructed with an invalid host buffer");
|
||||
mMetaData.resize(data->mGridCount);
|
||||
cpyGridHandleMeta(data, mMetaData.data());
|
||||
} else {
|
||||
if (auto *d_data = reinterpret_cast<const GridData*>(mBuffer.deviceData())) {
|
||||
GridData tmp;
|
||||
cudaCheck(cudaMemcpy(&tmp, d_data, sizeof(GridData), cudaMemcpyDeviceToHost));
|
||||
if (!tmp.isValid()) throw std::runtime_error("GridHandle was constructed with an invalid device buffer");
|
||||
GridHandleMetaData *d_metaData;
|
||||
cudaMalloc((void**)&d_metaData, tmp.mGridCount*sizeof(GridHandleMetaData));
|
||||
cuda::detail::cpyGridHandleMeta<<<1,1>>>(d_data, d_metaData);
|
||||
mMetaData.resize(tmp.mGridCount);
|
||||
cudaCheck(cudaMemcpy(mMetaData.data(), d_metaData,tmp.mGridCount*sizeof(GridHandleMetaData), cudaMemcpyDeviceToHost));
|
||||
cudaCheck(cudaFree(d_metaData));
|
||||
}
|
||||
}
|
||||
}// GridHandle(T&& buffer)
|
||||
|
||||
// Dummy function that ensures instantiation of the move-constructor above when BufferT=cuda::DeviceBuffer
|
||||
namespace {auto __dummy(){return GridHandle<cuda::DeviceBuffer>(std::move(cuda::DeviceBuffer()));}}
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // NANOVDB_CUDA_GRIDHANDLE_CUH_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,102 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/cuda/NodeManager.cuh
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date October 3, 2023
|
||||
|
||||
\brief Contains cuda kernels for NodeManager
|
||||
|
||||
\warning The header file contains cuda device code so be sure
|
||||
to only include it in .cu files (or other .cuh files)
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_NODE_MANAGER_CUH_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_NODE_MANAGER_CUH_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/util/cuda/Util.h>// for cuda::lambdaKernel
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
#include <nanovdb/NodeManager.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
/// @brief Construct a NodeManager from a device grid pointer
|
||||
///
|
||||
/// @param d_grid device grid pointer whose nodes will be accessed sequentially
|
||||
/// @param buffer buffer from which to allocate the output handle
|
||||
/// @param stream cuda stream
|
||||
/// @return Handle that contains a device NodeManager
|
||||
template <typename BuildT, typename BufferT = DeviceBuffer>
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, NodeManagerHandle<BufferT>>::type
|
||||
createNodeManager(const NanoGrid<BuildT> *d_grid,
|
||||
const BufferT& pool = BufferT(),
|
||||
cudaStream_t stream = 0)
|
||||
{
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
auto buffer = BufferT::create(sizeof(NodeManagerData), &pool, device, stream);
|
||||
auto *d_data = (NodeManagerData*)buffer.deviceData();
|
||||
size_t size = 0u, *d_size;
|
||||
cudaCheck(util::cuda::mallocAsync((void**)&d_size, sizeof(size_t), stream));
|
||||
util::cuda::lambdaKernel<<<1, 1, 0, stream>>>(1, [=] __device__(size_t) {
|
||||
*d_data = NodeManagerData((void*)d_grid);
|
||||
*d_size = sizeof(NodeManagerData);
|
||||
auto &tree = d_grid->tree();
|
||||
if (NodeManager<BuildT>::FIXED_SIZE && d_grid->isBreadthFirst()) {
|
||||
d_data->mLinear = uint8_t(1u);
|
||||
d_data->mOff[0] = util::PtrDiff(tree.template getFirstNode<0>(), d_grid);
|
||||
d_data->mOff[1] = util::PtrDiff(tree.template getFirstNode<1>(), d_grid);
|
||||
d_data->mOff[2] = util::PtrDiff(tree.template getFirstNode<2>(), d_grid);
|
||||
} else {
|
||||
*d_size += sizeof(uint64_t)*tree.totalNodeCount();
|
||||
}
|
||||
});
|
||||
cudaCheckError();
|
||||
cudaCheck(cudaMemcpyAsync(&size, d_size, sizeof(size_t), cudaMemcpyDeviceToHost, stream));
|
||||
cudaCheck(util::cuda::freeAsync(d_size, stream));
|
||||
if (size > sizeof(NodeManagerData)) {
|
||||
auto tmp = BufferT::create(size, &pool, device, stream);// only allocate buffer on the device
|
||||
cudaCheck(cudaMemcpyAsync(tmp.deviceData(), buffer.deviceData(), sizeof(NodeManagerData), cudaMemcpyDeviceToDevice, stream));
|
||||
buffer = std::move(tmp);
|
||||
d_data = reinterpret_cast<NodeManagerData*>(buffer.deviceData());
|
||||
util::cuda::lambdaKernel<<<1, 1, 0, stream>>>(1, [=] __device__ (size_t) {
|
||||
auto &tree = d_grid->tree();
|
||||
int64_t *ptr0 = d_data->mPtr[0] = reinterpret_cast<int64_t*>(d_data + 1);
|
||||
int64_t *ptr1 = d_data->mPtr[1] = d_data->mPtr[0] + tree.nodeCount(0);
|
||||
int64_t *ptr2 = d_data->mPtr[2] = d_data->mPtr[1] + tree.nodeCount(1);
|
||||
// Performs depth first traversal but breadth first insertion
|
||||
for (auto it2 = tree.root().cbeginChild(); it2; ++it2) {
|
||||
*ptr2++ = util::PtrDiff(&*it2, d_grid);
|
||||
for (auto it1 = it2->cbeginChild(); it1; ++it1) {
|
||||
*ptr1++ = util::PtrDiff(&*it1, d_grid);
|
||||
for (auto it0 = it1->cbeginChild(); it0; ++it0) {
|
||||
*ptr0++ = util::PtrDiff(&*it0, d_grid);
|
||||
}// loop over child nodes of the lower internal node
|
||||
}// loop over child nodes of the upper internal node
|
||||
}// loop over child nodes of the root node
|
||||
});
|
||||
}
|
||||
|
||||
return NodeManagerHandle<BufferT>(toGridType<BuildT>(), std::move(buffer));
|
||||
}// cuda::createNodeManager
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
template <typename BuildT, typename BufferT = cuda::DeviceBuffer>
|
||||
[[deprecated("Use cuda::createNodeManager instead")]]
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, NodeManagerHandle<BufferT>>::type
|
||||
cudaCreateNodeManager(const NanoGrid<BuildT> *d_grid,
|
||||
const BufferT& pool = BufferT(),
|
||||
cudaStream_t stream = 0)
|
||||
{
|
||||
return cuda::createNodeManager<BuildT, BufferT>(d_grid, pool, stream);
|
||||
}
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // NANOVDB_CUDA_NODE_MANAGER_CUH_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,66 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
/// @brief Defines a simple memory pool used to call cub functions that use dynamic temporary storage
|
||||
///
|
||||
/// @details See nanovdb/tools/cuda/PointToGrid.cuh and nanovdb/tools/cuda/DistributedPointToGrid.cuh
|
||||
/// for examples. Also note that this explains the somewhat unusual API with direct access to
|
||||
/// protected member data.
|
||||
//
|
||||
#ifndef NANOVDB_CUDA_TEMPPOOL_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_TEMPPOOL_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/cuda/DeviceResource.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
template <class Resource>
|
||||
class TempPool {
|
||||
public:
|
||||
|
||||
/// @brief Default c-tor of an empty memory pool.
|
||||
TempPool() : mData(nullptr), mSize(0), mRequestedSize(0) {}
|
||||
|
||||
/// @brief Destructor
|
||||
~TempPool() {
|
||||
mRequestedSize = 0;
|
||||
Resource::deallocateAsync(mData, mSize, Resource::DEFAULT_ALIGNMENT, nullptr);
|
||||
mData = nullptr;
|
||||
mSize = 0;
|
||||
}
|
||||
|
||||
/// @brief Returns a non-const void pointer to the data managed by this instance.
|
||||
void* data() {return mData;}
|
||||
|
||||
/// @brief Returns a non-const reference to the actual size of the data managed by this instance.
|
||||
size_t& size() {return mSize;}
|
||||
|
||||
/// @brief Returns a non-const reference to the requested size of the data managed by this instance.
|
||||
/// @note This requested size should always be less than or smaller than the actual size().
|
||||
size_t& requestedSize() {return mRequestedSize;}
|
||||
|
||||
/// @brief Re-allocation of the data managed by this instance. Only has affect if the pool in empty or
|
||||
/// the requested memory is larger than the existing size.
|
||||
/// @param stream cuda stream used for asynchronous de-allocation and allocation.
|
||||
void reallocate(cudaStream_t stream) {
|
||||
if (!mData || mRequestedSize > mSize) {
|
||||
Resource::deallocateAsync(mData, mSize, Resource::DEFAULT_ALIGNMENT, stream);
|
||||
mData = Resource::allocateAsync(mRequestedSize, Resource::DEFAULT_ALIGNMENT, stream);
|
||||
mSize = mRequestedSize;
|
||||
}
|
||||
}
|
||||
private:
|
||||
void *mData;
|
||||
size_t mSize;
|
||||
size_t mRequestedSize;
|
||||
};// TempPool<Resource> class
|
||||
|
||||
using TempDevicePool = TempPool<DeviceResource>;
|
||||
|
||||
} // namespace cuda
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_TEMPPOOL_H_HAS_BEEN_INCLUDED
|
||||
@@ -0,0 +1,326 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file UnifiedBuffer.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date October 15, 2024
|
||||
|
||||
\brief nanovdb::cuda::UnifiedBuffer that uses unified memory management
|
||||
|
||||
\note This file has no device-only kernel functions,
|
||||
which explains why it's a .h and not .cuh file.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_UNIFIEDBUFFER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_UNIFIEDBUFFER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda.h>
|
||||
#include <memory>// for std::shared_ptr
|
||||
#include <nanovdb/HostBuffer.h>// for BufferTraits
|
||||
#include <nanovdb/util/cuda/Util.h>// for cudaCheck
|
||||
|
||||
namespace nanovdb {// ================================================================
|
||||
|
||||
namespace cuda {// ===================================================================
|
||||
|
||||
/// @brief buffer, used for instance by the GridHandle, to allocate unified memory that
|
||||
/// can be resized and shared between multiple devices and the host.
|
||||
class UnifiedBuffer
|
||||
{
|
||||
void *mPtr;
|
||||
size_t mSize, mCapacity;
|
||||
public:
|
||||
|
||||
using PtrT = std::shared_ptr<UnifiedBuffer>;
|
||||
|
||||
/// @brief Default constructor of an empty buffer
|
||||
UnifiedBuffer() : mPtr(nullptr), mSize(0), mCapacity(0){}
|
||||
|
||||
/// @brief Constructor that specifies both the size and capacity
|
||||
/// @param size size of the buffer in bytes, indication what is actually used
|
||||
/// @param capacity number of bytes in the virtual page table, i.e max size for growing
|
||||
/// @note Capacity can be over-estimated to allow for future growth. Memory is not allocated
|
||||
/// with this constructor, only a page table. Allocation happens on usage or when calling prefetch
|
||||
UnifiedBuffer(size_t size, size_t capacity) : mPtr(nullptr), mSize(size), mCapacity(capacity)
|
||||
{
|
||||
assert(mSize <= mCapacity);
|
||||
cudaCheck(cudaMallocManaged(&mPtr, mCapacity, cudaMemAttachGlobal));
|
||||
}
|
||||
|
||||
/// @brief Similar to the constructor above except the size and capacity are equal, so no future growth is supported
|
||||
UnifiedBuffer(size_t size) : UnifiedBuffer(size, size){}
|
||||
|
||||
/// @brief Constructor that specifies the size, capacity, and device (for prefetching)
|
||||
/// @param size
|
||||
/// @param capacity
|
||||
/// @param device
|
||||
/// @param stream
|
||||
UnifiedBuffer(uint64_t size, uint64_t capacity, int device, cudaStream_t stream = 0) : mPtr(nullptr), mSize(size), mCapacity(size)
|
||||
{
|
||||
assert(mSize <= mCapacity);
|
||||
cudaCheck(cudaMallocManaged(&mPtr, mCapacity, cudaMemAttachGlobal));
|
||||
cudaCheck(util::cuda::memAdvise(mPtr, size, cudaMemAdviseSetPreferredLocation, device));
|
||||
cudaCheck(util::cuda::memPrefetchAsync(mPtr, size, device, stream));
|
||||
}
|
||||
|
||||
/// @brief Constructor with a specified device
|
||||
/// @param size
|
||||
/// @param device
|
||||
/// @param stream
|
||||
UnifiedBuffer(uint64_t size, int device, cudaStream_t stream = 0) : UnifiedBuffer(size, size, device, stream){}
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
UnifiedBuffer(const UnifiedBuffer&) = delete;
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
UnifiedBuffer(UnifiedBuffer&& other) noexcept
|
||||
: mPtr(other.mPtr)
|
||||
, mSize(other.mSize)
|
||||
, mCapacity(other.mCapacity)
|
||||
{
|
||||
other.mPtr = nullptr;
|
||||
other.mSize = other.mCapacity = 0;
|
||||
}
|
||||
|
||||
/// @brief Destructor
|
||||
~UnifiedBuffer(){cudaCheck(cudaFree(mPtr));}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
//@{
|
||||
/// @brief Factory methods that create an UnifiedBuffer instance and returns it with move semantics
|
||||
static UnifiedBuffer create(size_t size, size_t capacity) {return UnifiedBuffer(size, capacity);}
|
||||
static UnifiedBuffer create(size_t size) {return UnifiedBuffer(size);}
|
||||
///@}
|
||||
|
||||
//@{
|
||||
/// @brief Factory methods that create a shared pointer to an UnifiedBuffer instance
|
||||
static PtrT createPtr(size_t size, size_t capacity) {return std::make_shared<UnifiedBuffer>(size, capacity);}
|
||||
static PtrT createPtr(size_t size) {return std::make_shared<UnifiedBuffer>(size);}
|
||||
///@}
|
||||
|
||||
/// @brief Legacy factory method that mirrors DeviceBuffer. It creates a UnifiedBuffer from a size and a reference buffer.
|
||||
/// If a reference buffer is provided and its non-empty, it is used to defined the capacity of the new buffer
|
||||
/// @param size Size on bytes of the new buffer
|
||||
/// @param reference reference buffer optionally used to define the capacity
|
||||
/// @param host Ignored for now
|
||||
/// @param stream cuda stream
|
||||
/// @return An instance of a new UnifiedBuffer using move semantics
|
||||
static UnifiedBuffer create(size_t size, const UnifiedBuffer* reference, int device, cudaStream_t stream)
|
||||
{
|
||||
const size_t capacity = (reference && reference->capacity()) ? reference->capacity() : size;
|
||||
UnifiedBuffer buffer(size, capacity);
|
||||
cudaCheck(util::cuda::memAdvise(buffer.mPtr, size, cudaMemAdviseSetPreferredLocation, device));
|
||||
cudaCheck(util::cuda::memPrefetchAsync(buffer.mPtr, size, device, stream));
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/// @brief Factory method that created a buffer on the host of the specified size. If the
|
||||
/// reference buffer has a capacity it is used. Also the buffer is prefetched to the host
|
||||
/// @param size byte size of buffer initiated on the host
|
||||
/// @param reference optional reference buffer from which the capacity is derived
|
||||
static UnifiedBuffer create(size_t size, const UnifiedBuffer* reference){return create(size, reference, cudaCpuDeviceId, (cudaStream_t)0);}
|
||||
|
||||
/// @brief Factory method that created a buffer on the host or device of the specified size. If the
|
||||
/// reference buffer has a capacity it is used. Also the buffer is prefetched to the host or (current) device
|
||||
/// @param size byte size of buffer initiated on the device or host
|
||||
/// @param reference optional reference buffer from which the capacity is derived
|
||||
/// @param host If true the buffer will be prefetched to the host, else to the current device
|
||||
/// @param stream optional cuda stream
|
||||
static UnifiedBuffer create(size_t size, const UnifiedBuffer* reference, bool host, void* stream = nullptr)
|
||||
{
|
||||
int device = cudaCpuDeviceId;
|
||||
if (!host) cudaGetDevice(&device);
|
||||
return create(size, reference, device, (cudaStream_t)stream);
|
||||
}
|
||||
|
||||
/// @brief Free all memory and reset this instance to empty
|
||||
void clear()
|
||||
{
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
mPtr = nullptr;
|
||||
mSize = mCapacity = 0;
|
||||
}
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
UnifiedBuffer& operator=(const UnifiedBuffer&) = delete;
|
||||
|
||||
/// @brief Allow move assignment operation
|
||||
UnifiedBuffer& operator=(UnifiedBuffer&& other)
|
||||
{
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
mPtr = other.mPtr;
|
||||
mSize = other.mSize;
|
||||
mCapacity = other.mCapacity;
|
||||
other.mPtr = nullptr;
|
||||
other.mSize = other.mCapacity = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// @brief initialize buffer as a new with the specified size and capacity
|
||||
/// @param size size of memory block to be used in bytes
|
||||
/// @param capacity size of page table in bytes
|
||||
void init(size_t size, size_t capacity)
|
||||
{
|
||||
NANOVDB_ASSERT(size <= capacity);
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
mSize = size;
|
||||
mCapacity = capacity;
|
||||
cudaCheck(cudaMallocManaged(&mPtr, capacity, cudaMemAttachGlobal));
|
||||
}
|
||||
|
||||
/// @brief Resize the memory block managed by this buffer. If the current capacity is larger than the new size this method
|
||||
/// simply redefines size. Otherwise a new page-table is defined, with the specified advice, and the old block is copied to the new block.
|
||||
/// @param size size of the new memory block
|
||||
/// @param dev the device ID on which to apply each advice provided in list, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param list advices to be applied to the resized range
|
||||
void resize(size_t size, int dev = cudaCpuDeviceId, std::initializer_list<cudaMemoryAdvise> list = {cudaMemAdviseSetPreferredLocation})
|
||||
{
|
||||
if (size <= mCapacity) {
|
||||
mSize = size;
|
||||
} else {
|
||||
void *ptr = 0;
|
||||
cudaCheck(cudaMallocManaged(&ptr, size, cudaMemAttachGlobal));
|
||||
if (dev > -2) for (auto a : list) cudaCheck(util::cuda::memAdvise(ptr, size, a, dev));
|
||||
if (mSize > 0) {// copy over data from the old memory block
|
||||
cudaCheck(cudaMemcpy(ptr, mPtr, std::min(mSize, size), cudaMemcpyDefault));
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
}
|
||||
mPtr = ptr;
|
||||
mSize = mCapacity = size;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Apply a single advise to a memory block
|
||||
/// @param byteOffset offset in bytes marking the beginning of the memory block to be advised
|
||||
/// @param size size in bytes of the memory block to be advised.
|
||||
/// @param dev the device ID on which to apply the advice provided in adv, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param adv advice to be applied to the resized range
|
||||
void advise(ptrdiff_t byteOffset, size_t size, int dev, cudaMemoryAdvise adv) const
|
||||
{
|
||||
cudaCheck(util::cuda::memAdvise(util::PtrAdd(mPtr, byteOffset), size, adv, dev));
|
||||
}
|
||||
|
||||
/// @brief Apply a list of advices to a memory block
|
||||
/// @param byteOffset offset in bytes marking the beginning of the memory block to be advised
|
||||
/// @param size size in bytes of the memory block to be advised.
|
||||
/// @param dev the device ID to prefetch to, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param list list of cuda advises
|
||||
void advise(ptrdiff_t byteOffset, size_t size, int dev, std::initializer_list<cudaMemoryAdvise> list) const
|
||||
{
|
||||
void *ptr = util::PtrAdd(mPtr, byteOffset);
|
||||
for (auto a : list) cudaCheck(util::cuda::memAdvise(ptr, size, a, dev));
|
||||
}
|
||||
|
||||
/// @brief Prefetches data to the specified device, i.e. ensure the device has an up-to-date copy of the memory specified
|
||||
/// @param byteOffset offset in bytes marking the beginning of the memory block to be prefetched
|
||||
/// @param size size in bytes of the memory block to be prefetched. The default value of zero means copy all @c this->size() bytes.
|
||||
/// @param dev the device ID to prefetch to, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param stream cuda stream
|
||||
void prefetch(ptrdiff_t byteOffset = 0, size_t size = 0, int dev = cudaCpuDeviceId, cudaStream_t stream = cudaStreamPerThread) const
|
||||
{
|
||||
cudaCheck(util::cuda::memPrefetchAsync(util::PtrAdd(mPtr, byteOffset), size ? size : mSize, dev, stream));
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Prefetches all data to the specified device
|
||||
/// @param device device ID, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
/// @note Legacy method included for compatibility with DeviceBuffer
|
||||
void deviceUpload(int device = 0, cudaStream_t stream = cudaStreamPerThread, bool sync = false) const
|
||||
{
|
||||
cudaCheck(util::cuda::memPrefetchAsync(mPtr, mSize, device, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
}
|
||||
void deviceUpload(int device, void* stream, bool sync) const{this->deviceUpload(device, cudaStream_t(stream));}
|
||||
|
||||
/// @brief Prefetches all data to the current device, as given by cudaGetDevice
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
/// @note Legacy method included for compatibility with DeviceBuffer
|
||||
void deviceUpload(void* stream, bool sync) const{
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
this->deviceUpload(device, cudaStream_t(stream), sync);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Prefetches all data to the host
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
void deviceDownload(cudaStream_t stream = 0, bool sync = false) const
|
||||
{
|
||||
cudaCheck(util::cuda::memPrefetchAsync(mPtr, mSize, cudaCpuDeviceId, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
}
|
||||
|
||||
/// @brief Legacy
|
||||
/// @param stream
|
||||
/// @param sync
|
||||
void deviceDownload(void* stream, bool sync) const{this->deviceDownload(cudaStream_t(stream), sync);}
|
||||
|
||||
// used by GridHandle
|
||||
void deviceDownload(int dummmy, void* stream, bool sync) const{this->deviceDownload(cudaStream_t(stream), sync);}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Returns a raw pointer to the unified memory managed by this instance.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* data() const {return mPtr;}
|
||||
|
||||
/// @brief Returns an offset pointer of a specific type from the allocated unified memory
|
||||
/// @tparam T Type of the pointer returned
|
||||
/// @param count Numbers of elements of @c parameter type T to skip (or offset) the return pointer
|
||||
/// @warning assumes that this instance is not empty!
|
||||
template <typename T>
|
||||
T* data(ptrdiff_t count = 0) const {
|
||||
NANOVDB_ASSERT(mPtr != nullptr || count == 0);
|
||||
return reinterpret_cast<T*>(mPtr) + count;
|
||||
}
|
||||
|
||||
/// @brief Returns a byte offset void pointer from the unified memory
|
||||
/// @param byteOffset Number of bytes to skip (or offset) the return pointer
|
||||
/// @warning assumes that this instance is not empty!
|
||||
void* data(ptrdiff_t byteOffset) const {
|
||||
NANOVDB_ASSERT(mPtr != nullptr || byteOffset == 0);
|
||||
return util::PtrAdd(mPtr, byteOffset);
|
||||
}
|
||||
|
||||
/// @brief Legacy
|
||||
/// @return
|
||||
void* deviceData() const {return mPtr;}
|
||||
void* deviceData(int) const {return mPtr;}
|
||||
|
||||
/// @brief Size of the allocated pages in this instance
|
||||
/// @return number bytes allocated by this instance
|
||||
size_t size() const {return mSize;}
|
||||
|
||||
/// @brief Capacity of this instance, i.e. room in page table
|
||||
/// @return number of bytes reserved, but not necessarily allocated, by this instance
|
||||
size_t capacity() const {return mCapacity;}
|
||||
|
||||
//@{
|
||||
/// @brief Returns true if this allocator is empty, i.e. has no allocated memory
|
||||
inline bool empty() const { return mPtr == nullptr; }
|
||||
inline bool isEmpty() const { return this->empty(); }
|
||||
//@}
|
||||
|
||||
};// UnifiedBuffer
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
template<>
|
||||
struct BufferTraits<cuda::UnifiedBuffer>
|
||||
{
|
||||
static constexpr bool hasDeviceDual = true;
|
||||
};
|
||||
|
||||
}// namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_UNIFIEDBUFFER_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# find_package(doxygen REQUIRED dot )
|
||||
if(WIN32)
|
||||
set(DOXYGEN_EXECUTABLE "C:/Program Files/doxygen/bin/doxygen.exe")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(NanoVDBExamples LANGUAGES CXX)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -78,7 +78,7 @@ function(NANOVDB_EXAMPLE)
|
||||
target_include_directories(${EXAMPLE_NAME} PUBLIC ex_util)
|
||||
target_link_libraries(${EXAMPLE_NAME} PRIVATE nanovdb)
|
||||
|
||||
install(TARGETS ${EXAMPLE_NAME} DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples)
|
||||
install(TARGETS ${EXAMPLE_NAME} DESTINATION ${NANOVDB_INSTALL_DOCDIR}/examples)
|
||||
endfunction()
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
@@ -100,14 +100,24 @@ nanovdb_example(NAME "ex_read_nanovdb_sphere")
|
||||
nanovdb_example(NAME "ex_read_nanovdb_sphere_accessor")
|
||||
nanovdb_example(NAME "ex_read_nanovdb_sphere_accessor_cuda")
|
||||
nanovdb_example(NAME "ex_index_grid_cuda")
|
||||
nanovdb_example(NAME "ex_nodemanager_cuda")
|
||||
nanovdb_example(NAME "ex_nodemanager_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_voxels_to_grid_cuda")
|
||||
nanovdb_example(NAME "ex_voxels_to_grid_mgpu")
|
||||
nanovdb_example(NAME "ex_modify_nanovdb_thrust")
|
||||
nanovdb_example(NAME "ex_map_pool_buffer")
|
||||
nanovdb_example(NAME "ex_bump_pool_buffer")
|
||||
nanovdb_example(NAME "ex_collide_level_set")
|
||||
nanovdb_example(NAME "ex_raytrace_fog_volume")
|
||||
nanovdb_example(NAME "ex_raytrace_level_set")
|
||||
nanovdb_example(NAME "ex_dilate_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_merge_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_refine_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_coarsen_nanovdb_cuda" OPENVDB)
|
||||
|
||||
if(CUDAToolkit_FOUND)
|
||||
nanovdb_example(NAME "ex_make_mgpu_nanovdb") # requires cuRAND
|
||||
target_link_libraries(ex_make_mgpu_nanovdb PRIVATE CUDA::curand)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_MAGICAVOXEL)
|
||||
nanovdb_example(NAME "ex_vox_to_nanovdb")
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/util/Primitives.h>
|
||||
#include <nanovdb/util/IO.h>
|
||||
#include <nanovdb/util/HostBuffer.h>
|
||||
#include <nanovdb/tools/CreatePrimitives.h>
|
||||
#include <nanovdb/io/IO.h>
|
||||
#include <nanovdb/HostBuffer.h>
|
||||
#include <algorithm>
|
||||
|
||||
//////////////////////////////////////////////
|
||||
@@ -83,11 +83,11 @@ public:
|
||||
|
||||
// Mandatory.
|
||||
// Return non-const pointer to the buffer data.
|
||||
uint8_t* data() { return mState->mPoolSlab.data() + mOffset; }
|
||||
void* data() { return nanovdb::util::PtrAdd(mState->mPoolSlab.data(), mOffset); }
|
||||
|
||||
// Mandatory.
|
||||
// Return const pointer to the buffer data.
|
||||
const uint8_t* data() const { return mState->mPoolSlab.data() + mOffset; }
|
||||
const void* data() const { return nanovdb::util::PtrAdd(mState->mPoolSlab.data(), mOffset); }
|
||||
};
|
||||
|
||||
// we specify this trait to avoid declaring the "device...(...)" convenience methods.
|
||||
@@ -110,8 +110,8 @@ int main()
|
||||
std::vector<nanovdb::GridHandle<PoolBuffer>> gridHdls;
|
||||
|
||||
// create two grids...
|
||||
gridHdls.push_back(nanovdb::createLevelSetSphere<float >(100.0, nanovdb::Vec3d(-20, 0, 0), 1.0, 3.0, nanovdb::Vec3d(0), "spheref", nanovdb::StatsMode::BBox, nanovdb::ChecksumMode::Partial, bufferContext));
|
||||
gridHdls.push_back(nanovdb::createLevelSetSphere<double>(100.0, nanovdb::Vec3d( 20, 0, 0), 1.0, 3.0, nanovdb::Vec3d(0), "sphered", nanovdb::StatsMode::BBox, nanovdb::ChecksumMode::Partial, bufferContext));
|
||||
gridHdls.push_back(nanovdb::tools::createLevelSetSphere<float >(100.0, nanovdb::Vec3d(-20, 0, 0), 1.0, 3.0, nanovdb::Vec3d(0), "spheref", nanovdb::tools::StatsMode::BBox, nanovdb::CheckMode::Partial, bufferContext));
|
||||
gridHdls.push_back(nanovdb::tools::createLevelSetSphere<double>(100.0, nanovdb::Vec3d( 20, 0, 0), 1.0, 3.0, nanovdb::Vec3d(0), "sphered", nanovdb::tools::StatsMode::BBox, nanovdb::CheckMode::Partial, bufferContext));
|
||||
|
||||
// Get a (raw) pointer to the NanoVDB grid form the GridManager.
|
||||
auto* dstGrid = gridHdls[0].grid<float>();
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// the following files are from OpenVDB
|
||||
#include <openvdb/tools/Composite.h>
|
||||
#include <openvdb/util/CpuTimer.h>
|
||||
|
||||
// the following files are from NanoVDB
|
||||
#include <nanovdb/NanoVDB.h>
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
|
||||
template<class CoordT>
|
||||
inline CoordT
|
||||
coarsenCoord(const CoordT& coord)
|
||||
{
|
||||
auto coarsenComponent = [](const typename CoordT::ValueType n) {return (n>=0) ? (n>>1) : -((-n+1)>>1);};
|
||||
CoordT result;
|
||||
result[0] = coarsenComponent(coord[0]);
|
||||
result[1] = coarsenComponent(coord[1]);
|
||||
result[2] = coarsenComponent(coord[2]);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename BuildT>
|
||||
void mainCoarsenGrid(
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridCoarsened,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridCoarsened,
|
||||
uint32_t benchmark_iters
|
||||
);
|
||||
|
||||
/// @brief This example depends on OpenVDB, NanoVDB, and CUDA
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
using GridT = openvdb::FloatGrid;
|
||||
using BuildT = nanovdb::ValueOnIndex;
|
||||
|
||||
openvdb::util::CpuTimer cpuTimer;
|
||||
const bool printGridDiagnostics = true;
|
||||
|
||||
try {
|
||||
if (argc<2) OPENVDB_THROW(openvdb::ValueError, "usage: "+std::string(argv[0])+" input.vdb [<iterations>]\n");
|
||||
int benchmark_iters = 10;
|
||||
if (argc > 2) sscanf(argv[2], "%d", &benchmark_iters);
|
||||
|
||||
// Read the initial level set from file
|
||||
|
||||
cpuTimer.start("Read input VDB file");
|
||||
openvdb::initialize();
|
||||
openvdb::io::File inFile(argv[1]);
|
||||
inFile.open(false); // disable delayed loading
|
||||
auto baseGrids = inFile.getGrids();
|
||||
inFile.close();
|
||||
auto grid = openvdb::gridPtrCast<GridT>(baseGrids->at(0));
|
||||
if (!grid) OPENVDB_THROW(openvdb::ValueError, "First grid is not a FloatGrid\n");
|
||||
cpuTimer.stop();
|
||||
|
||||
// Convert to indexGrid (original, un-coarsened)
|
||||
cpuTimer.start("Converting openVDB input to indexGrid (original version)");
|
||||
auto handleOriginal = nanovdb::tools::openToIndexVDB<BuildT, nanovdb::cuda::DeviceBuffer>(
|
||||
grid,
|
||||
0u, // Don't copy data channel
|
||||
false, // No stats
|
||||
false, // No tiles
|
||||
1 // Verbose mode
|
||||
);
|
||||
auto *indexGridOriginal = handleOriginal.grid<BuildT>();
|
||||
cpuTimer.stop();
|
||||
|
||||
if (printGridDiagnostics) {
|
||||
std::cout << "============ Original Grid ===========" << std::endl;
|
||||
std::cout << "Allocated values [valueCount()] : " << indexGridOriginal->valueCount() << std::endl;
|
||||
std::cout << "Active voxels [activeVoxelCount()] : " << indexGridOriginal->activeVoxelCount() << std::endl;
|
||||
auto minCorner = indexGridOriginal->indexBBox().min(), maxCorner = indexGridOriginal->indexBBox().max();
|
||||
std::cout << "Index-space bounding box : [" << minCorner.x() << "," << minCorner.y() << "," << minCorner.z()
|
||||
<< "] -> [" << maxCorner.x() << "," << maxCorner.y() << "," << maxCorner.z() << "]" << std::endl;
|
||||
std::cout << "Leaf nodes : " << indexGridOriginal->tree().nodeCount(0) << std::endl;
|
||||
std::cout << "Lower internal nodes : " << indexGridOriginal->tree().nodeCount(1) << std::endl;
|
||||
std::cout << "Upper internal nodes : " << indexGridOriginal->tree().nodeCount(2) << std::endl;
|
||||
std::cout << "Leaf-level occupancy : "
|
||||
<< 100.f * (float)(indexGridOriginal->activeVoxelCount())/(float)(indexGridOriginal->tree().nodeCount(0) * 512)
|
||||
<< "%" << std::endl;
|
||||
std::cout << "Memory usage : " << indexGridOriginal->gridSize() << " bytes" << std::endl;
|
||||
}
|
||||
// Coarsening (CPU/OpenVDB version)
|
||||
cpuTimer.start("Coarsening OpenVDB (on CPU)");
|
||||
using TreeT = GridT::TreeType;
|
||||
using LeafManagerT = openvdb::tree::LeafManager<const TreeT>;
|
||||
LeafManagerT leafMgr(grid->tree());
|
||||
auto coarsenedGrid = openvdb::FloatGrid::create(grid->background());
|
||||
coarsenedGrid->setTransform(grid->transform().copy());
|
||||
coarsenedGrid->setName(grid->getName());
|
||||
auto dstAcc = coarsenedGrid->getAccessor();
|
||||
for (std::size_t leafID = 0; leafID < leafMgr.leafCount(); ++leafID) {
|
||||
const auto& srcLeaf = leafMgr.leaf(leafID);
|
||||
for (auto iter = srcLeaf.cbeginValueOn(); iter; ++iter) {
|
||||
const auto dstCoord = coarsenCoord(iter.getCoord());
|
||||
if (!dstAcc.isValueOn(dstCoord))
|
||||
dstAcc.setValue(dstCoord, iter.getValue());
|
||||
}
|
||||
}
|
||||
cpuTimer.stop();
|
||||
|
||||
// Convert to indexGrid (coarsened)
|
||||
cpuTimer.start("Converting openVDB input to indexGrid (coarsened version)");
|
||||
auto handleCoarsened = nanovdb::tools::openToIndexVDB<BuildT, nanovdb::cuda::DeviceBuffer>(
|
||||
coarsenedGrid,
|
||||
0u, // Don't copy data channel
|
||||
false, // No stats
|
||||
false, // No tiles
|
||||
1 // Verbose mode
|
||||
);
|
||||
cpuTimer.stop();
|
||||
|
||||
auto *indexGridCoarsened = handleCoarsened.grid<BuildT>();
|
||||
|
||||
if (printGridDiagnostics) {
|
||||
std::cout << "=========== Coarsened Grid ===========" << std::endl;
|
||||
std::cout << "Allocated values [valueCount()] : " << indexGridCoarsened->valueCount() << std::endl;
|
||||
std::cout << "Active voxels [activeVoxelCount()] : " << indexGridCoarsened->activeVoxelCount() << std::endl;
|
||||
auto minCorner = indexGridCoarsened->indexBBox().min(), maxCorner = indexGridCoarsened->indexBBox().max();
|
||||
std::cout << "Index-space bounding box : [" << minCorner.x() << "," << minCorner.y() << "," << minCorner.z()
|
||||
<< "] -> [" << maxCorner.x() << "," << maxCorner.y() << "," << maxCorner.z() << "]" << std::endl;
|
||||
std::cout << "Leaf nodes : " << indexGridCoarsened->tree().nodeCount(0) << std::endl;
|
||||
std::cout << "Lower internal nodes : " << indexGridCoarsened->tree().nodeCount(1) << std::endl;
|
||||
std::cout << "Upper internal nodes : " << indexGridCoarsened->tree().nodeCount(2) << std::endl;
|
||||
std::cout << "Leaf-level occupancy : "
|
||||
<< 100.f * (float)(indexGridCoarsened->activeVoxelCount())/(float)(indexGridCoarsened->tree().nodeCount(0) * 512)
|
||||
<< "%" << std::endl;
|
||||
std::cout << "Memory usage : " << indexGridCoarsened->gridSize() << " bytes" << std::endl;
|
||||
}
|
||||
|
||||
// Copy both NanoVDB grids to GPU
|
||||
handleOriginal.deviceUpload();
|
||||
handleCoarsened.deviceUpload();
|
||||
auto* deviceGridOriginal = handleOriginal.deviceGrid<BuildT>();
|
||||
auto* deviceGridCoarsened = handleCoarsened.deviceGrid<BuildT>();
|
||||
if (!deviceGridOriginal || !deviceGridCoarsened)
|
||||
OPENVDB_THROW(openvdb::RuntimeError, "Failure while uploading indexGrids to GPU");
|
||||
|
||||
// Launch benchmark
|
||||
mainCoarsenGrid( deviceGridOriginal, deviceGridCoarsened, indexGridOriginal, indexGridCoarsened, benchmark_iters );
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "An exception occurred: \"" << e.what() << "\"" << std::endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/tools/cuda/CoarsenGrid.cuh>
|
||||
|
||||
template<typename T>
|
||||
bool bufferCheck(const T* deviceBuffer, const T* hostBuffer, size_t elem_count) {
|
||||
T* tmpBuffer = new T[elem_count];
|
||||
cudaCheck(cudaMemcpy(tmpBuffer, deviceBuffer, elem_count * sizeof(T), cudaMemcpyDeviceToHost));
|
||||
bool same = true;
|
||||
for (int i=0; same && i< elem_count; ++i) { same = (tmpBuffer[i] == hostBuffer[i]); }
|
||||
delete [] tmpBuffer;
|
||||
return same;
|
||||
}
|
||||
|
||||
template<typename BuildT>
|
||||
void mainCoarsenGrid(
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridCoarsened,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridCoarsened,
|
||||
uint32_t benchmark_iters)
|
||||
{
|
||||
nanovdb::util::cuda::Timer gpuTimer;
|
||||
|
||||
// Initialize coarsener
|
||||
nanovdb::tools::cuda::CoarsenGrid<BuildT> coarsener( deviceGridOriginal );
|
||||
coarsener.setChecksum(nanovdb::CheckMode::Default);
|
||||
coarsener.setVerbose(1);
|
||||
|
||||
auto handle = coarsener.getHandle();
|
||||
auto dstGrid = handle.template deviceGrid<BuildT>();
|
||||
|
||||
// Check for correctness
|
||||
if (bufferCheck((char*)dstGrid, (char*)indexGridCoarsened->data(), indexGridCoarsened->gridSize()))
|
||||
std::cout << "Result of CoarsenGrid check out CORRECT against reference" << std::endl;
|
||||
else
|
||||
std::cout << "Result of CoarsenGrid compares INCORRECT against reference" << std::endl;
|
||||
|
||||
// Re-run warm-started iterations
|
||||
coarsener.setVerbose(0);
|
||||
for (int i = 0; i < benchmark_iters; i++) {
|
||||
gpuTimer.start("Re-running entire coarsening after warmstart");
|
||||
auto dummyHandle = coarsener.getHandle();
|
||||
gpuTimer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
template
|
||||
void mainCoarsenGrid(
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *deviceGridOriginal,
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *deviceGridCoarsened,
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *indexGridOriginal,
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *indexGridCoarsened,
|
||||
uint32_t benchmark_iters
|
||||
);
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <nanovdb/util/IO.h>
|
||||
#include <nanovdb/util/Primitives.h>
|
||||
#include <nanovdb/util/cuda/CudaDeviceBuffer.h>
|
||||
#include <nanovdb/io/IO.h>
|
||||
#include <nanovdb/tools/CreatePrimitives.h>
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
|
||||
#if defined(NANOVDB_USE_CUDA)
|
||||
using BufferT = nanovdb::CudaDeviceBuffer;
|
||||
using BufferT = nanovdb::cuda::DeviceBuffer;
|
||||
#else
|
||||
using BufferT = nanovdb::HostBuffer;
|
||||
#endif
|
||||
@@ -26,7 +26,7 @@ int main(int ac, char** av)
|
||||
handle = nanovdb::io::readGrid<BufferT>(av[1]);
|
||||
std::cout << "Loaded NanoVDB grid[" << handle.gridMetaData()->shortGridName() << "]...\n";
|
||||
} else {
|
||||
handle = nanovdb::createLevelSetSphere<float, BufferT>(100.0f, nanovdb::Vec3d(-20, 0, 0), 1.0, 3.0, nanovdb::Vec3d(0), "sphere");
|
||||
handle = nanovdb::tools::createLevelSetSphere<float, BufferT>(100.0f, nanovdb::Vec3d(-20, 0, 0), 1.0, 3.0, nanovdb::Vec3d(0), "sphere");
|
||||
}
|
||||
|
||||
if (handle.gridMetaData()->isLevelSet() == false) {
|
||||
@@ -37,10 +37,8 @@ int main(int ac, char** av)
|
||||
|
||||
const int numPoints = 10000000;
|
||||
|
||||
BufferT positionBuffer;
|
||||
positionBuffer.init(numPoints * sizeof(float) * 3);
|
||||
BufferT velocityBuffer;
|
||||
velocityBuffer.init(numPoints * sizeof(float) * 3);
|
||||
BufferT positionBuffer(numPoints * sizeof(float) * 3);
|
||||
BufferT velocityBuffer(numPoints * sizeof(float) * 3);
|
||||
|
||||
runNanoVDB(handle, numIterations, numPoints, positionBuffer, velocityBuffer);
|
||||
#if defined(NANOVDB_USE_OPENVDB)
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
#include <chrono>
|
||||
|
||||
#include <nanovdb/util/IO.h>
|
||||
#include <nanovdb/util/cuda/CudaDeviceBuffer.h>
|
||||
#include <nanovdb/util/Ray.h>
|
||||
#include <nanovdb/util/HDDA.h>
|
||||
#include <nanovdb/io/IO.h>
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
#include <nanovdb/math/Ray.h>
|
||||
#include <nanovdb/math/HDDA.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#if defined(NANOVDB_USE_CUDA)
|
||||
using BufferT = nanovdb::CudaDeviceBuffer;
|
||||
using BufferT = nanovdb::cuda::DeviceBuffer;
|
||||
#else
|
||||
using BufferT = nanovdb::HostBuffer;
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#if defined(NANOVDB_USE_OPENVDB)
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <openvdb/openvdb.h>
|
||||
#include <openvdb/math/Ray.h>
|
||||
|
||||
#include <nanovdb/util/cuda/CudaDeviceBuffer.h>
|
||||
#include <nanovdb/util/NanoToOpenVDB.h>
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
#include <nanovdb/tools/NanoToOpenVDB.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#if defined(NANOVDB_USE_CUDA)
|
||||
using BufferT = nanovdb::CudaDeviceBuffer;
|
||||
using BufferT = nanovdb::cuda::DeviceBuffer;
|
||||
#else
|
||||
using BufferT = nanovdb::HostBuffer;
|
||||
#endif
|
||||
@@ -29,9 +29,9 @@ void runOpenVDB(nanovdb::GridHandle<BufferT>& handle, int numIterations, int num
|
||||
using CoordT = openvdb::Coord;
|
||||
using RealT = float;
|
||||
using Vec3T = openvdb::math::Vec3<RealT>;
|
||||
using RayT = openvdb::math::Ray<RealT>;
|
||||
using RayT = openvdb::math::Ray<RealT>;
|
||||
|
||||
auto srcGrid = nanovdb::nanoToOpenVDB(handle);
|
||||
auto srcGrid = nanovdb::tools::nanoToOpenVDB(handle);
|
||||
std::cout << "Exporting to OpenVDB grid[" << srcGrid->getName() << "]...\n";
|
||||
|
||||
auto h_grid = (GridT*)srcGrid.get();
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// the following files are from OpenVDB
|
||||
#include <openvdb/tools/Morphology.h>
|
||||
#include <openvdb/util/CpuTimer.h>
|
||||
|
||||
// the following files are from NanoVDB
|
||||
#include <nanovdb/NanoVDB.h>
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
|
||||
template<typename BuildT>
|
||||
void mainDilateGrid(
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridDilated,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridDilated,
|
||||
uint32_t nnType,
|
||||
uint32_t benchmark_iters
|
||||
);
|
||||
|
||||
/// @brief This example depends on OpenVDB, NanoVDB, and CUDA
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
using GridT = openvdb::FloatGrid;
|
||||
using BuildT = nanovdb::ValueOnIndex;
|
||||
|
||||
// Select the type of dilation here. The NN_EDGE case supports leaf dilation too (currently)
|
||||
// openvdb::tools::NearestNeighbors nnType = openvdb::tools::NN_FACE_EDGE_VERTEX;
|
||||
openvdb::tools::NearestNeighbors nnType = openvdb::tools::NN_FACE;
|
||||
|
||||
openvdb::util::CpuTimer cpuTimer;
|
||||
const bool printGridDiagnostics = true;
|
||||
|
||||
try {
|
||||
|
||||
if (argc<2) OPENVDB_THROW(openvdb::ValueError, "usage: "+std::string(argv[0])+" input.vdb [<iterations>]\n");
|
||||
int benchmark_iters = 10;
|
||||
if (argc > 2) sscanf(argv[2], "%d", &benchmark_iters);
|
||||
|
||||
// Read the initial level set from file
|
||||
|
||||
cpuTimer.start("Read input VDB file");
|
||||
openvdb::initialize();
|
||||
openvdb::io::File inFile(argv[1]);
|
||||
inFile.open(false); // disable delayed loading
|
||||
auto baseGrids = inFile.getGrids();
|
||||
inFile.close();
|
||||
auto grid = openvdb::gridPtrCast<GridT>(baseGrids->at(0));
|
||||
openvdb::FloatGrid* ptr = grid.get(); // raw pointer
|
||||
if (!grid) OPENVDB_THROW(openvdb::ValueError, "First grid is not a FloatGrid\n");
|
||||
cpuTimer.stop();
|
||||
|
||||
// Convert to indexGrid (original, un-dilated)
|
||||
cpuTimer.start("Converting openVDB input to indexGrid (original version)");
|
||||
auto handleOriginal = nanovdb::tools::openToIndexVDB<BuildT, nanovdb::cuda::DeviceBuffer>(
|
||||
grid,
|
||||
0u, // Don't copy data channel
|
||||
false, // No stats
|
||||
false, // No tiles
|
||||
1 // Verbose mode
|
||||
);
|
||||
auto *indexGridOriginal = handleOriginal.grid<BuildT>();
|
||||
cpuTimer.stop();
|
||||
|
||||
if (printGridDiagnostics) {
|
||||
std::cout << "============ Original Grid ===========" << std::endl;
|
||||
std::cout << "Allocated values [valueCount()] : " << indexGridOriginal->valueCount() << std::endl;
|
||||
std::cout << "Active voxels [activeVoxelCount()] : " << indexGridOriginal->activeVoxelCount() << std::endl;
|
||||
auto minCorner = indexGridOriginal->indexBBox().min(), maxCorner = indexGridOriginal->indexBBox().max();
|
||||
std::cout << "Index-space bounding box : [" << minCorner.x() << "," << minCorner.y() << "," << minCorner.z()
|
||||
<< "] -> [" << maxCorner.x() << "," << maxCorner.y() << "," << maxCorner.z() << "]" << std::endl;
|
||||
std::cout << "Leaf nodes : " << indexGridOriginal->tree().nodeCount(0) << std::endl;
|
||||
std::cout << "Lower internal nodes : " << indexGridOriginal->tree().nodeCount(1) << std::endl;
|
||||
std::cout << "Upper internal nodes : " << indexGridOriginal->tree().nodeCount(2) << std::endl;
|
||||
std::cout << "Leaf-level occupancy : "
|
||||
<< 100.f * (float)(indexGridOriginal->activeVoxelCount())/(float)(indexGridOriginal->tree().nodeCount(0) * 512)
|
||||
<< "%" << std::endl;
|
||||
std::cout << "Memory usage : " << indexGridOriginal->gridSize() << " bytes" << std::endl;
|
||||
}
|
||||
|
||||
// Dilation (CPU/OpenVDB version)
|
||||
cpuTimer.start("Dilating openVDB (on CPU)");
|
||||
openvdb::tools::dilateActiveValues(grid->tree(), 1, nnType);
|
||||
cpuTimer.stop();
|
||||
|
||||
// Convert to indexGrid (dilated)
|
||||
cpuTimer.start("Converting openVDB input to indexGrid (dilated version)");
|
||||
auto handleDilated = nanovdb::tools::openToIndexVDB<BuildT, nanovdb::cuda::DeviceBuffer>(
|
||||
grid,
|
||||
0u, // Don't copy data channel
|
||||
false, // No stats
|
||||
false, // No tiles
|
||||
1 // Verbose mode
|
||||
);
|
||||
cpuTimer.stop();
|
||||
|
||||
auto *indexGridDilated = handleDilated.grid<BuildT>();
|
||||
|
||||
if (printGridDiagnostics) {
|
||||
std::cout << "============ Dilated Grid ============" << std::endl;
|
||||
std::cout << "Allocated values [valueCount()] : " << indexGridDilated->valueCount() << std::endl;
|
||||
std::cout << "Active voxels [activeVoxelCount()] : " << indexGridDilated->activeVoxelCount() << std::endl;
|
||||
auto minCorner = indexGridDilated->indexBBox().min(), maxCorner = indexGridDilated->indexBBox().max();
|
||||
std::cout << "Index-space bounding box : [" << minCorner.x() << "," << minCorner.y() << "," << minCorner.z()
|
||||
<< "] -> [" << maxCorner.x() << "," << maxCorner.y() << "," << maxCorner.z() << "]" << std::endl;
|
||||
std::cout << "Leaf nodes : " << indexGridDilated->tree().nodeCount(0) << std::endl;
|
||||
std::cout << "Lower internal nodes : " << indexGridDilated->tree().nodeCount(1) << std::endl;
|
||||
std::cout << "Upper internal nodes : " << indexGridDilated->tree().nodeCount(2) << std::endl;
|
||||
std::cout << "Leaf-level occupancy : "
|
||||
<< 100.f * (float)(indexGridDilated->activeVoxelCount())/(float)(indexGridDilated->tree().nodeCount(0) * 512)
|
||||
<< "%" << std::endl;
|
||||
std::cout << "Memory usage : " << indexGridDilated->gridSize() << " bytes" << std::endl;
|
||||
}
|
||||
|
||||
// Copy both NanoVDB grids to GPU
|
||||
handleOriginal.deviceUpload();
|
||||
handleDilated.deviceUpload();
|
||||
auto* deviceGridOriginal = handleOriginal.deviceGrid<BuildT>();
|
||||
auto* deviceGridDilated = handleDilated.deviceGrid<BuildT>();
|
||||
if (!deviceGridOriginal || !deviceGridDilated)
|
||||
OPENVDB_THROW(openvdb::RuntimeError, "Failure while uploading indexGrids to GPU");
|
||||
|
||||
// Launch benchmark
|
||||
mainDilateGrid( deviceGridOriginal, deviceGridDilated, indexGridOriginal, indexGridDilated, nnType, benchmark_iters );
|
||||
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "An exception occurred: \"" << e.what() << "\"" << std::endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/tools/cuda/DilateGrid.cuh>
|
||||
#include <nanovdb/tools/cuda/PruneGrid.cuh>
|
||||
#include <nanovdb/util/cuda/Injection.cuh>
|
||||
|
||||
template<typename T>
|
||||
bool bufferCheck(const T* deviceBuffer, const T* hostBuffer, size_t elem_count) {
|
||||
T* tmpBuffer = new T[elem_count];
|
||||
cudaCheck(cudaMemcpy(tmpBuffer, deviceBuffer, elem_count * sizeof(T), cudaMemcpyDeviceToHost));
|
||||
bool same = true;
|
||||
for (int i=0; same && i< elem_count; ++i) { same = (tmpBuffer[i] == hostBuffer[i]); }
|
||||
delete [] tmpBuffer;
|
||||
return same;
|
||||
}
|
||||
|
||||
template<typename BuildT>
|
||||
void mainDilateGrid(
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *deviceGridDilated,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridOriginal,
|
||||
nanovdb::NanoGrid<BuildT> *indexGridDilated,
|
||||
uint32_t nnType,
|
||||
uint32_t benchmark_iters)
|
||||
{
|
||||
nanovdb::util::cuda::Timer gpuTimer;
|
||||
|
||||
// Initialize dilator
|
||||
nanovdb::tools::cuda::DilateGrid<BuildT> dilator( deviceGridOriginal );
|
||||
dilator.setOperation(nanovdb::tools::morphology::NearestNeighbors(nnType));
|
||||
dilator.setChecksum(nanovdb::CheckMode::Default);
|
||||
dilator.setVerbose(1);
|
||||
|
||||
auto handle = dilator.getHandle();
|
||||
auto dstGrid = handle.template deviceGrid<BuildT>();
|
||||
|
||||
// Check for correctness
|
||||
if (bufferCheck((char*)dstGrid, (char*)indexGridDilated->data(), indexGridDilated->gridSize()))
|
||||
std::cout << "Result of DilateGrid check out CORRECT against reference" << std::endl;
|
||||
else
|
||||
std::cout << "Result of DilateGrid compares INCORRECT against reference" << std::endl;
|
||||
|
||||
// Re-run warm-started iterations
|
||||
dilator.setVerbose(0);
|
||||
for (int i = 0; i < benchmark_iters; i++) {
|
||||
gpuTimer.start("Re-running entire dilation after warmstart");
|
||||
auto dummyHandle = dilator.getHandle();
|
||||
gpuTimer.stop();
|
||||
}
|
||||
|
||||
uint32_t dstLeafCount = nanovdb::util::cuda::DeviceGridTraits<BuildT>::getTreeData(dstGrid).mNodeCount[0];
|
||||
nanovdb::cuda::DeviceBuffer dstLeafMaskBuffer;
|
||||
nanovdb::Mask<3>* dstLeafMasks = nullptr;
|
||||
if (dstLeafCount) {
|
||||
dstLeafMaskBuffer = nanovdb::cuda::DeviceBuffer::create( std::size_t(dstLeafCount) * sizeof(nanovdb::Mask<3>), nullptr, false );
|
||||
dstLeafMasks = static_cast<nanovdb::Mask<3>*>(dstLeafMaskBuffer.deviceData());
|
||||
if (!dstLeafMasks) throw std::runtime_error("No GPU buffer for dstLeafMask");
|
||||
}
|
||||
|
||||
const unsigned int numThreads = 128;
|
||||
auto numBlocks = [numThreads] (unsigned int n) {return (n + numThreads - 1) / numThreads;};
|
||||
gpuTimer.start("Injecting un-dilated topology as a pruning mask");
|
||||
if (dstLeafCount)
|
||||
nanovdb::util::cuda::lambdaKernel<<<numBlocks(dstLeafCount), numThreads>>>(dstLeafCount,
|
||||
nanovdb::util::cuda::InjectGridMaskFunctor<BuildT>(),
|
||||
deviceGridOriginal, dstGrid, dstLeafMasks );
|
||||
gpuTimer.stop();
|
||||
|
||||
// Initialize pruner
|
||||
nanovdb::tools::cuda::PruneGrid<BuildT> pruner( dstGrid, dstLeafMasks );
|
||||
pruner.setChecksum(nanovdb::CheckMode::Default);
|
||||
pruner.setVerbose(1);
|
||||
|
||||
auto prunedHandle = pruner.getHandle();
|
||||
auto prunedGrid = prunedHandle.template deviceGrid<BuildT>();
|
||||
|
||||
// Check for correctness
|
||||
if (bufferCheck((char*)prunedGrid, (char*)indexGridOriginal->data(), indexGridOriginal->gridSize()))
|
||||
std::cout << "Result of PruneGrid check out CORRECT against reference" << std::endl;
|
||||
else
|
||||
std::cout << "Result of PruneGrid compares INCORRECT against reference" << std::endl;
|
||||
|
||||
// Re-run warm-started iterations
|
||||
pruner.setVerbose(0);
|
||||
for (int i = 0; i < benchmark_iters; i++) {
|
||||
gpuTimer.start("Re-running entire pruning after warmstart");
|
||||
auto dummyHandle = pruner.getHandle();
|
||||
gpuTimer.stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
template
|
||||
void mainDilateGrid(
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *deviceGridOriginal,
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *deviceGridDilated,
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *indexGridOriginal,
|
||||
nanovdb::NanoGrid<nanovdb::ValueOnIndex> *indexGridDilated,
|
||||
uint32_t nnType,
|
||||
uint32_t benchmark_iters
|
||||
);
|
||||
@@ -1,27 +1,27 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/util/CreateNanoGrid.h>
|
||||
#include <nanovdb/util/Primitives.h> // for nanovdb::createLevelSetSphere
|
||||
#include <nanovdb/util/cuda/CudaDeviceBuffer.h>// for nanovdb::CudaDeviceBuffer
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
#include <nanovdb/tools/CreatePrimitives.h>// for nanovdb::tools::createLevelSetSphere
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>// for nanovdb::cuda::DeviceBuffer
|
||||
|
||||
extern "C" void launch_kernels(const nanovdb::NanoGrid<nanovdb::ValueOnIndex>*,// device grid
|
||||
const nanovdb::NanoGrid<nanovdb::ValueOnIndex>*,// host grid
|
||||
cudaStream_t stream);
|
||||
|
||||
/// @brief This examples depends on NanoVDB and CUDA.
|
||||
/// @brief This examples depends on NanoVDB and CUDA.
|
||||
int main(int, char**)
|
||||
{
|
||||
using SrcGridT = nanovdb::FloatGrid;
|
||||
using DstBuildT = nanovdb::ValueOnIndex;
|
||||
using BufferT = nanovdb::CudaDeviceBuffer;
|
||||
using BufferT = nanovdb::cuda::DeviceBuffer;
|
||||
try {
|
||||
// Create an NanoVDB grid of a sphere at the origin with radius 100 and voxel size 1.
|
||||
auto srcHandle = nanovdb::createLevelSetSphere<float>();
|
||||
auto srcHandle = nanovdb::tools::createLevelSetSphere<float>();
|
||||
auto *srcGrid = srcHandle.grid<float>();
|
||||
|
||||
// Converts the FloatGrid to an IndexGrid using CUDA for memory management.
|
||||
auto idxHandle = nanovdb::createNanoGrid<SrcGridT, DstBuildT, BufferT>(*srcGrid, 1u, false , false);// 1 channel, no tiles or stats
|
||||
auto idxHandle = nanovdb::tools::createNanoGrid<SrcGridT, DstBuildT, BufferT>(*srcGrid, 1u, false , false);// 1 channel, no tiles or stats
|
||||
|
||||
cudaStream_t stream; // Create a CUDA stream to allow for asynchronous copy of pinned CUDA memory.
|
||||
cudaStreamCreate(&stream);
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/NanoVDB.h> // this defined the core tree data structure of NanoVDB accessable on both the host and device
|
||||
#include <nanovdb/util/cuda/CudaGridHandle.cuh>// required since GridHandle<CudaDeviceBuffer> has device code
|
||||
#include <stdio.h> // for printf
|
||||
#include <nanovdb/cuda/GridHandle.cuh>// required since GridHandle<DeviceBuffer> has device code
|
||||
#include <cstdio> // for printf
|
||||
#include <cinttypes>
|
||||
|
||||
// This is called by the host only
|
||||
void cpu_kernel(const nanovdb::NanoGrid<nanovdb::ValueOnIndex>* cpuGrid)
|
||||
{
|
||||
nanovdb::ChannelAccessor<float, nanovdb::ValueOnIndex> acc(*cpuGrid);
|
||||
//printf("\nNanoVDB CPU: channels=%u values=%lu\n", acc.grid().blindDataCount(), acc.root().maximum());
|
||||
printf("NanoVDB CPU; %lu\n", acc.idx( 0, 0, 0));
|
||||
printf("NanoVDB CPU; %lu\n", acc.idx( 99, 0, 0));
|
||||
printf("NanoVDB CPU; %lu\n", acc.idx(100, 0, 0));
|
||||
printf("NanoVDB CPU; %" PRIu64 "\n", acc.idx( 0, 0, 0));
|
||||
printf("NanoVDB CPU; %" PRIu64 "\n", acc.idx( 99, 0, 0));
|
||||
printf("NanoVDB CPU; %" PRIu64 "\n", acc.idx(100, 0, 0));
|
||||
printf("NanoVDB CPU; %4.2f\n", acc( 0, 0, 0));
|
||||
printf("NanoVDB CPU; %4.2f\n", acc( 99, 0, 0));
|
||||
printf("NanoVDB CPU; %4.2f\n", acc(100, 0, 0));
|
||||
@@ -23,9 +24,9 @@ __global__ void gpu_kernel(const nanovdb::NanoGrid<nanovdb::ValueOnIndex>* gpuGr
|
||||
{
|
||||
nanovdb::ChannelAccessor<float, nanovdb::ValueOnIndex> acc(*gpuGrid);
|
||||
//printf("\nNanoVDB GPU: channels=%u values=%lu\n", gpuGrid->blindDataCount(), acc.root().maximum());
|
||||
printf("NanoVDB GPU; %lu\n", acc.idx( 0, 0, 0));
|
||||
printf("NanoVDB GPU; %lu\n", acc.idx( 99, 0, 0));
|
||||
printf("NanoVDB GPU; %lu\n", acc.idx(100, 0, 0));
|
||||
printf("NanoVDB GPU; %" PRIu64 "\n", acc.idx( 0, 0, 0));
|
||||
printf("NanoVDB GPU; %" PRIu64 "\n", acc.idx( 99, 0, 0));
|
||||
printf("NanoVDB GPU; %" PRIu64 "\n", acc.idx(100, 0, 0));
|
||||
printf("NanoVDB GPU; %4.2f\n", acc( 0, 0, 0));
|
||||
printf("NanoVDB GPU; %4.2f\n", acc( 99, 0, 0));
|
||||
printf("NanoVDB GPU; %4.2f\n", acc(100, 0, 0));
|
||||
@@ -39,4 +40,4 @@ extern "C" void launch_kernels(const nanovdb::NanoGrid<nanovdb::ValueOnIndex>* g
|
||||
gpu_kernel<<<1, 1, 0, stream>>>(gpuGrid); // Launch the device kernel asynchronously
|
||||
|
||||
cpu_kernel(cpuGrid); // Launch the host "kernel" (synchronously)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/util/GridBuilder.h>
|
||||
#include <nanovdb/util/CreateNanoGrid.h>
|
||||
#include <nanovdb/tools/GridBuilder.h>
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
/// @brief Creates a NanoVDB grids with custom values and access them.
|
||||
/// @brief Creates a NanoVDB grid with custom values and access them.
|
||||
///
|
||||
/// @note This example only depends on NanoVDB.
|
||||
int main()
|
||||
{
|
||||
try {
|
||||
nanovdb::build::Grid<float> grid(0.0f);
|
||||
nanovdb::tools::build::Grid<float> grid(0.0f);
|
||||
auto acc = grid.getAccessor();
|
||||
acc.setValue(nanovdb::Coord(1, 2, 3), 1.0f);
|
||||
|
||||
printf("build::Grid: (%i,%i,%i)=%4.2f\t", 1, 2, 3, acc.getValue(nanovdb::Coord(1, 2, 3)));
|
||||
printf("build::Grid: (%i,%i,%i)=%4.2f\n", 1, 2,-3, acc.getValue(nanovdb::Coord(1, 2,-3)));
|
||||
|
||||
auto handle = nanovdb::createNanoGrid(grid);
|
||||
auto handle = nanovdb::tools::createNanoGrid(grid);
|
||||
auto* dstGrid = handle.grid<float>(); // Get a (raw) pointer to the NanoVDB grid form the GridManager.
|
||||
if (!dstGrid)
|
||||
throw std::runtime_error("GridHandle does not contain a grid with value type float");
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#undef NANOVDB_USE_OPENVDB // Prevents include/openvdb/points/AttributeArray.h:1841:25: error: ‘stride’ cannot be used as a function
|
||||
|
||||
#include <nanovdb/util/GridBuilder.h>
|
||||
#include <nanovdb/util/CreateNanoGrid.h>
|
||||
#include <nanovdb/util/cuda/CudaDeviceBuffer.h>
|
||||
#include <nanovdb/tools/GridBuilder.h>
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
@@ -13,13 +13,13 @@ extern "C" void launch_kernels(const nanovdb::NanoGrid<float>*,// GPU grid
|
||||
const nanovdb::NanoGrid<float>*,// CPU grid
|
||||
cudaStream_t stream);
|
||||
|
||||
/// @brief Creates a NanoVDB grids with custom values and access them.
|
||||
/// @brief Creates a NanoVDB grid with custom values and access them.
|
||||
///
|
||||
/// @note This example only depends on NanoVDB.
|
||||
int main()
|
||||
{
|
||||
try {
|
||||
using GridT = nanovdb::build::Grid<float>;
|
||||
using GridT = nanovdb::tools::build::Grid<float>;
|
||||
GridT grid(0.0f);// empty grid with a background value of zero
|
||||
auto acc = grid.getAccessor();
|
||||
acc.setValue(nanovdb::Coord(1, 2, 3), 1.0f);
|
||||
@@ -27,13 +27,14 @@ int main()
|
||||
printf("build::Grid: (%i,%i,%i)=%4.2f\n", 1, 2, 3, acc.getValue(nanovdb::Coord(1, 2, 3)));
|
||||
|
||||
// convert build::grid to a nanovdb::GridHandle using a Cuda buffer
|
||||
auto handle = nanovdb::createNanoGrid<GridT, float, nanovdb::CudaDeviceBuffer>(grid);
|
||||
auto handle = nanovdb::tools::createNanoGrid<GridT, float, nanovdb::cuda::DeviceBuffer>(grid);
|
||||
|
||||
auto* cpuGrid = handle.grid<float>(); //get a (raw) pointer to a NanoVDB grid of value type float on the CPU
|
||||
if (!cpuGrid) throw std::runtime_error("GridHandle does not contain a grid with value type float");
|
||||
|
||||
cudaStream_t stream; // Create a CUDA stream to allow for asynchronous copy of pinned CUDA memory.
|
||||
cudaStreamCreate(&stream);
|
||||
|
||||
handle.deviceUpload(stream, false); // Copy the NanoVDB grid to the GPU asynchronously
|
||||
auto* gpuGrid = handle.deviceGrid<float>(); // get a (raw) pointer to a NanoVDB grid of value type float on the GPU
|
||||
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/NanoVDB.h> // this defined the core tree data structure of NanoVDB accessable on both the host and device
|
||||
#include <nanovdb/util/cuda/CudaGridHandle.cuh>// required since GridHandle<CudaDeviceBuffer> has device code
|
||||
#include <nanovdb/cuda/GridHandle.cuh>// required since GridHandle<DeviceBuffer> has device code
|
||||
#include <stdio.h> // for printf
|
||||
|
||||
// This is called by the host only
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <nanovdb/util/GridBuilder.h>
|
||||
#include <nanovdb/util/CreateNanoGrid.h>
|
||||
#include <nanovdb/util/IO.h>
|
||||
#include <nanovdb/tools/GridBuilder.h>
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
#include <nanovdb/io/IO.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
/// @brief Creates a NanoVDB grids with custom values and access them.
|
||||
/// @brief Creates a NanoVDB grid with custom values and access them.
|
||||
///
|
||||
/// @note This example only depends on NanoVDB.
|
||||
int main()
|
||||
@@ -20,12 +20,12 @@ int main()
|
||||
float v = 40.0f + 50.0f*(cos(ijk[0]*0.1f)*sin(ijk[1]*0.1f) +
|
||||
cos(ijk[1]*0.1f)*sin(ijk[2]*0.1f) +
|
||||
cos(ijk[2]*0.1f)*sin(ijk[0]*0.1f));
|
||||
v = Max(v, Vec3f(ijk).length() - size);// CSG intersection with a sphere
|
||||
v = math::Max(v, Vec3f(ijk).length() - size);// CSG intersection with a sphere
|
||||
return v > background ? background : v < -background ? -background : v;// clamp value
|
||||
};
|
||||
build::Grid<float> grid(background, "funny", GridClass::LevelSet);
|
||||
tools::build::Grid<float> grid(background, "funny", GridClass::LevelSet);
|
||||
grid(func, CoordBBox(Coord(-size), Coord(size)));
|
||||
io::writeGrid("data/funny.nvdb", createNanoGrid(grid), io::Codec::BLOSC);
|
||||
io::writeGrid("data/funny.nvdb", tools::createNanoGrid(grid), io::Codec::BLOSC);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "An exception occurred: \"" << e.what() << "\"" << std::endl;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user