Compare commits
432 Commits
buildbot-l
...
mac_arm64
Author | SHA1 | Date | |
---|---|---|---|
![]() |
14b888afea | ||
![]() |
9715ad5aca | ||
ad4928a171 | |||
75520894c7 | |||
![]() |
a2638d0f41 | ||
2811de6e5c | |||
5b099a25d7 | |||
123e29c274 | |||
54abab53bf | |||
a3d90337b8 | |||
d11a2dfe71 | |||
75a09ba2ed | |||
![]() |
79ba0c3ab0 | ||
![]() |
7880692515 | ||
![]() |
0fe3ff13c7 | ||
974e36d7d0 | |||
058514aa0a | |||
d4d810f817 | |||
37a8c6d809 | |||
47885abbe6 | |||
cd8f3c9ee7 | |||
2c1edcf3ef | |||
24c846b2b4 | |||
987d14a3b2 | |||
8e16873086 | |||
5dcf60e053 | |||
f1104c2828 | |||
eb54624a9a | |||
5057b28a2f | |||
ba100c883c | |||
a082e49671 | |||
cda6da4957 | |||
ae4098e234 | |||
36e836d0e9 | |||
19d17b217a | |||
57ec1f37e9 | |||
e06a346458 | |||
10cacbbb15 | |||
613d314251 | |||
b3c34011c0 | |||
efc6f6e1ae | |||
5a11c8ba24 | |||
87f8949f0e | |||
44bb73e765 | |||
ff2fa59689 | |||
4e8fc14120 | |||
7e2ffbfb25 | |||
50c6448781 | |||
e8b26a0501 | |||
680a81fc49 | |||
eb87b1c8f6 | |||
![]() |
920b138f83 | ||
e062def3b4 | |||
061d76f55c | |||
d493fc43bd | |||
7f67e3200a | |||
7e0289b618 | |||
98b1a716d6 | |||
dbcc74f801 | |||
0b100e21fb | |||
6cc88e330b | |||
2ba1cf4b40 | |||
797027be6b | |||
14eaa9ed63 | |||
8e9dd5492a | |||
c8a62e4f50 | |||
6068f49c33 | |||
2e8a78f4d1 | |||
78148e20fa | |||
fa7ace2215 | |||
e3fd60b182 | |||
140b26909e | |||
1e5ce39156 | |||
01ec76842f | |||
4096330b81 | |||
![]() |
a8ef8690a6 | ||
![]() |
86f207f4fd | ||
25fc84bf2e | |||
![]() |
fb94343f12 | ||
![]() |
c29ed6f71f | ||
26793d619c | |||
0fb08b7cc4 | |||
93e14e5935 | |||
5338b36fcc | |||
b818f6b55f | |||
0b24930541 | |||
37fb586a0b | |||
70992ae270 | |||
6e74a8b69f | |||
2b5e21fe00 | |||
1076952209 | |||
eb3f74a0fe | |||
8dd2386a68 | |||
fcc91faf3f | |||
91e67c7bda | |||
3d587efef2 | |||
5c8dd2a703 | |||
3dcc7c73e2 | |||
![]() |
29da019cb3 | ||
16989c4d1d | |||
952279a366 | |||
5ecefc6a07 | |||
2be7a11e43 | |||
b9f565881e | |||
9db0c36af1 | |||
03c8b048a1 | |||
9c9eb03d78 | |||
f019164f1f | |||
8074a18964 | |||
7b558a20a9 | |||
976a0ff691 | |||
f8afbb7657 | |||
0158571b34 | |||
7453ff73ad | |||
725973485a | |||
a19584a471 | |||
644a915b1b | |||
0718c6fae0 | |||
91c763af3e | |||
6dabfacb38 | |||
6a3c91f7ad | |||
7aacf2e119 | |||
192bd2605f | |||
41e6f9bd43 | |||
e2736afdbe | |||
77cd8182f8 | |||
474dcbcf12 | |||
![]() |
bc4bb7da5e | ||
![]() |
b009af1736 | ||
![]() |
b4ee86194a | ||
f319eec881 | |||
30ed51d60a | |||
21b20ae5ec | |||
ebf9082e1c | |||
838b1742fb | |||
404486e66c | |||
![]() |
bd7bffd536 | ||
ee5c2f6ead | |||
![]() |
52d469531b | ||
c7eada103c | |||
06401157a6 | |||
46b79b3d4a | |||
b920875893 | |||
8fae58ce0b | |||
16d4373158 | |||
415d3ee05b | |||
6e698653df | |||
651db1b26f | |||
020e0f11ff | |||
![]() |
9b9cbabd96 | ||
d2b910fafe | |||
3dc0178390 | |||
6fbacd6048 | |||
48f10319c6 | |||
4e8fc15586 | |||
3e4f49fe71 | |||
d5208c45fa | |||
6eeb32706a | |||
93791381fe | |||
e65c78cd43 | |||
![]() |
ad45b8d6a4 | ||
d8e648c352 | |||
9dbe9a753a | |||
5372924983 | |||
77f823a240 | |||
47e71f4623 | |||
cbfedf2139 | |||
c2304d2f02 | |||
4d1c3c029e | |||
f93e0f1a9e | |||
337e2c9029 | |||
6c1157201a | |||
45287f909c | |||
26d28ade26 | |||
c806db6313 | |||
60133ff98d | |||
295b3aefb0 | |||
7bae599232 | |||
3121015dce | |||
00eb6a56aa | |||
8fd65a2252 | |||
3edd2832b2 | |||
f62204718b | |||
8f6c0f2242 | |||
52636c3059 | |||
39b525e0f0 | |||
77a646279d | |||
9c25731781 | |||
582a0b7e5a | |||
7a9028cad1 | |||
a148c4676b | |||
03f5acd445 | |||
8b660ea0ec | |||
96068324cd | |||
89cb41faa0 | |||
3fdd092649 | |||
b0378440ce | |||
8f24ec2e26 | |||
3dd460aa7f | |||
a0d3b60015 | |||
0b77e2f4c4 | |||
92bc277950 | |||
3623db7784 | |||
03a00bda2b | |||
1e3247c078 | |||
a90b69d065 | |||
6778949e01 | |||
7b1c406b54 | |||
78b629a98f | |||
1fb667da01 | |||
e5ebaa9fd6 | |||
bd84b2cbcc | |||
13b1374497 | |||
78d48343ae | |||
2be0ae7c99 | |||
![]() |
9de09220fc | ||
42c99ec15b | |||
580d50091c | |||
31ad43a3c7 | |||
544c435fdd | |||
8ddf7556a5 | |||
ea5fe7abc1 | |||
0b8221683f | |||
0b3bf69d3c | |||
754c5d6a14 | |||
31bc76ea4e | |||
403384998a | |||
4b85ed819d | |||
f7d5d4ee3b | |||
e4926c167b | |||
f4a39cafa1 | |||
439c238bb4 | |||
05365d1376 | |||
2de5de57c5 | |||
cb3c4218bf | |||
d1f4546a59 | |||
e3e42c00cb | |||
2b9d62b73a | |||
34d175f372 | |||
840941215d | |||
36a547af7b | |||
ff133bbd33 | |||
a8ff8b64dc | |||
ff444da7c4 | |||
6435acd8f6 | |||
643196cc37 | |||
45004d82e0 | |||
50d7c00d9c | |||
01c8aa12a1 | |||
7fcb6bc59c | |||
afcb41a0aa | |||
eb5fb1741d | |||
8713109212 | |||
902ee4d13c | |||
22158162ef | |||
f4633cf46c | |||
67042aa6a1 | |||
adfae89f96 | |||
a8627ea66d | |||
4990e4dd01 | |||
ff97545c50 | |||
1e2ff4f81b | |||
0edf2fc128 | |||
dad3de89dc | |||
d352902758 | |||
1e3c0b4b03 | |||
202e7ccaae | |||
d1dcd2b464 | |||
20558848d3 | |||
630c6226e2 | |||
737bd549b6 | |||
95f0f31279 | |||
a394aac8b4 | |||
98bee41c8a | |||
70b1c09d7a | |||
f2175e06a7 | |||
02cd159539 | |||
cc311e4a52 | |||
5761cb9ee2 | |||
![]() |
80fe5e1b15 | ||
6d9a6f12b3 | |||
955abbeff2 | |||
e233ee1c1f | |||
19d4e265b6 | |||
6e609f0eb0 | |||
62774baded | |||
d212b3dc43 | |||
b28683b8b5 | |||
0c58970da7 | |||
ad0edc626d | |||
e20171e59f | |||
d557f05502 | |||
053e0c0af3 | |||
12817083ec | |||
a856de700b | |||
f6f4043924 | |||
1562c9f031 | |||
aabfd2fb9b | |||
ee3eba902a | |||
bfc644dcfb | |||
0b07f9b717 | |||
99feb10b8b | |||
20446f07f6 | |||
ffaf294c3f | |||
924578ce19 | |||
073c426900 | |||
c632cf9ccd | |||
2c0cab03ca | |||
dbe171fb26 | |||
18b6c49a90 | |||
572c48cf98 | |||
703a73fa84 | |||
80393a0eba | |||
9353477383 | |||
b51b893df8 | |||
705015e0a4 | |||
4f3045999d | |||
0f617cd67e | |||
baf124c753 | |||
247a28f242 | |||
5d79f9f276 | |||
464aaf2701 | |||
169bb4b9ce | |||
8e97694c8a | |||
9168ea8aab | |||
17603816f2 | |||
b0da78084b | |||
cad98923d0 | |||
ea65c6a153 | |||
4bf56b37ca | |||
59ef43147e | |||
57a48bd0ca | |||
d7dbf90a02 | |||
185fe9cd8b | |||
46fcc12e83 | |||
d2db481dc7 | |||
a21cb22f8b | |||
33a74941c5 | |||
367034f210 | |||
651d1aa7c8 | |||
35ce16939c | |||
a201020cd3 | |||
f254f66587 | |||
3aa53b361d | |||
bf532b1106 | |||
2f6fc5a7e8 | |||
b61ecb785c | |||
f43fedd400 | |||
4a48939f04 | |||
cad2d32be6 | |||
4a5389816b | |||
fac2e63bc0 | |||
1bdabd7b4f | |||
1019c9f582 | |||
883f9dd6e5 | |||
9739fc4d1b | |||
14fd91e7e8 | |||
f4fdb8efc5 | |||
f66aafa391 | |||
f891d4e2ad | |||
53d41e1a6f | |||
2a39b34a09 | |||
fd5b093f84 | |||
4283da83cc | |||
de7c9f41e6 | |||
19483125f8 | |||
7d0a0b8a6d | |||
f82e52ebc8 | |||
17ba566018 | |||
3a59c184b9 | |||
a33756d783 | |||
6a58e15548 | |||
88d358902f | |||
405e6c6cc9 | |||
19ff145e66 | |||
ffef562bf7 | |||
c9975088a9 | |||
1e255ce031 | |||
2633683b52 | |||
93da09d717 | |||
9dce2c9d14 | |||
20869065b8 | |||
f3b8792b96 | |||
86e7648f0e | |||
7704e6a678 | |||
395b294b61 | |||
5fbf70b0d0 | |||
d64803f63b | |||
e797c4f28f | |||
dfbb13b593 | |||
6fea8ec183 | |||
aab41401f9 | |||
ae5529c848 | |||
8e0f8bb3e1 | |||
5fa6bd8a8d | |||
6cb796e98e | |||
5dda6cefb6 | |||
a06d95987e | |||
972d1700cd | |||
4ccd96f1a4 | |||
83eeaddce8 | |||
bbeb1b2b52 | |||
468adfa4fd | |||
cdea648117 | |||
2193c37768 | |||
b1d3850333 | |||
868d6ba1a7 | |||
746aec51a7 | |||
0e1ee29f77 | |||
0f4049db5f | |||
edb49d3dc2 | |||
dfdd23bae6 | |||
9ea5469178 | |||
a272a2a6cd | |||
0fdb79fe58 | |||
a68fd2561e | |||
0961ce04cb | |||
5a13f682ee | |||
![]() |
a07922159d | ||
![]() |
1278657cc2 | ||
![]() |
3ea302cf8e | ||
![]() |
f3e4a3473e | ||
ef0ec01461 | |||
33f36b453a | |||
c5ec8d91bd | |||
85980743b0 | |||
95f3397a68 | |||
7099459245 | |||
![]() |
17b89f6dac | ||
35481fde40 | |||
a4fe8ef236 | |||
06de1bddae |
45
.clang-tidy
Normal file
45
.clang-tidy
Normal file
@@ -0,0 +1,45 @@
|
||||
Checks: >
|
||||
-*,
|
||||
readability-*,
|
||||
-readability-uppercase-literal-suffix,
|
||||
-readability-magic-numbers,
|
||||
-readability-isolate-declaration,
|
||||
-readability-convert-member-functions-to-static,
|
||||
-readability-implicit-bool-conversion,
|
||||
-readability-avoid-const-params-in-decls,
|
||||
-readability-simplify-boolean-expr,
|
||||
-readability-make-member-function-const,
|
||||
|
||||
-readability-misleading-indentation,
|
||||
|
||||
-readability-else-after-return,
|
||||
-readability-inconsistent-declaration-parameter-name,
|
||||
-readability-redundant-preprocessor,
|
||||
-readability-function-size,
|
||||
-readability-function-size,
|
||||
-readability-redundant-string-init,
|
||||
-readability-redundant-member-init,
|
||||
-readability-const-return-type,
|
||||
-readability-static-accessed-through-instance,
|
||||
-readability-redundant-declaration,
|
||||
-readability-qualified-auto,
|
||||
-readability-use-anyofallof,
|
||||
|
||||
bugprone-*,
|
||||
-bugprone-narrowing-conversions,
|
||||
-bugprone-unhandled-self-assignment,
|
||||
-bugprone-branch-clone,
|
||||
-bugprone-macro-parentheses,
|
||||
-bugprone-reserved-identifier,
|
||||
|
||||
-bugprone-sizeof-expression,
|
||||
-bugprone-integer-division,
|
||||
-bugprone-incorrect-roundings,
|
||||
-bugprone-suspicious-string-compare,
|
||||
-bugprone-not-null-terminated-result,
|
||||
-bugprone-suspicious-missing-comma,
|
||||
-bugprone-parent-virtual-call,
|
||||
-bugprone-infinite-loop,
|
||||
-bugprone-copy-constructor-init,
|
||||
|
||||
WarningsAsErrors: '*'
|
@@ -415,6 +415,11 @@ mark_as_advanced(WITH_CXX_GUARDEDALLOC)
|
||||
option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" ON)
|
||||
mark_as_advanced(WITH_ASSERT_ABORT)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
option(WITH_CLANG_TIDY "Use Clang Tidy to analyze the source code (only enable for development on Linux using Clang)" OFF)
|
||||
mark_as_advanced(WITH_CLANG_TIDY)
|
||||
endif()
|
||||
|
||||
option(WITH_BOOST "Enable features depending on boost" ON)
|
||||
option(WITH_TBB "Enable features depending on TBB (OpenVDB, OpenImageDenoise, sculpt multithreading)" ON)
|
||||
|
||||
@@ -895,7 +900,7 @@ if(MSVC)
|
||||
# endianess-detection and auto-setting is counterproductive
|
||||
# so we just set endianness according CMAKE_OSX_ARCHITECTURES
|
||||
|
||||
elseif(CMAKE_OSX_ARCHITECTURES MATCHES i386 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
|
||||
elseif(CMAKE_OSX_ARCHITECTURES MATCHES i386 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64 OR CMAKE_OSX_ARCHITECTURES MATCHES arm64)
|
||||
add_definitions(-D__LITTLE_ENDIAN__)
|
||||
elseif(CMAKE_OSX_ARCHITECTURES MATCHES ppc OR CMAKE_OSX_ARCHITECTURES MATCHES ppc64)
|
||||
add_definitions(-D__BIG_ENDIAN__)
|
||||
|
@@ -30,7 +30,7 @@
|
||||
# build_deps 2015 x64 / build_deps 2015 x86
|
||||
#
|
||||
# MAC OS X USAGE:
|
||||
# Install with homebrew: brew install cmake autoconf automake libtool yasm nasm
|
||||
# Install with homebrew: brew install cmake autoconf automake libtool yasm nasm bison
|
||||
# Run "make deps" from main Blender directory
|
||||
#
|
||||
# LINUX USAGE:
|
||||
@@ -76,6 +76,7 @@ include(cmake/llvm.cmake)
|
||||
include(cmake/clang.cmake)
|
||||
if(APPLE)
|
||||
include(cmake/openmp.cmake)
|
||||
include(cmake/nasm.cmake)
|
||||
endif()
|
||||
include(cmake/openimageio.cmake)
|
||||
include(cmake/tiff.cmake)
|
||||
@@ -93,9 +94,11 @@ if(UNIX)
|
||||
else()
|
||||
include(cmake/pugixml.cmake)
|
||||
endif()
|
||||
include(cmake/ispc.cmake)
|
||||
include(cmake/openimagedenoise.cmake)
|
||||
include(cmake/embree.cmake)
|
||||
if((NOT APPLE) OR ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64"))
|
||||
include(cmake/ispc.cmake)
|
||||
include(cmake/openimagedenoise.cmake)
|
||||
include(cmake/embree.cmake)
|
||||
endif()
|
||||
if(NOT APPLE)
|
||||
include(cmake/xr_openxr.cmake)
|
||||
endif()
|
||||
|
@@ -44,7 +44,7 @@ if(WIN32)
|
||||
elseif(APPLE)
|
||||
set(BOOST_CONFIGURE_COMMAND ./bootstrap.sh)
|
||||
set(BOOST_BUILD_COMMAND ./b2)
|
||||
set(BOOST_BUILD_OPTIONS toolset=darwin cxxflags=${PLATFORM_CXXFLAGS} linkflags=${PLATFORM_LDFLAGS} visibility=global --disable-icu boost.locale.icu=off)
|
||||
set(BOOST_BUILD_OPTIONS toolset=clang-darwin cxxflags=${PLATFORM_CXXFLAGS} linkflags=${PLATFORM_LDFLAGS} visibility=global --disable-icu boost.locale.icu=off)
|
||||
set(BOOST_HARVEST_CMD echo .)
|
||||
set(BOOST_PATCH_COMMAND echo .)
|
||||
else()
|
||||
|
@@ -30,6 +30,7 @@ if(UNIX)
|
||||
nasm
|
||||
yasm
|
||||
tclsh
|
||||
bison
|
||||
)
|
||||
|
||||
foreach(_software ${_required_software})
|
||||
@@ -40,6 +41,12 @@ if(UNIX)
|
||||
unset(_software_find CACHE)
|
||||
endforeach()
|
||||
|
||||
if(APPLE)
|
||||
if(NOT EXISTS "/usr/local/opt/bison/bin/bison")
|
||||
set(_software_missing "${_software_missing} bison")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(_software_missing)
|
||||
message(
|
||||
"\n"
|
||||
@@ -50,7 +57,7 @@ if(UNIX)
|
||||
" apt install autoconf automake libtool yasm nasm tcl\n"
|
||||
"\n"
|
||||
"On macOS (with homebrew):\n"
|
||||
" brew install cmake autoconf automake libtool yasm nasm\n"
|
||||
" brew install cmake autoconf automake libtool yasm nasm bison\n"
|
||||
"\n"
|
||||
"Other platforms:\n"
|
||||
" Install equivalent packages.\n")
|
||||
|
@@ -30,6 +30,11 @@ else()
|
||||
set(CLANG_GENERATOR "Unix Makefiles")
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
set(CLANG_EXTRA_ARGS ${CLANG_EXTRA_ARGS}
|
||||
-DLIBXML2_LIBRARY=${LIBDIR}/xml2/lib/libxml2.a
|
||||
)
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(external_clang
|
||||
URL ${CLANG_URI}
|
||||
|
@@ -50,7 +50,8 @@ if(APPLE)
|
||||
set(FFMPEG_EXTRA_FLAGS
|
||||
${FFMPEG_EXTRA_FLAGS}
|
||||
--target-os=darwin
|
||||
)
|
||||
--x86asmexe=${LIBDIR}/nasm/bin/nasm
|
||||
)
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(external_ffmpeg
|
||||
@@ -143,6 +144,12 @@ if(WIN32)
|
||||
external_zlib_mingw
|
||||
)
|
||||
endif()
|
||||
if(APPLE)
|
||||
add_dependencies(
|
||||
external_ffmpeg
|
||||
external_nasm
|
||||
)
|
||||
endif()
|
||||
|
||||
if(BUILD_MODE STREQUAL Release AND WIN32)
|
||||
ExternalProject_Add_Step(external_ffmpeg after_install
|
||||
|
@@ -24,7 +24,8 @@ set(FREETYPE_EXTRA_ARGS
|
||||
-DFT_WITH_HARFBUZZ=OFF
|
||||
-DFT_WITH_BZIP2=OFF
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=TRUE
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_BZip2=TRUE)
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_BZip2=TRUE
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_BrotliDec=TRUE)
|
||||
|
||||
ExternalProject_Add(external_freetype
|
||||
URL ${FREETYPE_URI}
|
||||
|
@@ -132,8 +132,12 @@ harvest(openimageio/bin openimageio/bin "maketx")
|
||||
harvest(openimageio/bin openimageio/bin "oiiotool")
|
||||
harvest(openimageio/include openimageio/include "*")
|
||||
harvest(openimageio/lib openimageio/lib "*.a")
|
||||
harvest(openimagedenoise/include openimagedenoise/include "*")
|
||||
harvest(openimagedenoise/lib openimagedenoise/lib "*.a")
|
||||
if((NOT APPLE) OR ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64"))
|
||||
harvest(openimagedenoise/include openimagedenoise/include "*")
|
||||
harvest(openimagedenoise/lib openimagedenoise/lib "*.a")
|
||||
harvest(embree/include embree/include "*.h")
|
||||
harvest(embree/lib embree/lib "*.a")
|
||||
endif()
|
||||
harvest(openjpeg/include/openjpeg-2.3 openjpeg/include "*.h")
|
||||
harvest(openjpeg/lib openjpeg/lib "*.a")
|
||||
harvest(opensubdiv/include opensubdiv/include "*.h")
|
||||
@@ -168,8 +172,6 @@ harvest(vpx/lib ffmpeg/lib "*.a")
|
||||
harvest(webp/lib ffmpeg/lib "*.a")
|
||||
harvest(x264/lib ffmpeg/lib "*.a")
|
||||
harvest(xvidcore/lib ffmpeg/lib "*.a")
|
||||
harvest(embree/include embree/include "*.h")
|
||||
harvest(embree/lib embree/lib "*.a")
|
||||
harvest(usd/include usd/include "*.h")
|
||||
harvest(usd/lib/usd usd/lib/usd "*")
|
||||
harvest(usd/plugin usd/plugin "*")
|
||||
|
@@ -22,6 +22,17 @@ if(WIN32)
|
||||
-DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe
|
||||
-DM4_EXECUTABLE=${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/m4.exe
|
||||
)
|
||||
elseif(APPLE)
|
||||
# Use bison installed via Homebrew.
|
||||
# The one which comes which Xcode toolset is too old.
|
||||
set(ISPC_EXTRA_ARGS_APPLE
|
||||
-DBISON_EXECUTABLE=/usr/local/opt/bison/bin/bison
|
||||
)
|
||||
elseif(UNIX)
|
||||
set(ISPC_EXTRA_ARGS_UNIX
|
||||
-DCMAKE_C_COMPILER=${LIBDIR}/clang/bin/clang
|
||||
-DCMAKE_CXX_COMPILER=${LIBDIR}/clang/bin/clang++
|
||||
)
|
||||
endif()
|
||||
|
||||
set(ISPC_EXTRA_ARGS
|
||||
@@ -36,6 +47,8 @@ set(ISPC_EXTRA_ARGS
|
||||
-DCLANG_LIBRARY_DIR=${LIBDIR}/clang/lib
|
||||
-DCLANG_INCLUDE_DIRS=${LIBDIR}/clang/include
|
||||
${ISPC_EXTRA_ARGS_WIN}
|
||||
${ISPC_EXTRA_ARGS_APPLE}
|
||||
${ISPC_EXTRA_ARGS_UNIX}
|
||||
)
|
||||
|
||||
ExternalProject_Add(external_ispc
|
||||
|
@@ -16,11 +16,17 @@
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
if(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(LLVM_TARGETS AArch64)
|
||||
else()
|
||||
set(LLVM_TARGETS X86)
|
||||
endif()
|
||||
|
||||
set(LLVM_EXTRA_ARGS
|
||||
-DLLVM_USE_CRT_RELEASE=MD
|
||||
-DLLVM_USE_CRT_DEBUG=MDd
|
||||
-DLLVM_INCLUDE_TESTS=OFF
|
||||
-DLLVM_TARGETS_TO_BUILD=X86
|
||||
-DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS}
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF
|
||||
-DLLVM_ENABLE_TERMINFO=OFF
|
||||
-DLLVM_BUILD_LLVM_C_DYLIB=OFF
|
||||
|
29
build_files/build_environment/cmake/nasm.cmake
Normal file
29
build_files/build_environment/cmake/nasm.cmake
Normal file
@@ -0,0 +1,29 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
ExternalProject_Add(external_nasm
|
||||
URL ${NASM_URI}
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH SHA256=${NASM_HASH}
|
||||
PREFIX ${BUILD_DIR}/nasm
|
||||
PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d ${BUILD_DIR}/nasm/src/external_nasm < ${PATCH_DIR}/nasm.diff
|
||||
CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/nasm
|
||||
BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make -j${MAKE_THREADS}
|
||||
INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make install
|
||||
INSTALL_DIR ${LIBDIR}/nasm
|
||||
)
|
@@ -38,6 +38,7 @@ ExternalProject_Add(external_numpy
|
||||
PREFIX ${BUILD_DIR}/numpy
|
||||
PATCH_COMMAND ${NUMPY_PATCH}
|
||||
CONFIGURE_COMMAND ""
|
||||
PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/numpy/src/external_numpy < ${PATCH_DIR}/numpy.diff
|
||||
LOG_BUILD 1
|
||||
BUILD_COMMAND ${PYTHON_BINARY} ${BUILD_DIR}/numpy/src/external_numpy/setup.py build ${NUMPY_BUILD_OPTION} install --old-and-unmanageable
|
||||
INSTALL_COMMAND ""
|
||||
|
@@ -21,6 +21,7 @@ ExternalProject_Add(external_ogg
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH SHA256=${OGG_HASH}
|
||||
PREFIX ${BUILD_DIR}/ogg
|
||||
PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d ${BUILD_DIR}/ogg/src/external_ogg < ${PATCH_DIR}/ogg.diff
|
||||
CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ogg/src/external_ogg/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/ogg --disable-shared --enable-static
|
||||
BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ogg/src/external_ogg/ && make -j${MAKE_THREADS}
|
||||
INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ogg/src/external_ogg/ && make install
|
||||
|
@@ -30,6 +30,13 @@ set(OPENCOLORIO_EXTRA_ARGS
|
||||
-DOCIO_STATIC_JNIGLUE=OFF
|
||||
)
|
||||
|
||||
if(APPLE AND NOT("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64"))
|
||||
set(OPENCOLORIO_EXTRA_ARGS
|
||||
${OPENCOLORIO_EXTRA_ARGS}
|
||||
-DOCIO_USE_SSE=OFF
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
set(OCIO_PATCH opencolorio_win.diff)
|
||||
set(OPENCOLORIO_EXTRA_ARGS
|
||||
|
@@ -22,6 +22,7 @@ ExternalProject_Add(external_openmp
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH MD5=${OPENMP_HASH}
|
||||
PREFIX ${BUILD_DIR}/openmp
|
||||
PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openmp/src/external_openmp < ${PATCH_DIR}/openmp.diff
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openmp ${DEFAULT_CMAKE_FLAGS}
|
||||
INSTALL_COMMAND cd ${BUILD_DIR}/openmp/src/external_openmp-build && install_name_tool -id @executable_path/../Resources/lib/libomp.dylib runtime/src/libomp.dylib && make install
|
||||
INSTALL_DIR ${LIBDIR}/openmp
|
||||
|
@@ -113,16 +113,32 @@ else()
|
||||
COMMAND xcode-select --print-path
|
||||
OUTPUT_VARIABLE XCODE_DEV_PATH OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
set(OSX_ARCHITECTURES x86_64)
|
||||
set(OSX_DEPLOYMENT_TARGET 10.11)
|
||||
execute_process(
|
||||
COMMAND xcodebuild -version -sdk macosx SDKVersion
|
||||
OUTPUT_VARIABLE MACOSX_SDK_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
if(NOT CMAKE_OSX_ARCHITECTURES)
|
||||
execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "Detected native architecture ${ARCHITECTURE}.")
|
||||
set(CMAKE_OSX_ARCHITECTURES "${ARCHITECTURE}")
|
||||
endif()
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")
|
||||
set(OSX_DEPLOYMENT_TARGET 10.13)
|
||||
else()
|
||||
set(OSX_DEPLOYMENT_TARGET 11.00)
|
||||
endif()
|
||||
set(OSX_SYSROOT ${XCODE_DEV_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk)
|
||||
|
||||
set(PLATFORM_CFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET}")
|
||||
set(PLATFORM_CXXFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET} -std=c++11 -stdlib=libc++")
|
||||
set(PLATFORM_LDFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET}")
|
||||
set(PLATFORM_BUILD_TARGET --build=x86_64-apple-darwin15.0.0) # OS X 10.11
|
||||
set(PLATFORM_CFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET} -arch ${CMAKE_OSX_ARCHITECTURES}")
|
||||
set(PLATFORM_CXXFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET} -std=c++11 -stdlib=libc++ -arch ${CMAKE_OSX_ARCHITECTURES}")
|
||||
set(PLATFORM_LDFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET} -arch ${CMAKE_OSX_ARCHITECTURES}")
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")
|
||||
set(PLATFORM_BUILD_TARGET --build=x86_64-apple-darwin17.0.0) # OS X 10.13
|
||||
else()
|
||||
set(PLATFORM_BUILD_TARGET --build=aarch64-apple-darwin20.0.0) # macOS 11.00
|
||||
endif()
|
||||
set(PLATFORM_CMAKE_FLAGS
|
||||
-DCMAKE_OSX_ARCHITECTURES:STRING=${OSX_ARCHITECTURES}
|
||||
-DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${OSX_DEPLOYMENT_TARGET}
|
||||
-DCMAKE_OSX_SYSROOT:PATH=${OSX_SYSROOT}
|
||||
)
|
||||
@@ -155,6 +171,7 @@ else()
|
||||
|
||||
set(CONFIGURE_ENV
|
||||
export MACOSX_DEPLOYMENT_TARGET=${OSX_DEPLOYMENT_TARGET} &&
|
||||
export MACOSX_SDK_VERSION=${OSX_DEPLOYMENT_TARGET} &&
|
||||
export CFLAGS=${PLATFORM_CFLAGS} &&
|
||||
export CXXFLAGS=${PLATFORM_CXXFLAGS} &&
|
||||
export LDFLAGS=${PLATFORM_LDFLAGS}
|
||||
|
@@ -22,6 +22,10 @@ set(PNG_EXTRA_ARGS
|
||||
-DPNG_STATIC=ON
|
||||
)
|
||||
|
||||
if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64"))
|
||||
set(PNG_EXTRA_ARGS ${PNG_EXTRA_ARGS} -DPNG_HARDWARE_OPTIMIZATIONS=ON -DPNG_ARM_NEON=on -DCMAKE_SYSTEM_PROCESSOR="aarch64")
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(external_png
|
||||
URL ${PNG_URI}
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
|
@@ -48,7 +48,12 @@ if(WIN32)
|
||||
|
||||
else()
|
||||
if(APPLE)
|
||||
# disable functions that can be in 10.13 sdk but aren't available on 10.9 target
|
||||
# Disable functions that can be in 10.13 sdk but aren't available on 10.9 target.
|
||||
#
|
||||
# Disable libintl (gettext library) as it might come from Homebrew, which makes
|
||||
# it so test program compiles, but the Python does not. This is because for Python
|
||||
# we use isysroot, which seems to forbid using libintl.h.
|
||||
# The gettext functionality seems to come from CoreFoundation, so should be all fine.
|
||||
set(PYTHON_FUNC_CONFIGS
|
||||
export ac_cv_func_futimens=no &&
|
||||
export ac_cv_func_utimensat=no &&
|
||||
@@ -60,13 +65,21 @@ else()
|
||||
export ac_cv_func_getentropy=no &&
|
||||
export ac_cv_func_mkostemp=no &&
|
||||
export ac_cv_func_mkostemps=no &&
|
||||
export ac_cv_func_timingsafe_bcmp=no)
|
||||
export ac_cv_func_timingsafe_bcmp=no &&
|
||||
export ac_cv_header_libintl_h=no &&
|
||||
export ac_cv_lib_intl_textdomain=no
|
||||
)
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(PYTHON_FUNC_CONFIGS ${PYTHON_FUNC_CONFIGS} && export PYTHON_DECIMAL_WITH_MACHINE=ansi64)
|
||||
endif()
|
||||
set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV} && ${PYTHON_FUNC_CONFIGS})
|
||||
set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python.exe)
|
||||
set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_macos.diff)
|
||||
else()
|
||||
set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV})
|
||||
set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python)
|
||||
endif()
|
||||
set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff)
|
||||
endif()
|
||||
|
||||
set(PYTHON_CONFIGURE_EXTRA_ARGS "--with-openssl=${LIBDIR}/ssl")
|
||||
set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include")
|
||||
@@ -76,7 +89,6 @@ else()
|
||||
export CPPFLAGS=${PYTHON_CFLAGS} &&
|
||||
export LDFLAGS=${PYTHON_LDFLAGS} &&
|
||||
export PKG_CONFIG_PATH=${LIBDIR}/ffi/lib/pkgconfig)
|
||||
set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff)
|
||||
|
||||
ExternalProject_Add(external_python
|
||||
URL ${PYTHON_URI}
|
||||
|
@@ -51,7 +51,7 @@ ExternalProject_Add(external_sqlite
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH SHA1=${SQLITE_HASH}
|
||||
PREFIX ${BUILD_DIR}/sqlite
|
||||
PATCH_COMMAND ${SQLITE_PATCH_CMD}
|
||||
PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/sqlite/src/external_sqlite < ${PATCH_DIR}/sqlite.diff
|
||||
CONFIGURE_COMMAND ${SQLITE_CONFIGURE_ENV} && cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/sqlite ${SQLITE_CONFIGURATION_ARGS}
|
||||
BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && make -j${MAKE_THREADS}
|
||||
INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && make install
|
||||
|
@@ -20,7 +20,7 @@ set(SSL_CONFIGURE_COMMAND ./Configure)
|
||||
set(SSL_PATCH_CMD echo .)
|
||||
|
||||
if(APPLE)
|
||||
set(SSL_OS_COMPILER "blender-darwin-x86_64")
|
||||
set(SSL_OS_COMPILER "blender-darwin-${CMAKE_OSX_ARCHITECTURES}")
|
||||
else()
|
||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||
set(SSL_EXTRA_ARGS enable-ec_nistp_64_gcc_128)
|
||||
|
@@ -12,4 +12,9 @@ my %targets = (
|
||||
inherit_from => [ "darwin64-x86_64-cc" ],
|
||||
cflags => add("-fPIC"),
|
||||
},
|
||||
"blender-darwin-arm64" => {
|
||||
inherit_from => [ "darwin-common" ],
|
||||
cxxflags => add("-fPIC -arch arm64"),
|
||||
cflags => add("-fPIC -arch arm64"),
|
||||
},
|
||||
);
|
||||
|
@@ -27,6 +27,7 @@ ExternalProject_Add(external_theora
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH SHA256=${THEORA_HASH}
|
||||
PREFIX ${BUILD_DIR}/theora
|
||||
PATCH_COMMAND ${PATCH_CMD} -p 0 -d ${BUILD_DIR}/theora/src/external_theora < ${PATCH_DIR}/theora.diff
|
||||
CONFIGURE_COMMAND ${THEORA_CONFIGURE_ENV} && cd ${BUILD_DIR}/theora/src/external_theora/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/theora
|
||||
--disable-shared
|
||||
--enable-static
|
||||
|
@@ -16,6 +16,12 @@
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
if(WITH_WEBP)
|
||||
set(WITH_TIFF_WEBP ON)
|
||||
else()
|
||||
set(WITH_TIFF_WEBP OFF)
|
||||
endif()
|
||||
|
||||
set(TIFF_EXTRA_ARGS
|
||||
-DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY}
|
||||
-DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include
|
||||
@@ -23,6 +29,8 @@ set(TIFF_EXTRA_ARGS
|
||||
-DBUILD_SHARED_LIBS=OFF
|
||||
-Dlzma=OFF
|
||||
-Djbig=OFF
|
||||
-Dzstd=OFF
|
||||
-Dwebp=${WITH_TIFF_WEBP}
|
||||
)
|
||||
|
||||
ExternalProject_Add(external_tiff
|
||||
|
@@ -305,6 +305,10 @@ set(MESA_VERSION 18.3.1)
|
||||
set(MESA_URI ftp://ftp.freedesktop.org/pub/mesa//mesa-${MESA_VERSION}.tar.xz)
|
||||
set(MESA_HASH d60828056d77bfdbae0970f9b15fb1be)
|
||||
|
||||
set(NASM_VERSION 2.15.02)
|
||||
set(NASM_URI https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/nasm-${NASM_VERSION}.tar.xz)
|
||||
set(NASM_HASH f4fd1329b1713e1ccd34b2fc121c4bcd278c9f91cc4cb205ae8fcd2e4728dd14)
|
||||
|
||||
set(XR_OPENXR_SDK_VERSION 1.0.8)
|
||||
set(XR_OPENXR_SDK_URI https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_SDK_VERSION}.tar.gz)
|
||||
set(XR_OPENXR_SDK_HASH c6de63d2e0f9029aa58dfa97cad8ce07)
|
||||
|
@@ -24,7 +24,11 @@ if(WIN32)
|
||||
endif()
|
||||
else()
|
||||
if(APPLE)
|
||||
set(VPX_EXTRA_FLAGS --target=x86_64-darwin13-gcc)
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(VPX_EXTRA_FLAGS --target=generic-gnu)
|
||||
else()
|
||||
set(VPX_EXTRA_FLAGS --target=x86_64-darwin17-gcc)
|
||||
endif()
|
||||
else()
|
||||
set(VPX_EXTRA_FLAGS --target=generic-gnu)
|
||||
endif()
|
||||
|
@@ -21,12 +21,26 @@ if(WIN32)
|
||||
endif()
|
||||
|
||||
|
||||
if(APPLE)
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(X264_EXTRA_ARGS ${X264_EXTRA_ARGS} "--disable-asm")
|
||||
set(X264_CONFIGURE_ENV echo .)
|
||||
else()
|
||||
set(X264_CONFIGURE_ENV
|
||||
export AS=${LIBDIR}/nasm/bin/nasm
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
set(X264_CONFIGURE_ENV echo .)
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(external_x264
|
||||
URL ${X264_URI}
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH SHA256=${X264_HASH}
|
||||
PREFIX ${BUILD_DIR}/x264
|
||||
CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/x264/src/external_x264/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/x264
|
||||
CONFIGURE_COMMAND ${CONFIGURE_ENV} && ${X264_CONFIGURE_ENV} && cd ${BUILD_DIR}/x264/src/external_x264/ &&
|
||||
${CONFIGURE_COMMAND} --prefix=${LIBDIR}/x264
|
||||
--enable-static
|
||||
--enable-pic
|
||||
--disable-lavf
|
||||
@@ -39,3 +53,10 @@ ExternalProject_Add(external_x264
|
||||
if(MSVC)
|
||||
set_target_properties(external_x264 PROPERTIES FOLDER Mingw)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
add_dependencies(
|
||||
external_x264
|
||||
external_nasm
|
||||
)
|
||||
endif()
|
||||
|
@@ -91,3 +91,41 @@ diff -Naur external_blosc.orig/blosc/blosc.c external_blosc/blosc/blosc.c
|
||||
|
||||
|
||||
/* Some useful units */
|
||||
diff --git a/blosc/shuffle.c b/blosc/shuffle.c
|
||||
index 84b5095..23053b4 100644
|
||||
--- a/blosc/shuffle.c
|
||||
+++ b/blosc/shuffle.c
|
||||
@@ -490,12 +490,12 @@ void unshuffle(size_t bytesoftype, size_t blocksize,
|
||||
#else /* no __SSE2__ available */
|
||||
|
||||
void shuffle(size_t bytesoftype, size_t blocksize,
|
||||
- uint8_t* _src, uint8_t* _dest) {
|
||||
+ const uint8_t* _src, uint8_t* _dest) {
|
||||
_shuffle(bytesoftype, blocksize, _src, _dest);
|
||||
}
|
||||
|
||||
void unshuffle(size_t bytesoftype, size_t blocksize,
|
||||
- uint8_t* _src, uint8_t* _dest) {
|
||||
+ const uint8_t* _src, uint8_t* _dest) {
|
||||
_unshuffle(bytesoftype, blocksize, _src, _dest);
|
||||
}
|
||||
--- a/cmake/FindSSE.cmake
|
||||
+++ b/cmake/FindSSE.cmake
|
||||
@@ -49,6 +49,17 @@
|
||||
set(AVX_FOUND false CACHE BOOL "AVX available on host")
|
||||
ENDIF (AVX_TRUE)
|
||||
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||
+ execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
+ message(STATUS "Detected architecture ${ARCHITECTURE}")
|
||||
+ IF("${ARCHITECTURE}" STREQUAL "arm64")
|
||||
+ set(SSE2_FOUND false CACHE BOOL "SSE2 available on host")
|
||||
+ set(SSE3_FOUND false CACHE BOOL "SSE3 available on host")
|
||||
+ set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host")
|
||||
+ set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host")
|
||||
+ set(AVX_FOUND false CACHE BOOL "AVX available on host")
|
||||
+ return()
|
||||
+ ENDIF()
|
||||
+
|
||||
EXEC_PROGRAM("/usr/sbin/sysctl -n machdep.cpu.features" OUTPUT_VARIABLE
|
||||
CPUINFO)
|
||||
|
@@ -9,3 +9,62 @@
|
||||
enabled libopenmpt && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++"
|
||||
enabled libopus && {
|
||||
enabled libopus_decoder && {
|
||||
--- a/libavcodec/cfhddata.c
|
||||
+++ b/libavcodec/cfhddata.c
|
||||
@@ -276,10 +276,10 @@
|
||||
av_cold int ff_cfhd_init_vlcs(CFHDContext *s)
|
||||
{
|
||||
int i, j, ret = 0;
|
||||
- uint32_t new_cfhd_vlc_bits[NB_VLC_TABLE_18 * 2];
|
||||
- uint8_t new_cfhd_vlc_len[NB_VLC_TABLE_18 * 2];
|
||||
- uint16_t new_cfhd_vlc_run[NB_VLC_TABLE_18 * 2];
|
||||
- int16_t new_cfhd_vlc_level[NB_VLC_TABLE_18 * 2];
|
||||
+ uint32_t *new_cfhd_vlc_bits = av_calloc(sizeof(uint32_t), NB_VLC_TABLE_18 * 2);
|
||||
+ uint8_t *new_cfhd_vlc_len = av_calloc(sizeof(uint8_t), NB_VLC_TABLE_18 * 2);
|
||||
+ uint16_t *new_cfhd_vlc_run = av_calloc(sizeof(uint16_t), NB_VLC_TABLE_18 * 2);
|
||||
+ int16_t *new_cfhd_vlc_level = av_calloc(sizeof(int16_t), NB_VLC_TABLE_18 * 2);
|
||||
|
||||
/** Similar to dv.c, generate signed VLC tables **/
|
||||
|
||||
@@ -305,8 +305,13 @@
|
||||
|
||||
ret = init_vlc(&s->vlc_9, VLC_BITS, j, new_cfhd_vlc_len,
|
||||
1, 1, new_cfhd_vlc_bits, 4, 4, 0);
|
||||
- if (ret < 0)
|
||||
+ if (ret < 0) {
|
||||
+ av_free(new_cfhd_vlc_bits);
|
||||
+ av_free(new_cfhd_vlc_len);
|
||||
+ av_free(new_cfhd_vlc_run);
|
||||
+ av_free(new_cfhd_vlc_level);
|
||||
return ret;
|
||||
+ }
|
||||
for (i = 0; i < s->vlc_9.table_size; i++) {
|
||||
int code = s->vlc_9.table[i][0];
|
||||
int len = s->vlc_9.table[i][1];
|
||||
@@ -346,8 +351,14 @@
|
||||
|
||||
ret = init_vlc(&s->vlc_18, VLC_BITS, j, new_cfhd_vlc_len,
|
||||
1, 1, new_cfhd_vlc_bits, 4, 4, 0);
|
||||
- if (ret < 0)
|
||||
+ if (ret < 0) {
|
||||
+ av_free(new_cfhd_vlc_bits);
|
||||
+ av_free(new_cfhd_vlc_len);
|
||||
+ av_free(new_cfhd_vlc_run);
|
||||
+ av_free(new_cfhd_vlc_level);
|
||||
return ret;
|
||||
+ }
|
||||
+
|
||||
av_assert0(s->vlc_18.table_size == 4572);
|
||||
|
||||
for (i = 0; i < s->vlc_18.table_size; i++) {
|
||||
@@ -367,5 +378,10 @@
|
||||
s->table_18_rl_vlc[i].run = run;
|
||||
}
|
||||
|
||||
+ av_free(new_cfhd_vlc_bits);
|
||||
+ av_free(new_cfhd_vlc_len);
|
||||
+ av_free(new_cfhd_vlc_run);
|
||||
+ av_free(new_cfhd_vlc_level);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
@@ -34,3 +34,52 @@ diff -Naur orig/cmake/GenerateBuiltins.cmake.txt external_ispc/cmake/GenerateBui
|
||||
elseif ("${bit}" STREQUAL "64" AND ${arch} STREQUAL "x86")
|
||||
set(target_arch "x86_64")
|
||||
elseif ("${bit}" STREQUAL "32" AND ${arch} STREQUAL "arm")
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 46a8db8..f53beef 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -36,8 +36,12 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
if (UNIX)
|
||||
- set(CMAKE_C_COMPILER "clang")
|
||||
- set(CMAKE_CXX_COMPILER "clang++")
|
||||
+ if (NOT CMAKE_C_COMPILER)
|
||||
+ set(CMAKE_C_COMPILER "clang")
|
||||
+ endif()
|
||||
+ if (NOT CMAKE_CXX_COMPILER)
|
||||
+ set(CMAKE_CXX_COMPILER "clang++")
|
||||
+ endif()
|
||||
endif()
|
||||
|
||||
set(PROJECT_NAME ispc)
|
||||
@@ -412,6 +416,29 @@ else()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
+# Link against libstdc++.a which must be provided to the linker after
|
||||
+# LLVM and CLang libraries.
|
||||
+# This is needed because some of LLVM/CLang dependencies are using
|
||||
+# std::make_shared, which is defined in one of those:
|
||||
+# - libclang-cpp.so
|
||||
+# - libstdc++.a
|
||||
+# Using the former one is tricky because then generated binary depends
|
||||
+# on a library which is outside of the LD_LIBRARY_PATH.
|
||||
+#
|
||||
+# Hence, using C++ implementation from G++ which seems to work just fine.
|
||||
+# In fact, from investigation seems that libclang-cpp.so itself is pulling
|
||||
+# std::_Sp_make_shared_tag from G++'s libstdc++.a.
|
||||
+if(UNIX AND NOT APPLE)
|
||||
+ execute_process(
|
||||
+ COMMAND g++ --print-file-name libstdc++.a
|
||||
+ OUTPUT_VARIABLE GCC_LIBSTDCXX_A
|
||||
+ OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
+ )
|
||||
+ if(GCC_LIBSTDCXX_A AND EXISTS ${GCC_LIBSTDCXX_A})
|
||||
+ target_link_libraries(${PROJECT_NAME} ${GCC_LIBSTDCXX_A})
|
||||
+ endif()
|
||||
+endif()
|
||||
+
|
||||
# Build target for utility checking host ISA
|
||||
if (ISPC_INCLUDE_UTILS)
|
||||
add_executable(check_isa "")
|
||||
|
129
build_files/build_environment/patches/nasm.diff
Normal file
129
build_files/build_environment/patches/nasm.diff
Normal file
@@ -0,0 +1,129 @@
|
||||
diff --git a/output/macho.h b/output/macho.h
|
||||
index 538c531e..fd5e8849 100644
|
||||
--- a/output/macho.h
|
||||
+++ b/output/macho.h
|
||||
@@ -60,6 +60,8 @@
|
||||
#define LC_SEGMENT 0x1
|
||||
#define LC_SEGMENT_64 0x19
|
||||
#define LC_SYMTAB 0x2
|
||||
+#define LC_VERSION_MIN_MACOSX 0x24
|
||||
+#define LC_BUILD_VERSION 0x32
|
||||
|
||||
/* Symbol type bits */
|
||||
#define N_STAB 0xe0
|
||||
diff --git a/output/outmacho.c b/output/outmacho.c
|
||||
index 08147883..de6ec902 100644
|
||||
--- a/output/outmacho.c
|
||||
+++ b/output/outmacho.c
|
||||
@@ -38,6 +38,8 @@
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
#include "nctype.h"
|
||||
|
||||
#include "nasm.h"
|
||||
@@ -64,6 +66,8 @@
|
||||
#define MACHO_SYMCMD_SIZE 24
|
||||
#define MACHO_NLIST_SIZE 12
|
||||
#define MACHO_RELINFO_SIZE 8
|
||||
+#define MACHO_BUILD_VERSION_SIZE 24
|
||||
+#define MACHO_VERSION_MIN_MACOSX_SIZE 16
|
||||
|
||||
#define MACHO_HEADER64_SIZE 32
|
||||
#define MACHO_SEGCMD64_SIZE 72
|
||||
@@ -1224,6 +1228,46 @@ static void macho_layout_symbols (uint32_t *numsyms,
|
||||
}
|
||||
}
|
||||
|
||||
+static bool get_full_version_from_env (const char *variable_name,
|
||||
+ int *r_major,
|
||||
+ int *r_minor,
|
||||
+ int *r_patch) {
|
||||
+ *r_major = 0;
|
||||
+ *r_minor = 0;
|
||||
+ *r_patch = 0;
|
||||
+
|
||||
+ const char *value = getenv(variable_name);
|
||||
+ if (value == NULL || value[0] == '\0') {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ const char *current_value = value;
|
||||
+ const char *end_value = value + strlen(value);
|
||||
+
|
||||
+ char *endptr;
|
||||
+
|
||||
+ *r_major = strtol(current_value, &endptr, 10);
|
||||
+ if (endptr >= end_value) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ current_value = endptr + 1;
|
||||
+
|
||||
+ *r_minor = strtol(current_value, &endptr, 10);
|
||||
+ if (endptr >= end_value) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ current_value = endptr + 1;
|
||||
+
|
||||
+ *r_patch = strtol(current_value, &endptr, 10);
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static bool need_version_min_macosx_command (void) {
|
||||
+ return getenv("MACOSX_DEPLOYMENT_TARGET") &&
|
||||
+ getenv("MACOSX_SDK_VERSION");
|
||||
+}
|
||||
+
|
||||
/* Calculate some values we'll need for writing later. */
|
||||
|
||||
static void macho_calculate_sizes (void)
|
||||
@@ -1270,6 +1314,12 @@ static void macho_calculate_sizes (void)
|
||||
head_sizeofcmds += fmt.segcmd_size + seg_nsects * fmt.sectcmd_size;
|
||||
}
|
||||
|
||||
+ /* LC_VERSION_MIN_MACOSX */
|
||||
+ if (need_version_min_macosx_command()) {
|
||||
+ ++head_ncmds;
|
||||
+ head_sizeofcmds += MACHO_VERSION_MIN_MACOSX_SIZE;
|
||||
+ }
|
||||
+
|
||||
if (nsyms > 0) {
|
||||
++head_ncmds;
|
||||
head_sizeofcmds += MACHO_SYMCMD_SIZE;
|
||||
@@ -1653,6 +1703,33 @@ static void macho_write (void)
|
||||
else
|
||||
nasm_warn(WARN_OTHER, "no sections?");
|
||||
|
||||
+#define ENCODE_BUILD_VERSION(major, minor, patch) \
|
||||
+ (((major) << 16) | ((minor) << 8) | (patch))
|
||||
+
|
||||
+ if (0) {
|
||||
+ fwriteint32_t(LC_BUILD_VERSION, ofile); /* cmd == LC_BUILD_VERSION */
|
||||
+ fwriteint32_t(MACHO_BUILD_VERSION_SIZE, ofile); /* size of load command */
|
||||
+ fwriteint32_t(1, ofile); /* platform */
|
||||
+ fwriteint32_t(ENCODE_BUILD_VERSION(10, 13, 0), ofile); /* minos, X.Y.Z is encoded in nibbles xxxx.yy.zz */
|
||||
+ fwriteint32_t(ENCODE_BUILD_VERSION(10, 15, 4), ofile); /* sdk, X.Y.Z is encoded in nibbles xxxx.yy.zz */
|
||||
+ fwriteint32_t(0, ofile); /* number of tool entries following this */
|
||||
+ }
|
||||
+
|
||||
+ if (need_version_min_macosx_command()) {
|
||||
+ int sdk_major, sdk_minor, sdk_patch;
|
||||
+ get_full_version_from_env("MACOSX_SDK_VERSION", &sdk_major, &sdk_minor, &sdk_patch);
|
||||
+
|
||||
+ int version_major, version_minor, version_patch;
|
||||
+ get_full_version_from_env("MACOSX_DEPLOYMENT_TARGET", &version_major, &version_minor, &version_patch);
|
||||
+
|
||||
+ fwriteint32_t(LC_VERSION_MIN_MACOSX, ofile); /* cmd == LC_VERSION_MIN_MACOSX */
|
||||
+ fwriteint32_t(MACHO_VERSION_MIN_MACOSX_SIZE, ofile); /* size of load command */
|
||||
+ fwriteint32_t(ENCODE_BUILD_VERSION(version_major, version_minor, version_patch), ofile); /* minos, X.Y.Z is encoded in nibbles xxxx.yy.zz */
|
||||
+ fwriteint32_t(ENCODE_BUILD_VERSION(sdk_major, sdk_minor, sdk_patch), ofile); /* sdk, X.Y.Z is encoded in nibbles xxxx.yy.zz */
|
||||
+ }
|
||||
+
|
||||
+#undef ENCODE_BUILD_VERSION
|
||||
+
|
||||
if (nsyms > 0) {
|
||||
/* write out symbol command */
|
||||
fwriteint32_t(LC_SYMTAB, ofile); /* cmd == LC_SYMTAB */
|
27
build_files/build_environment/patches/numpy.diff
Normal file
27
build_files/build_environment/patches/numpy.diff
Normal file
@@ -0,0 +1,27 @@
|
||||
diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
|
||||
index ba2b1f4..b10f7df 100644
|
||||
--- a/numpy/distutils/system_info.py
|
||||
+++ b/numpy/distutils/system_info.py
|
||||
@@ -2164,8 +2164,8 @@ class accelerate_info(system_info):
|
||||
'accelerate' in libraries):
|
||||
if intel:
|
||||
args.extend(['-msse3'])
|
||||
- else:
|
||||
- args.extend(['-faltivec'])
|
||||
+# else:
|
||||
+# args.extend(['-faltivec'])
|
||||
args.extend([
|
||||
'-I/System/Library/Frameworks/vecLib.framework/Headers'])
|
||||
link_args.extend(['-Wl,-framework', '-Wl,Accelerate'])
|
||||
@@ -2174,8 +2174,8 @@ class accelerate_info(system_info):
|
||||
'veclib' in libraries):
|
||||
if intel:
|
||||
args.extend(['-msse3'])
|
||||
- else:
|
||||
- args.extend(['-faltivec'])
|
||||
+# else:
|
||||
+# args.extend(['-faltivec'])
|
||||
args.extend([
|
||||
'-I/System/Library/Frameworks/vecLib.framework/Headers'])
|
||||
link_args.extend(['-Wl,-framework', '-Wl,vecLib'])
|
||||
|
12
build_files/build_environment/patches/ogg.diff
Normal file
12
build_files/build_environment/patches/ogg.diff
Normal file
@@ -0,0 +1,12 @@
|
||||
diff --git a/include/ogg/os_types.h b/include/ogg/os_types.h
|
||||
index eb8a322..6f73b72 100644
|
||||
--- a/include/ogg/os_types.h
|
||||
+++ b/include/ogg/os_types.h
|
||||
@@ -71,6 +71,7 @@
|
||||
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
|
||||
|
||||
# include <sys/types.h>
|
||||
+# include <stdint.h>
|
||||
typedef int16_t ogg_int16_t;
|
||||
typedef uint16_t ogg_uint16_t;
|
||||
typedef int32_t ogg_int32_t;
|
@@ -86,3 +86,47 @@ index 1f9a3ee..d151e9a 100644
|
||||
return isnan( value );
|
||||
#else
|
||||
return std::isnan(value);
|
||||
|
||||
|
||||
diff --git a/DAEValidator/library/src/Dae.cpp b/DAEValidator/library/src/Dae.cpp
|
||||
index 9256ee1..241ad67 100644
|
||||
--- a/DAEValidator/library/src/Dae.cpp
|
||||
+++ b/DAEValidator/library/src/Dae.cpp
|
||||
@@ -304,7 +304,7 @@ namespace opencollada
|
||||
if (auto root_node = root())
|
||||
{
|
||||
const auto & nodes = root_node.selectNodes("//*[@id]");
|
||||
- for (const auto & node : nodes)
|
||||
+ for (const auto node : nodes)
|
||||
{
|
||||
string id = node.attribute("id").value();
|
||||
mIdCache.insert(id);
|
||||
@@ -312,4 +312,4 @@ namespace opencollada
|
||||
}
|
||||
}
|
||||
}
|
||||
-}
|
||||
\ No newline at end of file
|
||||
+}
|
||||
diff --git a/DAEValidator/library/src/DaeValidator.cpp b/DAEValidator/library/src/DaeValidator.cpp
|
||||
index 715d903..24423ce 100644
|
||||
--- a/DAEValidator/library/src/DaeValidator.cpp
|
||||
+++ b/DAEValidator/library/src/DaeValidator.cpp
|
||||
@@ -162,7 +162,7 @@ namespace opencollada
|
||||
|
||||
// Find xsi:schemaLocation attributes in dae and try to validate against specified xsd documents
|
||||
const auto & elements = dae.root().selectNodes("//*[@xsi:schemaLocation]");
|
||||
- for (const auto & element : elements)
|
||||
+ for (const auto element : elements)
|
||||
{
|
||||
if (auto schemaLocation = element.attribute("schemaLocation"))
|
||||
{
|
||||
@@ -274,7 +274,7 @@ namespace opencollada
|
||||
int result = 0;
|
||||
map<string, size_t> ids;
|
||||
const auto & nodes = dae.root().selectNodes("//*[@id]");
|
||||
- for (const auto & node : nodes)
|
||||
+ for (const auto node : nodes)
|
||||
{
|
||||
string id = node.attribute("id").value();
|
||||
size_t line = node.line();
|
||||
|
23
build_files/build_environment/patches/openmp.diff
Normal file
23
build_files/build_environment/patches/openmp.diff
Normal file
@@ -0,0 +1,23 @@
|
||||
diff --git a/runtime/src/z_Linux_asm.S b/runtime/src/z_Linux_asm.S
|
||||
index 0d8885e..42aa5ad 100644
|
||||
--- a/runtime/src/z_Linux_asm.S
|
||||
+++ b/runtime/src/z_Linux_asm.S
|
||||
@@ -1540,10 +1540,12 @@ __kmp_unnamed_critical_addr:
|
||||
.comm .gomp_critical_user_,32,8
|
||||
.data
|
||||
.align 8
|
||||
- .global __kmp_unnamed_critical_addr
|
||||
-__kmp_unnamed_critical_addr:
|
||||
+ .global ___kmp_unnamed_critical_addr
|
||||
+___kmp_unnamed_critical_addr:
|
||||
.8byte .gomp_critical_user_
|
||||
- .size __kmp_unnamed_critical_addr,8
|
||||
+# if !(KMP_OS_DARWIN)
|
||||
+ .size ___kmp_unnamed_critical_addr,8
|
||||
+# endif
|
||||
#endif /* KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 */
|
||||
|
||||
#if KMP_OS_LINUX
|
||||
|
||||
|
||||
|
289
build_files/build_environment/patches/python_macos.diff
Normal file
289
build_files/build_environment/patches/python_macos.diff
Normal file
@@ -0,0 +1,289 @@
|
||||
diff -ru a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
|
||||
--- a/Doc/library/ctypes.rst 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/Doc/library/ctypes.rst 2020-07-14 08:10:10.000000000 +0200
|
||||
@@ -1551,6 +1551,13 @@
|
||||
value usable as argument (integer, string, ctypes instance). This allows
|
||||
defining adapters that can adapt custom objects as function parameters.
|
||||
|
||||
+ .. attribute:: variadic
|
||||
+
|
||||
+ Assign a boolean to specify that the function takes a variable number of
|
||||
+ arguments. This does not matter on most platforms, but for Apple arm64
|
||||
+ platforms variadic functions have a different calling convention than
|
||||
+ normal functions.
|
||||
+
|
||||
.. attribute:: errcheck
|
||||
|
||||
Assign a Python function or another callable to this attribute. The
|
||||
diff -ru a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
|
||||
--- a/Modules/_ctypes/_ctypes.c 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/Modules/_ctypes/_ctypes.c 2020-07-14 08:14:41.000000000 +0200
|
||||
@@ -3175,6 +3175,35 @@
|
||||
}
|
||||
|
||||
static int
|
||||
+PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored))
|
||||
+{
|
||||
+ StgDictObject *dict = PyObject_stgdict((PyObject *)self);
|
||||
+ assert(dict);
|
||||
+ int r = PyObject_IsTrue(ob);
|
||||
+ if (r == 1) {
|
||||
+ dict->flags |= FUNCFLAG_VARIADIC;
|
||||
+ return 0;
|
||||
+ } else if (r == 0) {
|
||||
+ dict->flags &= ~FUNCFLAG_VARIADIC;
|
||||
+ return 0;
|
||||
+ } else {
|
||||
+ return -1;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static PyObject *
|
||||
+PyCFuncPtr_get_variadic(PyCFuncPtrObject *self, void *Py_UNUSED(ignored))
|
||||
+{
|
||||
+ StgDictObject *dict = PyObject_stgdict((PyObject *)self);
|
||||
+ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */
|
||||
+ if (dict->flags & FUNCFLAG_VARIADIC)
|
||||
+ Py_RETURN_TRUE;
|
||||
+ else
|
||||
+ Py_RETURN_FALSE;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int
|
||||
PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored))
|
||||
{
|
||||
PyObject *converters;
|
||||
@@ -5632,6 +5661,7 @@
|
||||
PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO));
|
||||
PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR));
|
||||
PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI));
|
||||
+ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC));
|
||||
PyModule_AddStringConstant(m, "__version__", "1.1.0");
|
||||
|
||||
PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove));
|
||||
diff -ru a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
|
||||
--- a/Modules/_ctypes/callproc.c 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/Modules/_ctypes/callproc.c 2020-07-14 08:18:33.000000000 +0200
|
||||
@@ -767,7 +767,8 @@
|
||||
ffi_type **atypes,
|
||||
ffi_type *restype,
|
||||
void *resmem,
|
||||
- int argcount)
|
||||
+ int argcount,
|
||||
+ int argtypecount)
|
||||
{
|
||||
PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */
|
||||
PyObject *error_object = NULL;
|
||||
@@ -793,15 +794,38 @@
|
||||
if ((flags & FUNCFLAG_CDECL) == 0)
|
||||
cc = FFI_STDCALL;
|
||||
#endif
|
||||
- if (FFI_OK != ffi_prep_cif(&cif,
|
||||
- cc,
|
||||
- argcount,
|
||||
- restype,
|
||||
- atypes)) {
|
||||
- PyErr_SetString(PyExc_RuntimeError,
|
||||
- "ffi_prep_cif failed");
|
||||
- return -1;
|
||||
- }
|
||||
+#if HAVE_FFI_PREP_CIF_VAR
|
||||
+ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but
|
||||
+ * lots of existing code will not. If there's at least one arg and more
|
||||
+ * args are passed than are defined in the prototype, then it must be a
|
||||
+ * variadic function. */
|
||||
+ if ((flags & FUNCFLAG_VARIADIC) ||
|
||||
+ (argtypecount != 0 && argcount > argtypecount))
|
||||
+ {
|
||||
+ if (FFI_OK != ffi_prep_cif_var(&cif,
|
||||
+ cc,
|
||||
+ argtypecount,
|
||||
+ argcount,
|
||||
+ restype,
|
||||
+ atypes)) {
|
||||
+ PyErr_SetString(PyExc_RuntimeError,
|
||||
+ "ffi_prep_cif_var failed");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ } else {
|
||||
+#endif
|
||||
+ if (FFI_OK != ffi_prep_cif(&cif,
|
||||
+ cc,
|
||||
+ argcount,
|
||||
+ restype,
|
||||
+ atypes)) {
|
||||
+ PyErr_SetString(PyExc_RuntimeError,
|
||||
+ "ffi_prep_cif failed");
|
||||
+ return -1;
|
||||
+ }
|
||||
+#if HAVE_FFI_PREP_CIF_VAR
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) {
|
||||
error_object = _ctypes_get_errobj(&space);
|
||||
@@ -1185,9 +1209,8 @@
|
||||
|
||||
if (-1 == _call_function_pointer(flags, pProc, avalues, atypes,
|
||||
rtype, resbuf,
|
||||
- Py_SAFE_DOWNCAST(argcount,
|
||||
- Py_ssize_t,
|
||||
- int)))
|
||||
+ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int),
|
||||
+ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int)))
|
||||
goto cleanup;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
diff -ru a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h
|
||||
--- a/Modules/_ctypes/ctypes.h 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/Modules/_ctypes/ctypes.h 2020-07-14 08:30:53.000000000 +0200
|
||||
@@ -285,6 +285,7 @@
|
||||
#define FUNCFLAG_PYTHONAPI 0x4
|
||||
#define FUNCFLAG_USE_ERRNO 0x8
|
||||
#define FUNCFLAG_USE_LASTERROR 0x10
|
||||
+#define FUNCFLAG_VARIADIC 0x20
|
||||
|
||||
#define TYPEFLAG_ISPOINTER 0x100
|
||||
#define TYPEFLAG_HASPOINTER 0x200
|
||||
diff -ru a/configure b/configure
|
||||
--- a/configure 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/configure 2020-07-14 08:03:27.000000000 +0200
|
||||
@@ -3374,7 +3374,7 @@
|
||||
# has no effect, don't bother defining them
|
||||
Darwin/[6789].*)
|
||||
define_xopen_source=no;;
|
||||
- Darwin/1[0-9].*)
|
||||
+ Darwin/[12][0-9].*)
|
||||
define_xopen_source=no;;
|
||||
# On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but
|
||||
# used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined
|
||||
@@ -9251,6 +9251,9 @@
|
||||
ppc)
|
||||
MACOSX_DEFAULT_ARCH="ppc64"
|
||||
;;
|
||||
+ arm64)
|
||||
+ MACOSX_DEFAULT_ARCH="arm64"
|
||||
+ ;;
|
||||
*)
|
||||
as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5
|
||||
;;
|
||||
diff -ru a/configure.ac b/configure.ac
|
||||
--- a/configure.ac 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/configure.ac 2020-07-14 08:03:27.000000000 +0200
|
||||
@@ -2456,6 +2456,9 @@
|
||||
ppc)
|
||||
MACOSX_DEFAULT_ARCH="ppc64"
|
||||
;;
|
||||
+ arm64)
|
||||
+ MACOSX_DEFAULT_ARCH="arm64"
|
||||
+ ;;
|
||||
*)
|
||||
AC_MSG_ERROR([Unexpected output of 'arch' on OSX])
|
||||
;;
|
||||
diff -ru a/setup.py b/setup.py
|
||||
--- a/setup.py 2020-03-10 07:11:12.000000000 +0100
|
||||
+++ b/setup.py 2020-07-14 08:28:12.000000000 +0200
|
||||
@@ -141,6 +141,13 @@
|
||||
os.unlink(tmpfile)
|
||||
|
||||
return MACOS_SDK_ROOT
|
||||
+
|
||||
+def is_macosx_at_least(vers):
|
||||
+ if host_platform == 'darwin':
|
||||
+ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
|
||||
+ if dep_target:
|
||||
+ return tuple(map(int, dep_target.split('.'))) >= vers
|
||||
+ return False
|
||||
|
||||
def is_macosx_sdk_path(path):
|
||||
"""
|
||||
@@ -150,6 +157,13 @@
|
||||
or path.startswith('/System/')
|
||||
or path.startswith('/Library/') )
|
||||
|
||||
+def grep_headers_for(function, headers):
|
||||
+ for header in headers:
|
||||
+ with open(header, 'r') as f:
|
||||
+ if function in f.read():
|
||||
+ return True
|
||||
+ return False
|
||||
+
|
||||
def find_file(filename, std_dirs, paths):
|
||||
"""Searches for the directory where a given file is located,
|
||||
and returns a possibly-empty list of additional directories, or None
|
||||
@@ -1972,7 +1986,11 @@
|
||||
return True
|
||||
|
||||
def detect_ctypes(self, inc_dirs, lib_dirs):
|
||||
- self.use_system_libffi = False
|
||||
+ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)):
|
||||
+ self.use_system_libffi = True
|
||||
+ else:
|
||||
+ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
|
||||
+
|
||||
include_dirs = []
|
||||
extra_compile_args = []
|
||||
extra_link_args = []
|
||||
@@ -2016,32 +2034,48 @@
|
||||
ext_test = Extension('_ctypes_test',
|
||||
sources=['_ctypes/_ctypes_test.c'],
|
||||
libraries=['m'])
|
||||
+ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
|
||||
+ ffi_lib = None
|
||||
+
|
||||
self.extensions.extend([ext, ext_test])
|
||||
|
||||
if host_platform == 'darwin':
|
||||
- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
|
||||
+ if not self.use_system_libffi:
|
||||
return
|
||||
- # OS X 10.5 comes with libffi.dylib; the include files are
|
||||
- # in /usr/include/ffi
|
||||
- inc_dirs.append('/usr/include/ffi')
|
||||
-
|
||||
- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
|
||||
- if not ffi_inc or ffi_inc[0] == '':
|
||||
- ffi_inc = find_file('ffi.h', [], inc_dirs)
|
||||
- if ffi_inc is not None:
|
||||
- ffi_h = ffi_inc[0] + '/ffi.h'
|
||||
+ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi")
|
||||
+ if os.path.exists(ffi_in_sdk):
|
||||
+ ffi_inc = ffi_in_sdk
|
||||
+ ffi_lib = 'ffi'
|
||||
+ else:
|
||||
+ # OS X 10.5 comes with libffi.dylib; the include files are
|
||||
+ # in /usr/include/ffi
|
||||
+ ffi_inc_dirs.append('/usr/include/ffi')
|
||||
+
|
||||
+ if not ffi_inc:
|
||||
+ found = find_file('ffi.h', [], ffi_inc_dirs)
|
||||
+ if found:
|
||||
+ ffi_inc = found[0]
|
||||
+ if ffi_inc:
|
||||
+ ffi_h = ffi_inc + '/ffi.h'
|
||||
if not os.path.exists(ffi_h):
|
||||
ffi_inc = None
|
||||
print('Header file {} does not exist'.format(ffi_h))
|
||||
- ffi_lib = None
|
||||
- if ffi_inc is not None:
|
||||
+ if ffi_lib is None and ffi_inc:
|
||||
for lib_name in ('ffi', 'ffi_pic'):
|
||||
if (self.compiler.find_library_file(lib_dirs, lib_name)):
|
||||
ffi_lib = lib_name
|
||||
break
|
||||
|
||||
if ffi_inc and ffi_lib:
|
||||
- ext.include_dirs.extend(ffi_inc)
|
||||
+ ffi_headers = glob(os.path.join(ffi_inc, '*.h'))
|
||||
+ if grep_headers_for('ffi_closure_alloc', ffi_headers):
|
||||
+ try:
|
||||
+ sources.remove('_ctypes/malloc_closure.c')
|
||||
+ except ValueError:
|
||||
+ pass
|
||||
+ if grep_headers_for('ffi_prep_cif_var', ffi_headers):
|
||||
+ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1")
|
||||
+ ext.include_dirs.append(ffi_inc)
|
||||
ext.libraries.append(ffi_lib)
|
||||
self.use_system_libffi = True
|
||||
|
14
build_files/build_environment/patches/sqlite.diff
Normal file
14
build_files/build_environment/patches/sqlite.diff
Normal file
@@ -0,0 +1,14 @@
|
||||
Only in external_sqlite_orig: config.log
|
||||
diff -ru external_sqlite_orig/config.sub external_sqlite/config.sub
|
||||
--- external_sqlite_orig/config.sub 2020-07-10 14:06:42.000000000 +0200
|
||||
+++ external_sqlite/config.sub 2020-07-10 14:10:24.000000000 +0200
|
||||
@@ -314,6 +314,7 @@
|
||||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
+ | aarch64-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
Only in external_sqlite: mksourceid
|
||||
Only in external_sqlite: sqlite3session.h
|
18
build_files/build_environment/patches/theora.diff
Normal file
18
build_files/build_environment/patches/theora.diff
Normal file
@@ -0,0 +1,18 @@
|
||||
--- config.sub
|
||||
+++ config.sub
|
||||
@@ -226,6 +226,7 @@
|
||||
# Some are omitted here because they have special meanings below.
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
+ | aarch64 \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
|
||||
@@ -286,6 +287,7 @@
|
||||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
+ | aarch64-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
@@ -97,3 +97,36 @@ diff -Naur external_usd_base/cmake/macros/Public.cmake external_usd/cmake/macros
|
||||
endforeach()
|
||||
foreach(lib ${PXR_OBJECT_LIBS})
|
||||
set(objects "${objects};\$<TARGET_OBJECTS:${lib}>")
|
||||
|
||||
diff --git a/pxr/base/arch/align.h b/pxr/base/arch/align.h
|
||||
index f3cabf4..ebc8a69 100644
|
||||
--- a/pxr/base/arch/align.h
|
||||
+++ b/pxr/base/arch/align.h
|
||||
@@ -77,7 +77,11 @@ ArchAlignMemory(void *base)
|
||||
/// The size of a CPU cache line on the current processor architecture in bytes.
|
||||
///
|
||||
/// \hideinitializer
|
||||
+#if defined(ARCH_OS_DARWIN) && defined(ARCH_CPU_ARM)
|
||||
+#define ARCH_CACHE_LINE_SIZE 128
|
||||
+#else
|
||||
#define ARCH_CACHE_LINE_SIZE 64
|
||||
+#endif
|
||||
|
||||
///@}
|
||||
|
||||
diff --git a/pxr/base/arch/math.h b/pxr/base/arch/math.h
|
||||
index 3e66c37..64a052c 100644
|
||||
--- a/pxr/base/arch/math.h
|
||||
+++ b/pxr/base/arch/math.h
|
||||
@@ -42,7 +42,7 @@ PXR_NAMESPACE_OPEN_SCOPE
|
||||
/// \addtogroup group_arch_Math
|
||||
///@{
|
||||
|
||||
-#if defined (ARCH_CPU_INTEL) || defined(doxygen)
|
||||
+#if defined (ARCH_CPU_INTEL) || defined(ARCH_CPU_ARM) || defined(doxygen)
|
||||
|
||||
/// This is the smallest value e such that 1+e^2 == 1, using floats.
|
||||
/// True for all IEEE754 chipsets.
|
||||
|
||||
|
||||
|
||||
|
@@ -1,34 +0,0 @@
|
||||
Buildbot-lts
|
||||
============
|
||||
|
||||
This folder contains configuration files and build scripts for making a release.
|
||||
It originated when we started to do LTS releases what happens once every two
|
||||
weeks. The idea is to automate the manual steps where possible and provide a
|
||||
pipeline process for the manual steps that still needs to happen.
|
||||
|
||||
By using the same software as builder.blender.org it would already put us in
|
||||
the right direction when we might want to make this part of builder.blender.org
|
||||
for now it is running on a VM in the blender institute as it contains user
|
||||
private keys and the process needs to be controlled security wise.
|
||||
|
||||
But of course the source and configurations are public available for anyone to
|
||||
check, develop and use.
|
||||
|
||||
Setting up build-bot
|
||||
--------------------
|
||||
|
||||
instructions from https://github.com/cjolowicz/docker-buildbot.
|
||||
|
||||
Create custom buildbot worker containing packages we need for building (git, wget).
|
||||
|
||||
cd docker
|
||||
docker build -t buildbot --no-cache .
|
||||
cd worker
|
||||
docker build -t buildbot-worker --no-cache .
|
||||
|
||||
docker network create net-buildbot
|
||||
|
||||
docker rm lts-buildbot && docker run --init --name lts-buildbot --network net-buildbot --publish=127.0.0.1:8010:8010 -t -i buildbot
|
||||
|
||||
docker rm lts-worker && docker run --init --name lts-worker --network net-buildbot --name lts-worker -e BUILDMASTER=lts-buildbot -e WORKERNAME=lts-worker -e WORKERPASS=secret -t -i buildbot-worker
|
||||
|
@@ -1,36 +0,0 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt update && apt upgrade -y
|
||||
RUN apt install -y \
|
||||
gosu \
|
||||
wget \
|
||||
openssh-client \
|
||||
build-essential \
|
||||
libffi-dev \
|
||||
libssl-dev \
|
||||
python3-dev \
|
||||
python3-pip
|
||||
|
||||
|
||||
ENV BUILDBOT_VERSION 2.5.0
|
||||
RUN pip3 --no-cache-dir install --upgrade pip && pip --no-cache-dir install \
|
||||
buildbot[bundle,tls]==$BUILDBOT_VERSION \
|
||||
buildbot-docker-swarm-worker
|
||||
|
||||
COPY buildbot.tac /var/lib/buildbot/
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
COPY master.cfg /etc/buildbot/
|
||||
COPY bin/create_checksum.sh /var/lib/buildbot/bin/
|
||||
COPY bin/upload_file.sh /var/lib/buildbot/bin/
|
||||
COPY .ssh/id_rsa /var/lib/buildbot/.ssh/
|
||||
|
||||
RUN adduser --home /var/lib/buildbot --disabled-password --gecos '' buildbot
|
||||
WORKDIR /var/lib/buildbot
|
||||
RUN ln -s /etc/buildbot/master.cfg
|
||||
|
||||
VOLUME /var/lib/buildbot
|
||||
EXPOSE 8010
|
||||
EXPOSE 9989
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
CMD ["twistd", "--pidfile=", "--nodaemon", "--python=buildbot.tac"]
|
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
md5sum $1 > $2.md5
|
||||
sha256sum $1 > $2.sha256
|
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
if [ ! -f /var/lib/buildbot/.ssh/known_hosts ]
|
||||
then
|
||||
ssh-keyscan download.blender.org > /var/lib/buildbot/.ssh/known_hosts
|
||||
fi
|
||||
scp $1 jeroen@download.blender.org:$2
|
@@ -1,20 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
from twisted.application import service
|
||||
from twisted.python.log import FileLogObserver
|
||||
from twisted.python.log import ILogObserver
|
||||
|
||||
from buildbot.master import BuildMaster
|
||||
|
||||
basedir = os.environ.get("BUILDBOT_BASEDIR",
|
||||
os.path.abspath(os.path.dirname(__file__)))
|
||||
configfile = 'master.cfg'
|
||||
|
||||
# note: this line is matched against to check that this is a buildmaster
|
||||
# directory; do not edit it.
|
||||
application = service.Application('buildmaster')
|
||||
application.setComponent(ILogObserver, FileLogObserver(sys.stdout).emit)
|
||||
|
||||
m = BuildMaster(basedir, configfile, umask=None)
|
||||
m.setServiceParent(application)
|
@@ -1,36 +0,0 @@
|
||||
version: '1'
|
||||
services:
|
||||
buildbot:
|
||||
image: buildbot/buildbot-master:master
|
||||
env_file:
|
||||
- db.env
|
||||
environment:
|
||||
- BUILDBOT_CONFIG_DIR=config
|
||||
- BUILDBOT_CONFIG_URL=https://github.com/buildbot/buildbot-docker-example-config/archive/master.tar.gz
|
||||
- BUILDBOT_WORKER_PORT=9989
|
||||
- BUILDBOT_WEB_URL=http://localhost:8010/
|
||||
- BUILDBOT_WEB_PORT=tcp:port=8010
|
||||
links:
|
||||
- db
|
||||
depends_on:
|
||||
- db
|
||||
ports:
|
||||
- "8010:8010"
|
||||
db:
|
||||
env_file:
|
||||
- db.env
|
||||
image: "postgres:9.4"
|
||||
expose:
|
||||
- 5432
|
||||
|
||||
worker:
|
||||
image: "buildbot/buildbot-worker:master"
|
||||
environment:
|
||||
BUILDMASTER: buildbot
|
||||
BUILDMASTER_PORT: 9989
|
||||
WORKERNAME: lts-worker
|
||||
WORKERPASS: pass
|
||||
WORKER_ENVIRONMENT_BLACKLIST: DOCKER_BUILDBOT* BUILDBOT_ENV_* BUILDBOT_1* WORKER_ENVIRONMENT_BLACKLIST
|
||||
|
||||
links:
|
||||
- buildbot
|
@@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
buildbot upgrade-master .
|
||||
|
||||
chown buildbot /var/lib/buildbot/
|
||||
chown buildbot /var/lib/buildbot/.ssh/
|
||||
chown -R buildbot /var/lib/buildbot/*
|
||||
|
||||
if [ -S /var/run/docker.sock ]
|
||||
then
|
||||
group=$(stat -c '%g' /var/run/docker.sock)
|
||||
else
|
||||
group=buildbot
|
||||
fi
|
||||
|
||||
gosu buildbot:$group "$@"
|
@@ -1,240 +0,0 @@
|
||||
# -*- python -*-
|
||||
# ex: set filetype=python:
|
||||
|
||||
import os
|
||||
|
||||
from buildbot.plugins import *
|
||||
|
||||
# This is a sample buildmaster config file. It must be installed as
|
||||
# 'master.cfg' in your buildmaster's base directory.
|
||||
|
||||
# This is the dictionary that the buildmaster pays attention to. We also use
|
||||
# a shorter alias to save typing.
|
||||
c = BuildmasterConfig = {}
|
||||
|
||||
####### WORKERS
|
||||
|
||||
# The 'workers' list defines the set of recognized workers. Each element is
|
||||
# a Worker object, specifying a unique worker name and password. The same
|
||||
# worker name and password must be configured on the worker.
|
||||
|
||||
c['workers'] = [worker.Worker("lts-worker", 'secret')]
|
||||
|
||||
if 'BUILDBOT_MQ_URL' in os.environ:
|
||||
c['mq'] = {
|
||||
'type' : 'wamp',
|
||||
'router_url': os.environ['BUILDBOT_MQ_URL'],
|
||||
'realm': os.environ.get('BUILDBOT_MQ_REALM', 'buildbot').decode('utf-8'),
|
||||
'debug' : 'BUILDBOT_MQ_DEBUG' in os.environ,
|
||||
'debug_websockets' : 'BUILDBOT_MQ_DEBUG' in os.environ,
|
||||
'debug_lowlevel' : 'BUILDBOT_MQ_DEBUG' in os.environ,
|
||||
}
|
||||
# 'protocols' contains information about protocols which master will use for
|
||||
# communicating with workers. You must define at least 'port' option that workers
|
||||
# could connect to your master with this protocol.
|
||||
# 'port' must match the value configured into the workers (with their
|
||||
# --master option)
|
||||
c['protocols'] = {'pb': {'port': os.environ.get("BUILDBOT_WORKER_PORT", 9989)}}
|
||||
|
||||
####### CHANGESOURCES
|
||||
|
||||
# the 'change_source' setting tells the buildmaster how it should find out
|
||||
# about source code changes. We don't build when sources change.
|
||||
c['change_source'] = []
|
||||
|
||||
####### SCHEDULERS
|
||||
|
||||
# Configure the Schedulers, which decide how to react to incoming changes. In this
|
||||
# case, just kick off a 'runtests' build
|
||||
|
||||
c['schedulers'] = [
|
||||
schedulers.ForceScheduler(
|
||||
name="build",
|
||||
builderNames=["release-blender-283"],
|
||||
properties=[
|
||||
util.StringParameter(
|
||||
name="blender_version",
|
||||
label="Version of blender.",
|
||||
default="2.83"),
|
||||
util.StringParameter(
|
||||
name="blender_version_full",
|
||||
label="Version of blender (Full).",
|
||||
default="2.83.1")
|
||||
]
|
||||
),
|
||||
|
||||
schedulers.Triggerable(
|
||||
name="deploy-source-archive",
|
||||
builderNames=["deploy-source-archive"]
|
||||
),
|
||||
|
||||
schedulers.Triggerable(
|
||||
name="deploy-buildbot-packages",
|
||||
builderNames=["deploy-buildbot-packages"]
|
||||
),
|
||||
]
|
||||
|
||||
####### BUILDERS
|
||||
|
||||
# The 'builders' list defines the Builders, which tell Buildbot how to perform a build:
|
||||
# what steps, and which workers can execute them. Note that any particular build will
|
||||
# only take place on one worker.
|
||||
|
||||
deploy_source_archive_factory = util.BuildFactory()
|
||||
deploy_source_archive_factory.addStep(steps.Git(name="Checkout Blender Source", repourl='https://git.blender.org/blender.git', branch=util.Interpolate('blender-v%(prop:blender_version)s-release'), mode='full'))
|
||||
deploy_source_archive_factory.addStep(steps.ShellSequence(name="Make source archive", commands=[
|
||||
util.ShellArg(command=["make", "source_archive"], logfile='make_source_archive'),
|
||||
# The next two shell commands are only needed during development
|
||||
util.ShellArg(command=["mv", "blender-2.83.2-beta.tar.xz", util.Interpolate('blender-v%(prop:blender_version_full)s.tar.xz')]),
|
||||
util.ShellArg(command=["mv", "blender-2.83.2-beta.tar.xz.md5sum", util.Interpolate('blender-v%(prop:blender_version_full)s.tar.xz.md5sum')]),
|
||||
]))
|
||||
deploy_source_archive_factory.addStep(steps.FileUpload(
|
||||
name="Upload source archive",
|
||||
workersrc=util.Interpolate('blender-v%(prop:blender_version_full)s.tar.xz'),
|
||||
masterdest=util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-v%(prop:blender_version_full)s.tar.xz')))
|
||||
deploy_source_archive_factory.addStep(steps.FileUpload(
|
||||
name="Upload source archive checksum",
|
||||
workersrc=util.Interpolate('blender-v%(prop:blender_version_full)s.tar.xz.md5sum'),
|
||||
masterdest=util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-v%(prop:blender_version_full)s.tar.xz.md5sum')))
|
||||
deploy_source_archive_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload source archive",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-v%(prop:blender_version_full)s.tar.xz'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
deploy_source_archive_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload windows64.zip build",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-v%(prop:blender_version_full)s.tar.xz.md5sum'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
|
||||
deploy_buildbot_packages_factory = util.BuildFactory()
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Download linux64 build",
|
||||
command=[
|
||||
'wget', util.Interpolate('https://builder.blender.org/download/blender-%(prop:blender_version_full)s-linux64.tar.xz'),
|
||||
"-O", util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-linux64.tar.xz')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Download windows64.msi build",
|
||||
command=[
|
||||
'wget', util.Interpolate('https://builder.blender.org/download/blender-%(prop:blender_version_full)s-windows64.msi'),
|
||||
"-O", util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-windows64.msi')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Download windows64.zip build",
|
||||
command=[
|
||||
'wget', util.Interpolate('https://builder.blender.org/download/blender-%(prop:blender_version_full)s-windows64.zip'),
|
||||
"-O", util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-windows64.zip')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Download macOS build",
|
||||
command=[
|
||||
'wget', util.Interpolate('https://builder.blender.org/download/blender-%(prop:blender_version_full)s-macOS.dmg'),
|
||||
"-O", util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-macOS.dmg')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Create checksum (md5/sha256)",
|
||||
command=[
|
||||
'sh',
|
||||
'-C',
|
||||
'/var/lib/buildbot/bin/create_checksum.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-*'),
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s'),
|
||||
]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload linux64 build",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-linux64.tar.xz'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload windows64.msi build",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-windows64.msi'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload windows64.zip build",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-windows64.zip'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload macOS build",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s-macOS.dmg'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload md5 checksum",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s.md5'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
deploy_buildbot_packages_factory.addStep(steps.MasterShellCommand(
|
||||
name="Upload sha256 checksum",
|
||||
command=[
|
||||
'sh', '-C', '/var/lib/buildbot/bin/upload_file.sh',
|
||||
util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s/blender-%(prop:blender_version_full)s.sha256'),
|
||||
util.Interpolate('/data/www/vhosts/download.blender.org/ftp/jeroen/')]))
|
||||
|
||||
factory = util.BuildFactory()
|
||||
factory.addStep(steps.MasterShellCommand(name="Init release folder", command=["mkdir", "-p", util.Interpolate('/var/lib/buildbot/builds//blender-v%(prop:blender_version_full)s')]))
|
||||
factory.addStep(steps.Trigger(
|
||||
name='Deploy',
|
||||
schedulerNames=[
|
||||
'deploy-source-archive',
|
||||
'deploy-buildbot-packages',
|
||||
],
|
||||
waitForFinish=True,
|
||||
set_properties={
|
||||
'blender_version_full': util.Property('blender_version_full'),
|
||||
'blender_version': util.Property('blender_version'),
|
||||
}
|
||||
))
|
||||
|
||||
# Download builds from builder.blender.org
|
||||
c['builders'] = [
|
||||
util.BuilderConfig(name="release-blender-283",
|
||||
workernames=["lts-worker"],
|
||||
factory=factory),
|
||||
util.BuilderConfig(name="deploy-source-archive",
|
||||
workernames=["lts-worker"],
|
||||
factory=deploy_source_archive_factory),
|
||||
util.BuilderConfig(name="deploy-buildbot-packages",
|
||||
workernames=["lts-worker"],
|
||||
factory=deploy_buildbot_packages_factory),
|
||||
]
|
||||
|
||||
####### STATUS TARGETS
|
||||
|
||||
# 'status' is a list of Status Targets. The results of each build will be
|
||||
# pushed to these targets. buildbot/status/*.py has a variety to choose from,
|
||||
# like IRC bots.
|
||||
|
||||
# c['status'] = []
|
||||
|
||||
####### PROJECT IDENTITY
|
||||
|
||||
# the 'title' string will appear at the top of this buildbot installation's
|
||||
# home pages (linked to the 'titleURL').
|
||||
|
||||
c['title'] = "Blender Release LTS"
|
||||
c['titleURL'] = "https://www.blender.org/download/lts/"
|
||||
|
||||
# the 'buildbotURL' string should point to the location where the buildbot's
|
||||
# internal web server is visible. This typically uses the port number set in
|
||||
# the 'www' entry below, but with an externally-visible host name which the
|
||||
# buildbot cannot figure out without some help.
|
||||
|
||||
c['buildbotURL'] = os.environ.get("BUILDBOT_WEB_URL", "http://localhost:8010/")
|
||||
|
||||
# minimalistic config to activate new web UI
|
||||
c['www'] = dict(port=os.environ.get("BUILDBOT_WEB_PORT", 8010),
|
||||
plugins=dict(waterfall_view={}, console_view={}))
|
||||
|
||||
####### DB URL
|
||||
|
||||
c['db'] = {
|
||||
# This specifies what database buildbot uses to store its state. You can leave
|
||||
# this at its default for all but the largest installations.
|
||||
'db_url' : os.environ.get("BUILDBOT_DB_URL", "sqlite://").format(**os.environ),
|
||||
}
|
@@ -1,27 +0,0 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN set -ex; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
git \
|
||||
wget \
|
||||
python3-dev \
|
||||
python3-pip \
|
||||
python3-setuptools \
|
||||
python3-wheel \
|
||||
; \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV BUILDBOT_VERSION 2.5.0
|
||||
RUN pip3 install --upgrade pip && \
|
||||
pip --no-cache-dir install twisted[tls] && \
|
||||
pip --no-cache-dir install buildbot_worker==$BUILDBOT_VERSION
|
||||
|
||||
RUN useradd --create-home --home-dir=/var/lib/buildbot buildbot
|
||||
WORKDIR /var/lib/buildbot
|
||||
USER buildbot
|
||||
|
||||
COPY buildbot.tac .
|
||||
|
||||
CMD ["twistd", "--pidfile=", "--nodaemon", "--python=buildbot.tac"]
|
@@ -1,39 +0,0 @@
|
||||
import fnmatch
|
||||
import os
|
||||
import sys
|
||||
|
||||
from twisted.application import service
|
||||
from twisted.python.log import FileLogObserver
|
||||
from twisted.python.log import ILogObserver
|
||||
|
||||
from buildbot_worker.bot import Worker
|
||||
|
||||
# setup worker
|
||||
basedir = os.path.abspath(os.path.dirname(__file__))
|
||||
application = service.Application('buildbot-worker')
|
||||
|
||||
|
||||
application.setComponent(ILogObserver, FileLogObserver(sys.stdout).emit)
|
||||
# and worker on the same process!
|
||||
buildmaster_host = os.environ.get("BUILDMASTER", 'localhost')
|
||||
port = int(os.environ.get("BUILDMASTER_PORT", 9989))
|
||||
workername = os.environ.get("WORKERNAME", 'docker')
|
||||
passwd = os.environ.get("WORKERPASS")
|
||||
|
||||
# delete the password from the environ so that it is not leaked in the log
|
||||
blacklist = os.environ.get("WORKER_ENVIRONMENT_BLACKLIST", "WORKERPASS").split()
|
||||
for name in list(os.environ.keys()):
|
||||
for toremove in blacklist:
|
||||
if fnmatch.fnmatch(name, toremove):
|
||||
del os.environ[name]
|
||||
|
||||
keepalive = 600
|
||||
umask = None
|
||||
maxdelay = 300
|
||||
allow_shutdown = None
|
||||
maxretries = 10
|
||||
|
||||
s = Worker(buildmaster_host, port, workername, passwd, basedir,
|
||||
keepalive, umask=umask, maxdelay=maxdelay,
|
||||
allow_shutdown=allow_shutdown, maxRetries=maxretries)
|
||||
s.setServiceParent(application)
|
104
build_files/cmake/Modules/FindClangTidy.cmake
Normal file
104
build_files/cmake/Modules/FindClangTidy.cmake
Normal file
@@ -0,0 +1,104 @@
|
||||
# - Find clang-tidy executable
|
||||
#
|
||||
# Find the native clang-tidy executable
|
||||
#
|
||||
# This module defines
|
||||
# CLANG_TIDY_EXECUTABLE, the ful lpath to clang-tidy executable
|
||||
#
|
||||
# CLANG_TIDY_VERSION, the full version of the clang-tidy in the
|
||||
# major,minor.patch format
|
||||
#
|
||||
# CLANG_TIDY_VERSION_MAJOR,
|
||||
# CLANG_TIDY_VERSION_MINOR,
|
||||
# CLANG_TIDY_VERSION_PATCH, individual components of the clang-tidy version.
|
||||
#
|
||||
# CLANG_TIDY_FOUND, If false, do not try to use Eigen3.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2020 Blender Foundation.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
# If CLANG_TIDY_ROOT_DIR was defined in the environment, use it.
|
||||
if(NOT CLANG_TIDY_ROOT_DIR AND NOT $ENV{CLANG_TIDY_ROOT_DIR} STREQUAL "")
|
||||
set(CLANG_TIDY_ROOT_DIR $ENV{CLANG_TIDY_ROOT_DIR})
|
||||
endif()
|
||||
|
||||
set(_clang_tidy_SEARCH_DIRS
|
||||
${CLANG_TIDY_ROOT_DIR}
|
||||
/usr/local/bin
|
||||
)
|
||||
|
||||
# TODO(sergey): Find more reliable way of finding the latest clang-tidy.
|
||||
find_program(CLANG_TIDY_EXECUTABLE
|
||||
NAMES
|
||||
clang-tidy-10
|
||||
clang-tidy-9
|
||||
clang-tidy-8
|
||||
clang-tidy-7
|
||||
clang-tidy
|
||||
HINTS
|
||||
${_clang_tidy_SEARCH_DIRS}
|
||||
)
|
||||
|
||||
if(CLANG_TIDY_EXECUTABLE)
|
||||
# Mark clang-tidy as found.
|
||||
set(CLANG_TIDY_FOUND TRUE)
|
||||
|
||||
# Setup fallback values.
|
||||
set(CLANG_TIDY_VERSION_MAJOR 0)
|
||||
set(CLANG_TIDY_VERSION_MINOR 0)
|
||||
set(CLANG_TIDY_VERSION_PATCH 0)
|
||||
|
||||
# Get version from the output.
|
||||
#
|
||||
# NOTE: Don't use name of the executable file since that only includes a
|
||||
# major version. Also, even the major version might be missing in the
|
||||
# executable name.
|
||||
execute_process(COMMAND ${CLANG_TIDY_EXECUTABLE} -version
|
||||
OUTPUT_VARIABLE CLANG_TIDY_VERSION_RAW
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
# Parse parts.
|
||||
if(CLANG_TIDY_VERSION_RAW MATCHES "LLVM version .*")
|
||||
# Strip the LLVM prefix and get list of individual version components.
|
||||
string(REGEX REPLACE
|
||||
".*LLVM version ([.0-9]+).*" "\\1"
|
||||
CLANG_SEMANTIC_VERSION "${CLANG_TIDY_VERSION_RAW}")
|
||||
string(REPLACE "." ";" CLANG_VERSION_PARTS "${CLANG_SEMANTIC_VERSION}")
|
||||
list(LENGTH CLANG_VERSION_PARTS NUM_CLANG_TIDY_VERSION_PARTS)
|
||||
|
||||
# Extract components into corresponding variables.
|
||||
if(NUM_CLANG_TIDY_VERSION_PARTS GREATER 0)
|
||||
list(GET CLANG_VERSION_PARTS 0 CLANG_TIDY_VERSION_MAJOR)
|
||||
endif()
|
||||
if(NUM_CLANG_TIDY_VERSION_PARTS GREATER 1)
|
||||
list(GET CLANG_VERSION_PARTS 1 CLANG_TIDY_VERSION_MINOR)
|
||||
endif()
|
||||
if(NUM_CLANG_TIDY_VERSION_PARTS GREATER 2)
|
||||
list(GET CLANG_VERSION_PARTS 2 CLANG_TIDY_VERSION_PATCH)
|
||||
endif()
|
||||
|
||||
# Unset temp variables.
|
||||
unset(NUM_CLANG_TIDY_VERSION_PARTS)
|
||||
unset(CLANG_SEMANTIC_VERSION)
|
||||
unset(CLANG_VERSION_PARTS)
|
||||
endif()
|
||||
|
||||
# Construct full semantic version.
|
||||
set(CLANG_TIDY_VERSION "${CLANG_TIDY_VERSION_MAJOR}.\
|
||||
${CLANG_TIDY_VERSION_MINOR}.\
|
||||
${CLANG_TIDY_VERSION_PATCH}")
|
||||
unset(CLANG_TIDY_VERSION_RAW)
|
||||
|
||||
message(STATUS "Found clang-tidy ${CLANG_TIDY_EXECUTABLE} (${CLANG_TIDY_VERSION})")
|
||||
else()
|
||||
set(CLANG_TIDY_FOUND FALSE)
|
||||
endif()
|
@@ -82,7 +82,7 @@ FIND_LIBRARY(EMBREE_LIBRARY
|
||||
# handle the QUIETLY and REQUIRED arguments and set EMBREE_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(EMBREE DEFAULT_MSG
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Embree DEFAULT_MSG
|
||||
_embree_LIBRARIES EMBREE_INCLUDE_DIR)
|
||||
|
||||
IF(EMBREE_FOUND)
|
||||
|
@@ -20,7 +20,11 @@
|
||||
|
||||
# Libraries configuration for Apple.
|
||||
|
||||
set(MACOSX_DEPLOYMENT_TARGET "10.11")
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(MACOSX_DEPLOYMENT_TARGET 11.00)
|
||||
else()
|
||||
set(MACOSX_DEPLOYMENT_TARGET 10.13)
|
||||
endif()
|
||||
|
||||
macro(find_package_wrapper)
|
||||
# do nothing, just satisfy the macro
|
||||
@@ -378,6 +382,12 @@ if(WITH_CYCLES_OSL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(WITH_CYCLES_EMBREE OFF)
|
||||
set(WITH_OPENIMAGEDENOISE OFF)
|
||||
set(WITH_CPU_SSE OFF)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_EMBREE)
|
||||
find_package(Embree 3.8.0 REQUIRED)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Xlinker -stack_size -Xlinker 0x100000")
|
||||
@@ -439,8 +449,8 @@ if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR CMAKE_OSX_ARCHITECTURES MATCHES "
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ftree-vectorize -fvariable-expansion-in-unroller")
|
||||
endif()
|
||||
else()
|
||||
set(CMAKE_C_FLAGS_RELEASE "-mdynamic-no-pic -fno-strict-aliasing")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-mdynamic-no-pic -fno-strict-aliasing")
|
||||
set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic -fno-strict-aliasing")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic -fno-strict-aliasing")
|
||||
endif()
|
||||
|
||||
if(${XCODE_VERSION} VERSION_EQUAL 5 OR ${XCODE_VERSION} VERSION_GREATER 5)
|
||||
|
@@ -21,8 +21,10 @@
|
||||
# Xcode and system configuration for Apple.
|
||||
|
||||
if(NOT CMAKE_OSX_ARCHITECTURES)
|
||||
set(CMAKE_OSX_ARCHITECTURES x86_64 CACHE STRING
|
||||
"Choose the architecture you want to build Blender for: i386, x86_64 or ppc"
|
||||
execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "Detected native architecture ${ARCHITECTURE}.")
|
||||
set(CMAKE_OSX_ARCHITECTURES ${ARCHITECTURE} CACHE STRING
|
||||
"Choose the architecture you want to build Blender for: arm64 or x86_64"
|
||||
FORCE)
|
||||
endif()
|
||||
|
||||
@@ -65,13 +67,9 @@ endif()
|
||||
|
||||
message(STATUS "Detected OS X ${OSX_SYSTEM} and Xcode ${XCODE_VERSION} at ${XCODE_BUNDLE}")
|
||||
|
||||
# Older Xcode versions had different approach to the directory hiearchy.
|
||||
# Require newer Xcode which is also have better chances of being able to compile with the
|
||||
# required deployment target.
|
||||
#
|
||||
# NOTE: Xcode version 8.2 is the latest one which runs on macOS 10.11.
|
||||
if(${XCODE_VERSION} VERSION_LESS 8.2)
|
||||
message(FATAL_ERROR "Only Xcode version 8.2 and newer is supported")
|
||||
# Require a relatively recent Xcode version.
|
||||
if(${XCODE_VERSION} VERSION_LESS 10.0)
|
||||
message(FATAL_ERROR "Only Xcode version 10.0 and newer is supported")
|
||||
endif()
|
||||
|
||||
# note: xcode-select path could be ambiguous,
|
||||
@@ -133,14 +131,21 @@ if(${CMAKE_GENERATOR} MATCHES "Xcode")
|
||||
endif()
|
||||
unset(OSX_SDKROOT)
|
||||
|
||||
# 10.11 is our min. target, if you use higher sdk, weak linking happens
|
||||
|
||||
# 10.13 is our min. target, if you use higher sdk, weak linking happens
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
set(OSX_MIN_DEPLOYMENT_TARGET 11.00)
|
||||
else()
|
||||
set(OSX_MIN_DEPLOYMENT_TARGET 10.13)
|
||||
endif()
|
||||
|
||||
if(CMAKE_OSX_DEPLOYMENT_TARGET)
|
||||
if(${CMAKE_OSX_DEPLOYMENT_TARGET} VERSION_LESS 10.11)
|
||||
message(STATUS "Setting deployment target to 10.11, lower versions are not supported")
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "" FORCE)
|
||||
if(${CMAKE_OSX_DEPLOYMENT_TARGET} VERSION_LESS ${OSX_MIN_DEPLOYMENT_TARGET})
|
||||
message(STATUS "Setting deployment target to ${OSX_MIN_DEPLOYMENT_TARGET}, lower versions are not supported")
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "${OSX_MIN_DEPLOYMENT_TARGET}" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
else()
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "" FORCE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "${OSX_MIN_DEPLOYMENT_TARGET}" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
if(NOT ${CMAKE_GENERATOR} MATCHES "Xcode")
|
||||
|
@@ -40,7 +40,8 @@ if make_utils.command_missing(git_command):
|
||||
|
||||
# Test if we are building a specific release version.
|
||||
branch = make_utils.git_branch(git_command)
|
||||
release_version = make_utils.git_branch_release_version(branch)
|
||||
tag = make_utils.git_tag(git_command)
|
||||
release_version = make_utils.git_branch_release_version(branch, tag)
|
||||
lib_tests_dirpath = os.path.join('..', 'lib', "tests")
|
||||
|
||||
if not os.path.exists(lib_tests_dirpath):
|
||||
|
@@ -197,7 +197,8 @@ if __name__ == "__main__":
|
||||
|
||||
# Test if we are building a specific release version.
|
||||
branch = make_utils.git_branch(args.git_command)
|
||||
release_version = make_utils.git_branch_release_version(branch)
|
||||
tag = make_utils.git_tag(args.git_command)
|
||||
release_version = make_utils.git_branch_release_version(branch, tag)
|
||||
|
||||
if not args.no_libraries:
|
||||
svn_update(args, release_version)
|
||||
|
@@ -36,7 +36,7 @@ def check_output(cmd, exit_on_error=True):
|
||||
return output.strip()
|
||||
|
||||
def git_branch(git_command):
|
||||
# Test if we are building a specific release version.
|
||||
# Get current branch name.
|
||||
try:
|
||||
branch = subprocess.check_output([git_command, "rev-parse", "--abbrev-ref", "HEAD"])
|
||||
except subprocess.CalledProcessError as e:
|
||||
@@ -45,10 +45,23 @@ def git_branch(git_command):
|
||||
|
||||
return branch.strip().decode('utf8')
|
||||
|
||||
def git_branch_release_version(branch):
|
||||
def git_tag(git_command):
|
||||
# Get current tag name.
|
||||
try:
|
||||
tag = subprocess.check_output([git_command, "describe", "--exact-match"])
|
||||
except subprocess.CalledProcessError as e:
|
||||
return None
|
||||
|
||||
return tag.strip().decode('utf8')
|
||||
|
||||
def git_branch_release_version(branch, tag):
|
||||
release_version = re.search("^blender-v(.*)-release$", branch)
|
||||
if release_version:
|
||||
release_version = release_version.group(1)
|
||||
elif tag:
|
||||
release_version = re.search("^v([0-9]*\.[0-9]*).*", tag)
|
||||
if release_version:
|
||||
release_version = release_version.group(1)
|
||||
return release_version
|
||||
|
||||
def svn_libraries_base_url(release_version):
|
||||
|
@@ -248,7 +248,7 @@ using the ``bl_idname`` rather than the classes original name.
|
||||
.. note::
|
||||
|
||||
There are some exceptions to this for class names which aren't guarantee to be unique.
|
||||
In this case use: :func:`bpy.types.Struct.bl_rna_get_subclass`.
|
||||
In this case use: :func:`bpy.types.Struct.bl_rna_get_subclass_py`.
|
||||
|
||||
|
||||
When loading a class, Blender performs sanity checks making sure all required properties and functions are found,
|
||||
|
2
extern/mantaflow/CMakeLists.txt
vendored
2
extern/mantaflow/CMakeLists.txt
vendored
@@ -31,7 +31,7 @@ if(MSVC_CLANG AND WITH_OPENMP AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0.1
|
||||
remove_cc_flag("-fopenmp")
|
||||
endif()
|
||||
|
||||
set(MANTAVERSION "0.12")
|
||||
set(MANTAVERSION "0.13")
|
||||
|
||||
add_definitions(-DWITH_FLUID=1)
|
||||
|
||||
|
12
extern/mantaflow/helper/util/vectorbase.h
vendored
12
extern/mantaflow/helper/util/vectorbase.h
vendored
@@ -248,12 +248,14 @@ template<class S> class Vector3D {
|
||||
protected:
|
||||
};
|
||||
|
||||
//! helper to check whether float/double value is non-zero
|
||||
inline bool notZero(Real f)
|
||||
//! helper to check whether value is non-zero
|
||||
template<class S> inline bool notZero(S v)
|
||||
{
|
||||
if (std::abs(f) > VECTOR_EPSILON)
|
||||
return true;
|
||||
return false;
|
||||
return (std::abs(v) > VECTOR_EPSILON);
|
||||
}
|
||||
template<class S> inline bool notZero(Vector3D<S> v)
|
||||
{
|
||||
return (std::abs(norm(v)) > VECTOR_EPSILON);
|
||||
}
|
||||
|
||||
//************************************************************************
|
||||
|
@@ -315,10 +315,14 @@ int readObjFile(const std::string &name, Mesh *mesh, bool append)
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Real dx = mesh->getParent()->getDx();
|
||||
const Vec3 gs = toVec3(mesh->getParent()->getGridSize());
|
||||
|
||||
if (!append)
|
||||
mesh->clear();
|
||||
int nodebase = mesh->numNodes();
|
||||
int cnt = nodebase;
|
||||
int cntNodes = nodebase, cntNormals = nodebase;
|
||||
|
||||
while (ifs.good() && !ifs.eof()) {
|
||||
string id;
|
||||
ifs >> id;
|
||||
@@ -333,19 +337,23 @@ int readObjFile(const std::string &name, Mesh *mesh, bool append)
|
||||
}
|
||||
else if (id == "vn") {
|
||||
// normals
|
||||
if (!mesh->numNodes()) {
|
||||
if (mesh->numNodes() != cntNodes) {
|
||||
errMsg("invalid amount of nodes");
|
||||
return 0;
|
||||
}
|
||||
Node n = mesh->nodes(cnt);
|
||||
ifs >> n.normal.x >> n.normal.y >> n.normal.z;
|
||||
cnt++;
|
||||
Node *n = &mesh->nodes(cntNormals);
|
||||
ifs >> n->normal.x >> n->normal.y >> n->normal.z;
|
||||
cntNormals++;
|
||||
}
|
||||
else if (id == "v") {
|
||||
// vertex
|
||||
Node n;
|
||||
ifs >> n.pos.x >> n.pos.y >> n.pos.z;
|
||||
// convert to grid space
|
||||
n.pos /= dx;
|
||||
n.pos += gs * 0.5;
|
||||
mesh->addNode(n);
|
||||
cntNodes++;
|
||||
}
|
||||
else if (id == "g") {
|
||||
// group
|
||||
@@ -408,7 +416,6 @@ int writeObjFile(const string &name, Mesh *mesh)
|
||||
// write normals
|
||||
for (int i = 0; i < numVerts; i++) {
|
||||
Vector3D<float> n = toVec3f(mesh->nodes(i).normal);
|
||||
// normalize to unit cube around 0
|
||||
ofs << "vn " << n.value[0] << " " << n.value[1] << " " << n.value[2] << " "
|
||||
<< "\n";
|
||||
}
|
||||
|
2
extern/mantaflow/preprocessed/gitinfo.h
vendored
2
extern/mantaflow/preprocessed/gitinfo.h
vendored
@@ -1,3 +1,3 @@
|
||||
|
||||
|
||||
#define MANTA_GIT_VERSION "commit d80d3c821de74315ab26b5efd153d41477b976c4"
|
||||
#define MANTA_GIT_VERSION "commit 7395d36e3f504edbdabe34b30edc855b422c7baa"
|
||||
|
@@ -30,6 +30,7 @@ add_subdirectory(opensubdiv)
|
||||
add_subdirectory(mikktspace)
|
||||
add_subdirectory(glew-mx)
|
||||
add_subdirectory(eigen)
|
||||
add_subdirectory(sky)
|
||||
|
||||
if(WITH_AUDASPACE)
|
||||
add_subdirectory(audaspace)
|
||||
|
@@ -35,7 +35,7 @@ if(WITH_CYCLES_OSL)
|
||||
endif()
|
||||
|
||||
if(NOT CYCLES_STANDALONE_REPOSITORY)
|
||||
list(APPEND LIBRARIES bf_intern_glew_mx bf_intern_guardedalloc bf_intern_numaapi)
|
||||
list(APPEND LIBRARIES bf_intern_glew_mx bf_intern_guardedalloc bf_intern_numaapi bf_intern_sky)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_LOGGING)
|
||||
|
@@ -224,7 +224,7 @@ def system_info():
|
||||
import _cycles
|
||||
return _cycles.system_info()
|
||||
|
||||
def list_render_passes(srl):
|
||||
def list_render_passes(scene, srl):
|
||||
# Builtin Blender passes.
|
||||
yield ("Combined", "RGBA", 'COLOR')
|
||||
|
||||
@@ -279,14 +279,17 @@ def list_render_passes(srl):
|
||||
yield ("Denoising Normal", "XYZ", 'VECTOR')
|
||||
yield ("Denoising Albedo", "RGB", 'COLOR')
|
||||
yield ("Denoising Depth", "Z", 'VALUE')
|
||||
yield ("Denoising Shadowing", "X", 'VALUE')
|
||||
yield ("Denoising Variance", "RGB", 'COLOR')
|
||||
yield ("Denoising Intensity", "X", 'VALUE')
|
||||
clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
|
||||
"denoising_glossy_direct", "denoising_glossy_indirect",
|
||||
"denoising_transmission_direct", "denoising_transmission_indirect")
|
||||
if any(getattr(crl, option) for option in clean_options):
|
||||
yield ("Denoising Clean", "RGB", 'COLOR')
|
||||
|
||||
if scene.cycles.denoiser == 'NLM':
|
||||
yield ("Denoising Shadowing", "X", 'VALUE')
|
||||
yield ("Denoising Variance", "RGB", 'COLOR')
|
||||
yield ("Denoising Intensity", "X", 'VALUE')
|
||||
|
||||
clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
|
||||
"denoising_glossy_direct", "denoising_glossy_indirect",
|
||||
"denoising_transmission_direct", "denoising_transmission_indirect")
|
||||
if any(getattr(crl, option) for option in clean_options):
|
||||
yield ("Denoising Clean", "RGB", 'COLOR')
|
||||
|
||||
# Custom AOV passes.
|
||||
for aov in crl.aovs:
|
||||
@@ -298,15 +301,15 @@ def list_render_passes(srl):
|
||||
def register_passes(engine, scene, view_layer):
|
||||
# Detect duplicate render pass names, first one wins.
|
||||
listed = set()
|
||||
for name, channelids, channeltype in list_render_passes(view_layer):
|
||||
for name, channelids, channeltype in list_render_passes(scene, view_layer):
|
||||
if name not in listed:
|
||||
engine.register_pass(scene, view_layer, name, len(channelids), channelids, channeltype)
|
||||
listed.add(name)
|
||||
|
||||
def detect_conflicting_passes(view_layer):
|
||||
def detect_conflicting_passes(scene, view_layer):
|
||||
# Detect conflicting render pass names for UI.
|
||||
counter = {}
|
||||
for name, _, _ in list_render_passes(view_layer):
|
||||
for name, _, _ in list_render_passes(scene, view_layer):
|
||||
counter[name] = counter.get(name, 0) + 1
|
||||
|
||||
for aov in view_layer.cycles.aovs:
|
||||
|
@@ -182,6 +182,7 @@ enum_aov_types = (
|
||||
('COLOR', "Color", "Write a Color pass", 1),
|
||||
)
|
||||
|
||||
|
||||
def enum_openimagedenoise_denoiser(self, context):
|
||||
if _cycles.with_openimagedenoise:
|
||||
return [('OPENIMAGEDENOISE', "OpenImageDenoise", "Use Intel OpenImageDenoise AI denoiser running on the CPU", 4)]
|
||||
@@ -196,14 +197,11 @@ def enum_preview_denoiser(self, context):
|
||||
optix_items = enum_optix_denoiser(self, context)
|
||||
oidn_items = enum_openimagedenoise_denoiser(self, context)
|
||||
|
||||
if len(optix_items):
|
||||
auto_label = "Fastest (Optix)"
|
||||
elif len(oidn_items):
|
||||
auto_label = "Fastest (OpenImageDenoise)"
|
||||
if len(optix_items) or len(oidn_items):
|
||||
items = [('AUTO', "Automatic", "Use the fastest available denoiser for viewport rendering (OptiX if available, OpenImageDenoise otherwise)", 0)]
|
||||
else:
|
||||
auto_label = "None"
|
||||
items = [('AUTO', "None", "Blender was compiled without a viewport denoiser", 0)]
|
||||
|
||||
items = [('AUTO', auto_label, "Use the fastest available denoiser for viewport rendering", 0)]
|
||||
items += optix_items
|
||||
items += oidn_items
|
||||
return items
|
||||
@@ -211,14 +209,23 @@ def enum_preview_denoiser(self, context):
|
||||
def enum_denoiser(self, context):
|
||||
items = [('NLM', "NLM", "Cycles native non-local means denoiser, running on any compute device", 1)]
|
||||
items += enum_optix_denoiser(self, context)
|
||||
items += enum_openimagedenoise_denoiser(self, context)
|
||||
return items
|
||||
|
||||
enum_denoising_optix_input_passes = (
|
||||
enum_denoising_input_passes = (
|
||||
('RGB', "Color", "Use only color as input", 1),
|
||||
('RGB_ALBEDO', "Color + Albedo", "Use color and albedo data as input", 2),
|
||||
('RGB_ALBEDO_NORMAL', "Color + Albedo + Normal", "Use color, albedo and normal data as input", 3),
|
||||
)
|
||||
|
||||
|
||||
def update_render_passes(self, context):
|
||||
scene = context.scene
|
||||
view_layer = context.view_layer
|
||||
view_layer.update_render_passes()
|
||||
engine.detect_conflicting_passes(scene, view_layer)
|
||||
|
||||
|
||||
class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
|
||||
device: EnumProperty(
|
||||
@@ -264,9 +271,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
|
||||
denoiser: EnumProperty(
|
||||
name="Denoiser",
|
||||
description="Denoise the image with the selected denoiser",
|
||||
description="Denoise the image with the selected denoiser. "
|
||||
"For denoising the image after rendering, denoising data render passes "
|
||||
"also adapt to the selected denoiser",
|
||||
items=enum_denoiser,
|
||||
default=1,
|
||||
update=update_render_passes,
|
||||
)
|
||||
preview_denoiser: EnumProperty(
|
||||
name="Viewport Denoiser",
|
||||
@@ -821,6 +831,7 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
debug_use_cuda_split_kernel: BoolProperty(name="Split Kernel", default=False)
|
||||
|
||||
debug_optix_cuda_streams: IntProperty(name="CUDA Streams", default=1, min=1)
|
||||
debug_optix_curves_api: BoolProperty(name="Native OptiX Curve Primitive", default=False)
|
||||
|
||||
debug_opencl_kernel_type: EnumProperty(
|
||||
name="OpenCL Kernel Type",
|
||||
@@ -1294,12 +1305,6 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup):
|
||||
del bpy.types.Scene.cycles_curves
|
||||
|
||||
|
||||
def update_render_passes(self, context):
|
||||
view_layer = context.view_layer
|
||||
view_layer.update_render_passes()
|
||||
engine.detect_conflicting_passes(view_layer)
|
||||
|
||||
|
||||
class CyclesAOVPass(bpy.types.PropertyGroup):
|
||||
name: StringProperty(
|
||||
name="Name",
|
||||
@@ -1433,7 +1438,7 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
|
||||
)
|
||||
denoising_store_passes: BoolProperty(
|
||||
name="Store Denoising Passes",
|
||||
description="Store the denoising feature passes and the noisy image",
|
||||
description="Store the denoising feature passes and the noisy image. The passes adapt to the denoiser selected for rendering",
|
||||
default=False,
|
||||
update=update_render_passes,
|
||||
)
|
||||
@@ -1446,11 +1451,18 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
|
||||
|
||||
denoising_optix_input_passes: EnumProperty(
|
||||
name="Input Passes",
|
||||
description="Passes handed over to the OptiX denoiser (this can have different effects on the denoised image)",
|
||||
items=enum_denoising_optix_input_passes,
|
||||
description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
|
||||
items=enum_denoising_input_passes,
|
||||
default='RGB_ALBEDO',
|
||||
)
|
||||
|
||||
denoising_openimagedenoise_input_passes: EnumProperty(
|
||||
name="Input Passes",
|
||||
description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
|
||||
items=enum_denoising_input_passes,
|
||||
default='RGB_ALBEDO_NORMAL',
|
||||
)
|
||||
|
||||
use_pass_crypto_object: BoolProperty(
|
||||
name="Cryptomatte Object",
|
||||
description="Render cryptomatte object pass, for isolating objects in compositing",
|
||||
|
@@ -265,7 +265,12 @@ class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel):
|
||||
row = heading.row(align=True)
|
||||
row.prop(cscene, "use_denoising", text="")
|
||||
sub = row.row()
|
||||
|
||||
sub.active = cscene.use_denoising
|
||||
for view_layer in scene.view_layers:
|
||||
if view_layer.cycles.denoising_store_passes:
|
||||
sub.active = True
|
||||
|
||||
sub.prop(cscene, "denoiser", text="")
|
||||
|
||||
heading = layout.column(align=False, heading="Viewport")
|
||||
@@ -777,10 +782,6 @@ class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
|
||||
col.prop(view_layer, "use_solid", text="Surfaces")
|
||||
col.prop(view_layer, "use_strand", text="Hair")
|
||||
col.prop(view_layer, "use_volumes", text="Volumes")
|
||||
if with_freestyle:
|
||||
sub = col.row(align=True)
|
||||
sub.prop(view_layer, "use_freestyle", text="Freestyle")
|
||||
sub.active = rd.use_freestyle
|
||||
|
||||
|
||||
class CYCLES_RENDER_PT_override(CyclesButtonsPanel, Panel):
|
||||
@@ -1007,6 +1008,7 @@ class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
|
||||
col.prop(cycles_view_layer, "denoising_optix_input_passes")
|
||||
return
|
||||
elif denoiser == 'OPENIMAGEDENOISE':
|
||||
col.prop(cycles_view_layer, "denoising_openimagedenoise_input_passes")
|
||||
return
|
||||
|
||||
col.prop(cycles_view_layer, "denoising_radius", text="Radius")
|
||||
@@ -2026,6 +2028,7 @@ class CYCLES_RENDER_PT_debug(CyclesButtonsPanel, Panel):
|
||||
col = layout.column()
|
||||
col.label(text="OptiX Flags:")
|
||||
col.prop(cscene, "debug_optix_cuda_streams")
|
||||
col.prop(cscene, "debug_optix_curves_api")
|
||||
|
||||
col.separator()
|
||||
|
||||
|
@@ -709,6 +709,10 @@ static void blender_camera_from_view(BlenderCamera *bcam,
|
||||
|
||||
/* 3d view transform */
|
||||
bcam->matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
|
||||
|
||||
/* dimensions */
|
||||
bcam->full_width = width;
|
||||
bcam->full_height = height;
|
||||
}
|
||||
|
||||
static void blender_camera_view_subset(BL::RenderEngine &b_engine,
|
||||
|
@@ -200,7 +200,7 @@ template<typename K, typename T> class id_map {
|
||||
* To uniquely identify instances, we use the parent, object and persistent instance ID.
|
||||
* We also export separate object for a mesh and its particle hair. */
|
||||
|
||||
enum { OBJECT_PERSISTENT_ID_SIZE = 16 };
|
||||
enum { OBJECT_PERSISTENT_ID_SIZE = 8 /* MAX_DUPLI_RECUR in Blender. */ };
|
||||
|
||||
struct ObjectKey {
|
||||
void *parent;
|
||||
|
@@ -59,7 +59,7 @@ bool BlenderSync::BKE_object_is_modified(BL::Object &b_ob)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool BlenderSync::object_is_mesh(BL::Object &b_ob)
|
||||
bool BlenderSync::object_is_geometry(BL::Object &b_ob)
|
||||
{
|
||||
BL::ID b_ob_data = b_ob.data();
|
||||
|
||||
@@ -143,7 +143,7 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
||||
}
|
||||
|
||||
/* only interested in object that we can create meshes from */
|
||||
if (!object_is_mesh(b_ob)) {
|
||||
if (!object_is_geometry(b_ob)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@@ -92,6 +92,7 @@ bool debug_flags_sync_from_scene(BL::Scene b_scene)
|
||||
flags.cuda.split_kernel = get_boolean(cscene, "debug_use_cuda_split_kernel");
|
||||
/* Synchronize OptiX flags. */
|
||||
flags.optix.cuda_streams = get_int(cscene, "debug_optix_cuda_streams");
|
||||
flags.optix.curves_api = get_boolean(cscene, "debug_optix_curves_api");
|
||||
/* Synchronize OpenCL device type. */
|
||||
switch (get_enum(cscene, "debug_opencl_device_type")) {
|
||||
case 0:
|
||||
|
@@ -815,9 +815,10 @@ static ShaderNode *add_node(Scene *scene,
|
||||
sky->ground_albedo = b_sky_node.ground_albedo();
|
||||
sky->sun_disc = b_sky_node.sun_disc();
|
||||
sky->sun_size = b_sky_node.sun_size();
|
||||
sky->sun_intensity = b_sky_node.sun_intensity();
|
||||
sky->sun_elevation = b_sky_node.sun_elevation();
|
||||
sky->sun_rotation = b_sky_node.sun_rotation();
|
||||
sky->altitude = b_sky_node.altitude();
|
||||
sky->altitude = 1000.0f * b_sky_node.altitude();
|
||||
sky->air_density = b_sky_node.air_density();
|
||||
sky->dust_density = b_sky_node.dust_density();
|
||||
sky->ozone_density = b_sky_node.ozone_density();
|
||||
|
@@ -147,30 +147,43 @@ void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d
|
||||
/* Object */
|
||||
else if (b_id.is_a(&RNA_Object)) {
|
||||
BL::Object b_ob(b_id);
|
||||
const bool updated_geometry = b_update->is_updated_geometry();
|
||||
const bool is_geometry = object_is_geometry(b_ob);
|
||||
const bool is_light = !is_geometry && object_is_light(b_ob);
|
||||
|
||||
if (b_update->is_updated_transform() || b_update->is_updated_shading()) {
|
||||
object_map.set_recalc(b_ob);
|
||||
light_map.set_recalc(b_ob);
|
||||
}
|
||||
if (is_geometry || is_light) {
|
||||
const bool updated_geometry = b_update->is_updated_geometry();
|
||||
|
||||
if (object_is_mesh(b_ob)) {
|
||||
if (updated_geometry ||
|
||||
(object_subdivision_type(b_ob, preview, experimental) != Mesh::SUBDIVISION_NONE)) {
|
||||
BL::ID key = BKE_object_is_modified(b_ob) ? b_ob : b_ob.data();
|
||||
geometry_map.set_recalc(key);
|
||||
/* Geometry (mesh, hair, volume). */
|
||||
if (is_geometry) {
|
||||
if (b_update->is_updated_transform() || b_update->is_updated_shading()) {
|
||||
object_map.set_recalc(b_ob);
|
||||
}
|
||||
|
||||
if (updated_geometry ||
|
||||
(object_subdivision_type(b_ob, preview, experimental) != Mesh::SUBDIVISION_NONE)) {
|
||||
BL::ID key = BKE_object_is_modified(b_ob) ? b_ob : b_ob.data();
|
||||
geometry_map.set_recalc(key);
|
||||
}
|
||||
|
||||
if (updated_geometry) {
|
||||
BL::Object::particle_systems_iterator b_psys;
|
||||
for (b_ob.particle_systems.begin(b_psys); b_psys != b_ob.particle_systems.end();
|
||||
++b_psys) {
|
||||
particle_system_map.set_recalc(b_ob);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (object_is_light(b_ob)) {
|
||||
if (updated_geometry) {
|
||||
light_map.set_recalc(b_ob);
|
||||
}
|
||||
}
|
||||
/* Light */
|
||||
else if (is_light) {
|
||||
if (b_update->is_updated_transform() || b_update->is_updated_shading()) {
|
||||
object_map.set_recalc(b_ob);
|
||||
light_map.set_recalc(b_ob);
|
||||
}
|
||||
|
||||
if (updated_geometry) {
|
||||
BL::Object::particle_systems_iterator b_psys;
|
||||
for (b_ob.particle_systems.begin(b_psys); b_psys != b_ob.particle_systems.end(); ++b_psys)
|
||||
particle_system_map.set_recalc(b_ob);
|
||||
if (updated_geometry) {
|
||||
light_map.set_recalc(b_ob);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Mesh */
|
||||
@@ -941,7 +954,13 @@ DenoiseParams BlenderSync::get_denoise_params(BL::Scene &b_scene,
|
||||
denoising.strength = get_float(clayer, "denoising_strength");
|
||||
denoising.feature_strength = get_float(clayer, "denoising_feature_strength");
|
||||
denoising.relative_pca = get_boolean(clayer, "denoising_relative_pca");
|
||||
denoising.optix_input_passes = get_enum(clayer, "denoising_optix_input_passes");
|
||||
|
||||
denoising.input_passes = (DenoiserInput)get_enum(
|
||||
clayer,
|
||||
(denoising.type == DENOISER_OPTIX) ? "denoising_optix_input_passes" :
|
||||
"denoising_openimagedenoise_input_passes",
|
||||
DENOISER_INPUT_NUM,
|
||||
DENOISER_INPUT_RGB_ALBEDO_NORMAL);
|
||||
|
||||
denoising.store_passes = get_boolean(clayer, "denoising_store_passes");
|
||||
}
|
||||
|
@@ -208,7 +208,7 @@ class BlenderSync {
|
||||
/* util */
|
||||
void find_shader(BL::ID &id, vector<Shader *> &used_shaders, Shader *default_shader);
|
||||
bool BKE_object_is_modified(BL::Object &b_ob);
|
||||
bool object_is_mesh(BL::Object &b_ob);
|
||||
bool object_is_geometry(BL::Object &b_ob);
|
||||
bool object_is_light(BL::Object &b_ob);
|
||||
|
||||
/* variables */
|
||||
|
@@ -133,9 +133,9 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
||||
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
|
||||
|
||||
####
|
||||
# embree
|
||||
# Embree
|
||||
if(WITH_CYCLES_EMBREE)
|
||||
find_package(embree 3.8.0 REQUIRED)
|
||||
find_package(Embree 3.8.0 REQUIRED)
|
||||
endif()
|
||||
|
||||
####
|
||||
|
@@ -1760,7 +1760,7 @@ void CUDADevice::denoise(RenderTile &rtile, DenoisingTask &denoising)
|
||||
denoising.render_buffer.samples = rtile.sample;
|
||||
denoising.buffer.gpu_temporary_mem = true;
|
||||
|
||||
denoising.run_denoising(&rtile);
|
||||
denoising.run_denoising(rtile);
|
||||
}
|
||||
|
||||
void CUDADevice::adaptive_sampling_filter(uint filter_sample,
|
||||
|
@@ -209,13 +209,13 @@ bool Device::bind_fallback_display_space_shader(const float width, const float h
|
||||
glUseProgram(fallback_shader_program);
|
||||
image_texture_location = glGetUniformLocation(fallback_shader_program, "image_texture");
|
||||
if (image_texture_location < 0) {
|
||||
LOG(ERROR) << "Shader doesn't containt the 'image_texture' uniform.";
|
||||
LOG(ERROR) << "Shader doesn't contain the 'image_texture' uniform.";
|
||||
return false;
|
||||
}
|
||||
|
||||
fullscreen_location = glGetUniformLocation(fallback_shader_program, "fullscreen");
|
||||
if (fullscreen_location < 0) {
|
||||
LOG(ERROR) << "Shader doesn't containt the 'fullscreen' uniform.";
|
||||
LOG(ERROR) << "Shader doesn't contain the 'fullscreen' uniform.";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@@ -439,10 +439,10 @@ class Device {
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
virtual void map_neighbor_tiles(Device * /*sub_device*/, RenderTile * /*tiles*/)
|
||||
virtual void map_neighbor_tiles(Device * /*sub_device*/, RenderTileNeighbors & /*neighbors*/)
|
||||
{
|
||||
}
|
||||
virtual void unmap_neighbor_tiles(Device * /*sub_device*/, RenderTile * /*tiles*/)
|
||||
virtual void unmap_neighbor_tiles(Device * /*sub_device*/, RenderTileNeighbors & /*neighbors*/)
|
||||
{
|
||||
}
|
||||
|
||||
|
@@ -182,6 +182,7 @@ class CPUDevice : public Device {
|
||||
oidn::DeviceRef oidn_device;
|
||||
oidn::FilterRef oidn_filter;
|
||||
#endif
|
||||
thread_spin_lock oidn_task_lock;
|
||||
|
||||
bool use_split_kernel;
|
||||
|
||||
@@ -948,12 +949,25 @@ class CPUDevice : public Device {
|
||||
}
|
||||
}
|
||||
|
||||
void denoise_openimagedenoise(DeviceTask &task, RenderTile &rtile)
|
||||
void denoise_openimagedenoise_buffer(DeviceTask &task,
|
||||
float *buffer,
|
||||
const size_t offset,
|
||||
const size_t stride,
|
||||
const size_t x,
|
||||
const size_t y,
|
||||
const size_t w,
|
||||
const size_t h,
|
||||
const float scale)
|
||||
{
|
||||
#ifdef WITH_OPENIMAGEDENOISE
|
||||
assert(openimagedenoise_supported());
|
||||
|
||||
/* Only one at a time, since OpenImageDenoise itself is multithreaded. */
|
||||
/* Only one at a time, since OpenImageDenoise itself is multithreaded for full
|
||||
* buffers, and for tiled rendering because creating multiple devices and filters
|
||||
* is slow and memory hungry as well.
|
||||
*
|
||||
* TODO: optimize tiled rendering case, by batching together denoising of many
|
||||
* tiles somehow? */
|
||||
static thread_mutex mutex;
|
||||
thread_scoped_lock lock(mutex);
|
||||
|
||||
@@ -964,54 +978,192 @@ class CPUDevice : public Device {
|
||||
}
|
||||
if (!oidn_filter) {
|
||||
oidn_filter = oidn_device.newFilter("RT");
|
||||
oidn_filter.set("hdr", true);
|
||||
oidn_filter.set("srgb", false);
|
||||
}
|
||||
|
||||
/* Copy pixels from compute device to CPU (no-op for CPU device). */
|
||||
rtile.buffers->buffer.copy_from_device();
|
||||
|
||||
/* Set images with appropriate stride for our interleaved pass storage. */
|
||||
const struct {
|
||||
struct {
|
||||
const char *name;
|
||||
int offset;
|
||||
} passes[] = {{"color", task.pass_denoising_data + DENOISING_PASS_COLOR},
|
||||
{"normal", task.pass_denoising_data + DENOISING_PASS_NORMAL},
|
||||
{"albedo", task.pass_denoising_data + DENOISING_PASS_ALBEDO},
|
||||
{"output", 0},
|
||||
const int offset;
|
||||
const bool scale;
|
||||
const bool use;
|
||||
array<float> scaled_buffer;
|
||||
} passes[] = {{"color", task.pass_denoising_data + DENOISING_PASS_COLOR, false, true},
|
||||
{"albedo",
|
||||
task.pass_denoising_data + DENOISING_PASS_ALBEDO,
|
||||
true,
|
||||
task.denoising.input_passes >= DENOISER_INPUT_RGB_ALBEDO},
|
||||
{"normal",
|
||||
task.pass_denoising_data + DENOISING_PASS_NORMAL,
|
||||
true,
|
||||
task.denoising.input_passes >= DENOISER_INPUT_RGB_ALBEDO_NORMAL},
|
||||
{"output", 0, false, true},
|
||||
{ NULL,
|
||||
0 }};
|
||||
|
||||
for (int i = 0; passes[i].name; i++) {
|
||||
const int64_t offset = rtile.offset + rtile.x + rtile.y * rtile.stride;
|
||||
const int64_t buffer_offset = (offset * task.pass_stride + passes[i].offset) * sizeof(float);
|
||||
const int64_t pixel_stride = task.pass_stride * sizeof(float);
|
||||
const int64_t row_stride = rtile.stride * pixel_stride;
|
||||
if (!passes[i].use) {
|
||||
continue;
|
||||
}
|
||||
|
||||
oidn_filter.setImage(passes[i].name,
|
||||
(char *)rtile.buffer + buffer_offset,
|
||||
oidn::Format::Float3,
|
||||
rtile.w,
|
||||
rtile.h,
|
||||
0,
|
||||
pixel_stride,
|
||||
row_stride);
|
||||
const int64_t pixel_offset = offset + x + y * stride;
|
||||
const int64_t buffer_offset = (pixel_offset * task.pass_stride + passes[i].offset);
|
||||
const int64_t pixel_stride = task.pass_stride;
|
||||
const int64_t row_stride = stride * pixel_stride;
|
||||
|
||||
if (passes[i].scale && scale != 1.0f) {
|
||||
/* Normalize albedo and normal passes as they are scaled by the number of samples.
|
||||
* For the color passes OIDN will perform auto-exposure making it unnecessary. */
|
||||
array<float> &scaled_buffer = passes[i].scaled_buffer;
|
||||
scaled_buffer.resize(w * h * 3);
|
||||
|
||||
for (int y = 0; y < h; y++) {
|
||||
const float *pass_row = buffer + buffer_offset + y * row_stride;
|
||||
float *scaled_row = scaled_buffer.data() + y * w * 3;
|
||||
|
||||
for (int x = 0; x < w; x++) {
|
||||
scaled_row[x * 3 + 0] = pass_row[x * pixel_stride + 0] * scale;
|
||||
scaled_row[x * 3 + 1] = pass_row[x * pixel_stride + 1] * scale;
|
||||
scaled_row[x * 3 + 2] = pass_row[x * pixel_stride + 2] * scale;
|
||||
}
|
||||
}
|
||||
|
||||
oidn_filter.setImage(
|
||||
passes[i].name, scaled_buffer.data(), oidn::Format::Float3, w, h, 0, 0, 0);
|
||||
}
|
||||
else {
|
||||
oidn_filter.setImage(passes[i].name,
|
||||
buffer + buffer_offset,
|
||||
oidn::Format::Float3,
|
||||
w,
|
||||
h,
|
||||
0,
|
||||
pixel_stride * sizeof(float),
|
||||
row_stride * sizeof(float));
|
||||
}
|
||||
}
|
||||
|
||||
/* Execute filter. */
|
||||
oidn_filter.set("hdr", true);
|
||||
oidn_filter.set("srgb", false);
|
||||
oidn_filter.commit();
|
||||
oidn_filter.execute();
|
||||
|
||||
/* todo: it may be possible to avoid this copy, but we have to ensure that
|
||||
* when other code copies data from the device it doesn't overwrite the
|
||||
* denoiser buffers. */
|
||||
rtile.buffers->buffer.copy_to_device();
|
||||
#else
|
||||
(void)task;
|
||||
(void)rtile;
|
||||
(void)buffer;
|
||||
(void)offset;
|
||||
(void)stride;
|
||||
(void)x;
|
||||
(void)y;
|
||||
(void)w;
|
||||
(void)h;
|
||||
(void)scale;
|
||||
#endif
|
||||
}
|
||||
|
||||
void denoise_openimagedenoise(DeviceTask &task, RenderTile &rtile)
|
||||
{
|
||||
if (task.type == DeviceTask::DENOISE_BUFFER) {
|
||||
/* Copy pixels from compute device to CPU (no-op for CPU device). */
|
||||
rtile.buffers->buffer.copy_from_device();
|
||||
|
||||
denoise_openimagedenoise_buffer(task,
|
||||
(float *)rtile.buffer,
|
||||
rtile.offset,
|
||||
rtile.stride,
|
||||
rtile.x,
|
||||
rtile.y,
|
||||
rtile.w,
|
||||
rtile.h,
|
||||
1.0f / rtile.sample);
|
||||
|
||||
/* todo: it may be possible to avoid this copy, but we have to ensure that
|
||||
* when other code copies data from the device it doesn't overwrite the
|
||||
* denoiser buffers. */
|
||||
rtile.buffers->buffer.copy_to_device();
|
||||
}
|
||||
else {
|
||||
/* Per-tile denoising. */
|
||||
rtile.sample = rtile.start_sample + rtile.num_samples;
|
||||
const float scale = 1.0f / rtile.sample;
|
||||
const float invscale = rtile.sample;
|
||||
const size_t pass_stride = task.pass_stride;
|
||||
|
||||
/* Map neighboring tiles into one buffer for denoising. */
|
||||
RenderTileNeighbors neighbors(rtile);
|
||||
task.map_neighbor_tiles(neighbors, this);
|
||||
RenderTile ¢er_tile = neighbors.tiles[RenderTileNeighbors::CENTER];
|
||||
rtile = center_tile;
|
||||
|
||||
/* Calculate size of the tile to denoise (including overlap). The overlap
|
||||
* size was chosen empirically. OpenImageDenoise specifies an overlap size
|
||||
* of 128 but this is significantly bigger than typical tile size. */
|
||||
const int4 rect = rect_clip(rect_expand(center_tile.bounds(), 64), neighbors.bounds());
|
||||
const int2 rect_size = make_int2(rect.z - rect.x, rect.w - rect.y);
|
||||
|
||||
/* Adjacent tiles are in separate memory regions, copy into single buffer. */
|
||||
array<float> merged(rect_size.x * rect_size.y * task.pass_stride);
|
||||
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
RenderTile &ntile = neighbors.tiles[i];
|
||||
if (!ntile.buffer) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const int xmin = max(ntile.x, rect.x);
|
||||
const int ymin = max(ntile.y, rect.y);
|
||||
const int xmax = min(ntile.x + ntile.w, rect.z);
|
||||
const int ymax = min(ntile.y + ntile.h, rect.w);
|
||||
|
||||
const size_t tile_offset = ntile.offset + xmin + ymin * ntile.stride;
|
||||
const float *tile_buffer = (float *)ntile.buffer + tile_offset * pass_stride;
|
||||
|
||||
const size_t merged_stride = rect_size.x;
|
||||
const size_t merged_offset = (xmin - rect.x) + (ymin - rect.y) * merged_stride;
|
||||
float *merged_buffer = merged.data() + merged_offset * pass_stride;
|
||||
|
||||
for (int y = ymin; y < ymax; y++) {
|
||||
for (int x = 0; x < pass_stride * (xmax - xmin); x++) {
|
||||
merged_buffer[x] = tile_buffer[x] * scale;
|
||||
}
|
||||
tile_buffer += ntile.stride * pass_stride;
|
||||
merged_buffer += merged_stride * pass_stride;
|
||||
}
|
||||
}
|
||||
|
||||
/* Denoise */
|
||||
denoise_openimagedenoise_buffer(
|
||||
task, merged.data(), 0, rect_size.x, 0, 0, rect_size.x, rect_size.y, 1.0f);
|
||||
|
||||
/* Copy back result from merged buffer. */
|
||||
RenderTile &ntile = neighbors.target;
|
||||
if (ntile.buffer) {
|
||||
const int xmin = max(ntile.x, rect.x);
|
||||
const int ymin = max(ntile.y, rect.y);
|
||||
const int xmax = min(ntile.x + ntile.w, rect.z);
|
||||
const int ymax = min(ntile.y + ntile.h, rect.w);
|
||||
|
||||
const size_t tile_offset = ntile.offset + xmin + ymin * ntile.stride;
|
||||
float *tile_buffer = (float *)ntile.buffer + tile_offset * pass_stride;
|
||||
|
||||
const size_t merged_stride = rect_size.x;
|
||||
const size_t merged_offset = (xmin - rect.x) + (ymin - rect.y) * merged_stride;
|
||||
const float *merged_buffer = merged.data() + merged_offset * pass_stride;
|
||||
|
||||
for (int y = ymin; y < ymax; y++) {
|
||||
for (int x = 0; x < pass_stride * (xmax - xmin); x += pass_stride) {
|
||||
tile_buffer[x + 0] = merged_buffer[x + 0] * invscale;
|
||||
tile_buffer[x + 1] = merged_buffer[x + 1] * invscale;
|
||||
tile_buffer[x + 2] = merged_buffer[x + 2] * invscale;
|
||||
}
|
||||
tile_buffer += ntile.stride * pass_stride;
|
||||
merged_buffer += merged_stride * pass_stride;
|
||||
}
|
||||
}
|
||||
|
||||
task.unmap_neighbor_tiles(neighbors, this);
|
||||
}
|
||||
}
|
||||
|
||||
void denoise_nlm(DenoisingTask &denoising, RenderTile &tile)
|
||||
{
|
||||
ProfilingHelper profiling(denoising.profiler, PROFILING_DENOISING);
|
||||
@@ -1040,7 +1192,7 @@ class CPUDevice : public Device {
|
||||
denoising.render_buffer.samples = tile.sample;
|
||||
denoising.buffer.gpu_temporary_mem = false;
|
||||
|
||||
denoising.run_denoising(&tile);
|
||||
denoising.run_denoising(tile);
|
||||
}
|
||||
|
||||
void thread_render(DeviceTask &task)
|
||||
@@ -1070,10 +1222,23 @@ class CPUDevice : public Device {
|
||||
}
|
||||
}
|
||||
|
||||
/* NLM denoiser. */
|
||||
DenoisingTask *denoising = NULL;
|
||||
|
||||
/* OpenImageDenoise: we can only denoise with one thread at a time, so to
|
||||
* avoid waiting with mutex locks in the denoiser, we let only a single
|
||||
* thread acquire denoising tiles. */
|
||||
uint tile_types = task.tile_types;
|
||||
bool hold_denoise_lock = false;
|
||||
if ((tile_types & RenderTile::DENOISE) && task.denoising.type == DENOISER_OPENIMAGEDENOISE) {
|
||||
if (!oidn_task_lock.try_lock()) {
|
||||
tile_types &= ~RenderTile::DENOISE;
|
||||
hold_denoise_lock = true;
|
||||
}
|
||||
}
|
||||
|
||||
RenderTile tile;
|
||||
while (task.acquire_tile(this, tile, task.tile_types)) {
|
||||
while (task.acquire_tile(this, tile, tile_types)) {
|
||||
if (tile.task == RenderTile::PATH_TRACE) {
|
||||
if (use_split_kernel) {
|
||||
device_only_memory<uchar> void_buffer(this, "void_buffer");
|
||||
@@ -1108,6 +1273,10 @@ class CPUDevice : public Device {
|
||||
}
|
||||
}
|
||||
|
||||
if (hold_denoise_lock) {
|
||||
oidn_task_lock.unlock();
|
||||
}
|
||||
|
||||
profiler.remove_state(&kg->profiler);
|
||||
|
||||
thread_kernel_globals_free((KernelGlobals *)kgbuffer.device_pointer);
|
||||
|
@@ -71,29 +71,30 @@ DenoisingTask::~DenoisingTask()
|
||||
tile_info_mem.free();
|
||||
}
|
||||
|
||||
void DenoisingTask::set_render_buffer(RenderTile *rtiles)
|
||||
void DenoisingTask::set_render_buffer(RenderTileNeighbors &neighbors)
|
||||
{
|
||||
for (int i = 0; i < 9; i++) {
|
||||
tile_info->offsets[i] = rtiles[i].offset;
|
||||
tile_info->strides[i] = rtiles[i].stride;
|
||||
tile_info->buffers[i] = rtiles[i].buffer;
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
RenderTile &rtile = neighbors.tiles[i];
|
||||
tile_info->offsets[i] = rtile.offset;
|
||||
tile_info->strides[i] = rtile.stride;
|
||||
tile_info->buffers[i] = rtile.buffer;
|
||||
}
|
||||
tile_info->x[0] = rtiles[3].x;
|
||||
tile_info->x[1] = rtiles[4].x;
|
||||
tile_info->x[2] = rtiles[5].x;
|
||||
tile_info->x[3] = rtiles[5].x + rtiles[5].w;
|
||||
tile_info->y[0] = rtiles[1].y;
|
||||
tile_info->y[1] = rtiles[4].y;
|
||||
tile_info->y[2] = rtiles[7].y;
|
||||
tile_info->y[3] = rtiles[7].y + rtiles[7].h;
|
||||
tile_info->x[0] = neighbors.tiles[3].x;
|
||||
tile_info->x[1] = neighbors.tiles[4].x;
|
||||
tile_info->x[2] = neighbors.tiles[5].x;
|
||||
tile_info->x[3] = neighbors.tiles[5].x + neighbors.tiles[5].w;
|
||||
tile_info->y[0] = neighbors.tiles[1].y;
|
||||
tile_info->y[1] = neighbors.tiles[4].y;
|
||||
tile_info->y[2] = neighbors.tiles[7].y;
|
||||
tile_info->y[3] = neighbors.tiles[7].y + neighbors.tiles[7].h;
|
||||
|
||||
target_buffer.offset = rtiles[9].offset;
|
||||
target_buffer.stride = rtiles[9].stride;
|
||||
target_buffer.ptr = rtiles[9].buffer;
|
||||
target_buffer.offset = neighbors.target.offset;
|
||||
target_buffer.stride = neighbors.target.stride;
|
||||
target_buffer.ptr = neighbors.target.buffer;
|
||||
|
||||
if (do_prefilter && rtiles[9].buffers) {
|
||||
if (do_prefilter && neighbors.target.buffers) {
|
||||
target_buffer.denoising_output_offset =
|
||||
rtiles[9].buffers->params.get_denoising_prefiltered_offset();
|
||||
neighbors.target.buffers->params.get_denoising_prefiltered_offset();
|
||||
}
|
||||
else {
|
||||
target_buffer.denoising_output_offset = 0;
|
||||
@@ -320,12 +321,11 @@ void DenoisingTask::reconstruct()
|
||||
functions.solve(target_buffer.ptr);
|
||||
}
|
||||
|
||||
void DenoisingTask::run_denoising(RenderTile *tile)
|
||||
void DenoisingTask::run_denoising(RenderTile &tile)
|
||||
{
|
||||
RenderTile rtiles[10];
|
||||
rtiles[4] = *tile;
|
||||
functions.map_neighbor_tiles(rtiles);
|
||||
set_render_buffer(rtiles);
|
||||
RenderTileNeighbors neighbors(tile);
|
||||
functions.map_neighbor_tiles(neighbors);
|
||||
set_render_buffer(neighbors);
|
||||
|
||||
setup_denoising_buffer();
|
||||
|
||||
@@ -347,7 +347,7 @@ void DenoisingTask::run_denoising(RenderTile *tile)
|
||||
write_buffer();
|
||||
}
|
||||
|
||||
functions.unmap_neighbor_tiles(rtiles);
|
||||
functions.unmap_neighbor_tiles(neighbors);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -102,8 +102,8 @@ class DenoisingTask {
|
||||
device_ptr output_ptr)>
|
||||
detect_outliers;
|
||||
function<bool(int out_offset, device_ptr frop_ptr, device_ptr buffer_ptr)> write_feature;
|
||||
function<void(RenderTile *rtiles)> map_neighbor_tiles;
|
||||
function<void(RenderTile *rtiles)> unmap_neighbor_tiles;
|
||||
function<void(RenderTileNeighbors &neighbors)> map_neighbor_tiles;
|
||||
function<void(RenderTileNeighbors &neighbors)> unmap_neighbor_tiles;
|
||||
} functions;
|
||||
|
||||
/* Stores state of the current Reconstruction operation,
|
||||
@@ -154,7 +154,7 @@ class DenoisingTask {
|
||||
DenoisingTask(Device *device, const DeviceTask &task);
|
||||
~DenoisingTask();
|
||||
|
||||
void run_denoising(RenderTile *tile);
|
||||
void run_denoising(RenderTile &tile);
|
||||
|
||||
struct DenoiseBuffers {
|
||||
int pass_stride;
|
||||
@@ -179,7 +179,7 @@ class DenoisingTask {
|
||||
protected:
|
||||
Device *device;
|
||||
|
||||
void set_render_buffer(RenderTile *rtiles);
|
||||
void set_render_buffer(RenderTileNeighbors &neighbors);
|
||||
void setup_denoising_buffer();
|
||||
void prefilter_shadowing();
|
||||
void prefilter_features();
|
||||
|
@@ -177,8 +177,11 @@ class MultiDevice : public Device {
|
||||
return false;
|
||||
|
||||
if (requested_features.use_denoising) {
|
||||
/* Only need denoising feature, everything else is unused. */
|
||||
DeviceRequestedFeatures denoising_features;
|
||||
denoising_features.use_denoising = true;
|
||||
foreach (SubDevice &sub, denoising_devices)
|
||||
if (!sub.device->load_kernels(requested_features))
|
||||
if (!sub.device->load_kernels(denoising_features))
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -581,20 +584,22 @@ class MultiDevice : public Device {
|
||||
return -1;
|
||||
}
|
||||
|
||||
void map_neighbor_tiles(Device *sub_device, RenderTile *tiles)
|
||||
void map_neighbor_tiles(Device *sub_device, RenderTileNeighbors &neighbors)
|
||||
{
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (!tiles[i].buffers) {
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
RenderTile &tile = neighbors.tiles[i];
|
||||
|
||||
if (!tile.buffers) {
|
||||
continue;
|
||||
}
|
||||
|
||||
device_vector<float> &mem = tiles[i].buffers->buffer;
|
||||
tiles[i].buffer = mem.device_pointer;
|
||||
device_vector<float> &mem = tile.buffers->buffer;
|
||||
tile.buffer = mem.device_pointer;
|
||||
|
||||
if (mem.device == this && matching_rendering_and_denoising_devices) {
|
||||
/* Skip unnecessary copies in viewport mode (buffer covers the
|
||||
* whole image), but still need to fix up the tile device pointer. */
|
||||
map_tile(sub_device, tiles[i]);
|
||||
map_tile(sub_device, tile);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -607,15 +612,15 @@ class MultiDevice : public Device {
|
||||
* also required for the case where a CPU thread is denoising
|
||||
* a tile rendered on the GPU. In that case we have to avoid
|
||||
* overwriting the buffer being de-noised by the CPU thread. */
|
||||
if (!tiles[i].buffers->map_neighbor_copied) {
|
||||
tiles[i].buffers->map_neighbor_copied = true;
|
||||
if (!tile.buffers->map_neighbor_copied) {
|
||||
tile.buffers->map_neighbor_copied = true;
|
||||
mem.copy_from_device();
|
||||
}
|
||||
|
||||
if (mem.device == this) {
|
||||
/* Can re-use memory if tile is already allocated on the sub device. */
|
||||
map_tile(sub_device, tiles[i]);
|
||||
mem.swap_device(sub_device, mem.device_size, tiles[i].buffer);
|
||||
map_tile(sub_device, tile);
|
||||
mem.swap_device(sub_device, mem.device_size, tile.buffer);
|
||||
}
|
||||
else {
|
||||
mem.swap_device(sub_device, 0, 0);
|
||||
@@ -623,40 +628,42 @@ class MultiDevice : public Device {
|
||||
|
||||
mem.copy_to_device();
|
||||
|
||||
tiles[i].buffer = mem.device_pointer;
|
||||
tiles[i].device_size = mem.device_size;
|
||||
tile.buffer = mem.device_pointer;
|
||||
tile.device_size = mem.device_size;
|
||||
|
||||
mem.restore_device();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void unmap_neighbor_tiles(Device *sub_device, RenderTile *tiles)
|
||||
void unmap_neighbor_tiles(Device *sub_device, RenderTileNeighbors &neighbors)
|
||||
{
|
||||
device_vector<float> &mem = tiles[9].buffers->buffer;
|
||||
RenderTile &target_tile = neighbors.target;
|
||||
device_vector<float> &mem = target_tile.buffers->buffer;
|
||||
|
||||
if (mem.device == this && matching_rendering_and_denoising_devices) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Copy denoised result back to the host. */
|
||||
mem.swap_device(sub_device, tiles[9].device_size, tiles[9].buffer);
|
||||
mem.swap_device(sub_device, target_tile.device_size, target_tile.buffer);
|
||||
mem.copy_from_device();
|
||||
mem.restore_device();
|
||||
|
||||
/* Copy denoised result to the original device. */
|
||||
mem.copy_to_device();
|
||||
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (!tiles[i].buffers) {
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
RenderTile &tile = neighbors.tiles[i];
|
||||
if (!tile.buffers) {
|
||||
continue;
|
||||
}
|
||||
|
||||
device_vector<float> &mem = tiles[i].buffers->buffer;
|
||||
device_vector<float> &mem = tile.buffers->buffer;
|
||||
|
||||
if (mem.device != sub_device && mem.device != this) {
|
||||
/* Free up memory again if it was allocated for the copy above. */
|
||||
mem.swap_device(sub_device, tiles[i].device_size, tiles[i].buffer);
|
||||
mem.swap_device(sub_device, tile.device_size, tile.buffer);
|
||||
sub_device->mem_free(mem);
|
||||
mem.restore_device();
|
||||
}
|
||||
|
@@ -131,8 +131,12 @@ class OptiXDevice : public CUDADevice {
|
||||
PG_RGEN,
|
||||
PG_MISS,
|
||||
PG_HITD, // Default hit group
|
||||
PG_HITL, // __BVH_LOCAL__ hit group
|
||||
PG_HITS, // __SHADOW_RECORD_ALL__ hit group
|
||||
PG_HITL, // __BVH_LOCAL__ hit group (only used for triangles)
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
PG_HITD_MOTION,
|
||||
PG_HITS_MOTION,
|
||||
# endif
|
||||
# ifdef WITH_CYCLES_DEBUG
|
||||
PG_EXCP,
|
||||
# endif
|
||||
@@ -177,6 +181,7 @@ class OptiXDevice : public CUDADevice {
|
||||
OptixDeviceContext context = NULL;
|
||||
|
||||
OptixModule optix_module = NULL; // All necessary OptiX kernels are in one module
|
||||
OptixModule builtin_modules[2] = {};
|
||||
OptixPipeline pipelines[NUM_PIPELINES] = {};
|
||||
|
||||
bool motion_blur = false;
|
||||
@@ -264,6 +269,9 @@ class OptiXDevice : public CUDADevice {
|
||||
// Unload modules
|
||||
if (optix_module != NULL)
|
||||
optixModuleDestroy(optix_module);
|
||||
for (unsigned int i = 0; i < 2; ++i)
|
||||
if (builtin_modules[i] != NULL)
|
||||
optixModuleDestroy(builtin_modules[i]);
|
||||
for (unsigned int i = 0; i < NUM_PIPELINES; ++i)
|
||||
if (pipelines[i] != NULL)
|
||||
optixPipelineDestroy(pipelines[i]);
|
||||
@@ -338,6 +346,12 @@ class OptiXDevice : public CUDADevice {
|
||||
optixModuleDestroy(optix_module);
|
||||
optix_module = NULL;
|
||||
}
|
||||
for (unsigned int i = 0; i < 2; ++i) {
|
||||
if (builtin_modules[i] != NULL) {
|
||||
optixModuleDestroy(builtin_modules[i]);
|
||||
builtin_modules[i] = NULL;
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < NUM_PIPELINES; ++i) {
|
||||
if (pipelines[i] != NULL) {
|
||||
optixPipelineDestroy(pipelines[i]);
|
||||
@@ -369,6 +383,18 @@ class OptiXDevice : public CUDADevice {
|
||||
# endif
|
||||
pipeline_options.pipelineLaunchParamsVariableName = "__params"; // See kernel_globals.h
|
||||
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
pipeline_options.usesPrimitiveTypeFlags = OPTIX_PRIMITIVE_TYPE_FLAGS_TRIANGLE;
|
||||
if (requested_features.use_hair) {
|
||||
if (DebugFlags().optix.curves_api && requested_features.use_hair_thick) {
|
||||
pipeline_options.usesPrimitiveTypeFlags |= OPTIX_PRIMITIVE_TYPE_FLAGS_ROUND_CUBIC_BSPLINE;
|
||||
}
|
||||
else {
|
||||
pipeline_options.usesPrimitiveTypeFlags |= OPTIX_PRIMITIVE_TYPE_FLAGS_CUSTOM;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
// Keep track of whether motion blur is enabled, so to enable/disable motion in BVH builds
|
||||
// This is necessary since objects may be reported to have motion if the Vector pass is
|
||||
// active, but may still need to be rendered without motion blur if that isn't active as well
|
||||
@@ -442,6 +468,34 @@ class OptiXDevice : public CUDADevice {
|
||||
group_descs[PG_HITD].hitgroup.entryFunctionNameIS = "__intersection__curve_ribbon";
|
||||
group_descs[PG_HITS].hitgroup.entryFunctionNameIS = "__intersection__curve_ribbon";
|
||||
}
|
||||
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
if (DebugFlags().optix.curves_api && requested_features.use_hair_thick) {
|
||||
OptixBuiltinISOptions builtin_options;
|
||||
builtin_options.builtinISModuleType = OPTIX_PRIMITIVE_TYPE_ROUND_CUBIC_BSPLINE;
|
||||
builtin_options.usesMotionBlur = false;
|
||||
|
||||
check_result_optix_ret(optixBuiltinISModuleGet(
|
||||
context, &module_options, &pipeline_options, &builtin_options, &builtin_modules[0]));
|
||||
|
||||
group_descs[PG_HITD].hitgroup.moduleIS = builtin_modules[0];
|
||||
group_descs[PG_HITD].hitgroup.entryFunctionNameIS = nullptr;
|
||||
group_descs[PG_HITS].hitgroup.moduleIS = builtin_modules[0];
|
||||
group_descs[PG_HITS].hitgroup.entryFunctionNameIS = nullptr;
|
||||
|
||||
if (motion_blur) {
|
||||
builtin_options.usesMotionBlur = true;
|
||||
|
||||
check_result_optix_ret(optixBuiltinISModuleGet(
|
||||
context, &module_options, &pipeline_options, &builtin_options, &builtin_modules[1]));
|
||||
|
||||
group_descs[PG_HITD_MOTION] = group_descs[PG_HITD];
|
||||
group_descs[PG_HITD_MOTION].hitgroup.moduleIS = builtin_modules[1];
|
||||
group_descs[PG_HITS_MOTION] = group_descs[PG_HITS];
|
||||
group_descs[PG_HITS_MOTION].hitgroup.moduleIS = builtin_modules[1];
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
if (requested_features.use_subsurface || requested_features.use_shader_raytrace) {
|
||||
@@ -493,8 +547,14 @@ class OptiXDevice : public CUDADevice {
|
||||
unsigned int trace_css = stack_size[PG_HITD].cssCH;
|
||||
// This is based on the maximum of closest-hit and any-hit/intersection programs
|
||||
trace_css = std::max(trace_css, stack_size[PG_HITD].cssIS + stack_size[PG_HITD].cssAH);
|
||||
trace_css = std::max(trace_css, stack_size[PG_HITL].cssIS + stack_size[PG_HITL].cssAH);
|
||||
trace_css = std::max(trace_css, stack_size[PG_HITS].cssIS + stack_size[PG_HITS].cssAH);
|
||||
trace_css = std::max(trace_css, stack_size[PG_HITL].cssIS + stack_size[PG_HITL].cssAH);
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
trace_css = std::max(trace_css,
|
||||
stack_size[PG_HITD_MOTION].cssIS + stack_size[PG_HITD_MOTION].cssAH);
|
||||
trace_css = std::max(trace_css,
|
||||
stack_size[PG_HITS_MOTION].cssIS + stack_size[PG_HITS_MOTION].cssAH);
|
||||
# endif
|
||||
|
||||
OptixPipelineLinkOptions link_options;
|
||||
link_options.maxTraceDepth = 1;
|
||||
@@ -503,17 +563,23 @@ class OptiXDevice : public CUDADevice {
|
||||
# else
|
||||
link_options.debugLevel = OPTIX_COMPILE_DEBUG_LEVEL_LINEINFO;
|
||||
# endif
|
||||
link_options.overrideUsesMotionBlur = pipeline_options.usesMotionBlur;
|
||||
# if OPTIX_ABI_VERSION < 24
|
||||
link_options.overrideUsesMotionBlur = motion_blur;
|
||||
# endif
|
||||
|
||||
{ // Create path tracing pipeline
|
||||
OptixProgramGroup pipeline_groups[] = {
|
||||
groups[PG_RGEN],
|
||||
groups[PG_MISS],
|
||||
groups[PG_HITD],
|
||||
groups[PG_HITS],
|
||||
groups[PG_HITL],
|
||||
groups[PG_RGEN],
|
||||
groups[PG_MISS],
|
||||
groups[PG_HITD],
|
||||
groups[PG_HITS],
|
||||
groups[PG_HITL],
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
groups[PG_HITD_MOTION],
|
||||
groups[PG_HITS_MOTION],
|
||||
# endif
|
||||
# ifdef WITH_CYCLES_DEBUG
|
||||
groups[PG_EXCP],
|
||||
groups[PG_EXCP],
|
||||
# endif
|
||||
};
|
||||
check_result_optix_ret(
|
||||
@@ -530,8 +596,8 @@ class OptiXDevice : public CUDADevice {
|
||||
const unsigned int css = stack_size[PG_RGEN].cssRG + link_options.maxTraceDepth * trace_css;
|
||||
|
||||
// Set stack size depending on pipeline options
|
||||
check_result_optix_ret(optixPipelineSetStackSize(
|
||||
pipelines[PIP_PATH_TRACE], 0, 0, css, (pipeline_options.usesMotionBlur ? 3 : 2)));
|
||||
check_result_optix_ret(
|
||||
optixPipelineSetStackSize(pipelines[PIP_PATH_TRACE], 0, 0, css, (motion_blur ? 3 : 2)));
|
||||
}
|
||||
|
||||
// Only need to create shader evaluation pipeline if one of these features is used:
|
||||
@@ -541,15 +607,19 @@ class OptiXDevice : public CUDADevice {
|
||||
|
||||
if (use_shader_eval_pipeline) { // Create shader evaluation pipeline
|
||||
OptixProgramGroup pipeline_groups[] = {
|
||||
groups[PG_BAKE],
|
||||
groups[PG_DISP],
|
||||
groups[PG_BACK],
|
||||
groups[PG_MISS],
|
||||
groups[PG_HITD],
|
||||
groups[PG_HITS],
|
||||
groups[PG_HITL],
|
||||
groups[PG_BAKE],
|
||||
groups[PG_DISP],
|
||||
groups[PG_BACK],
|
||||
groups[PG_MISS],
|
||||
groups[PG_HITD],
|
||||
groups[PG_HITS],
|
||||
groups[PG_HITL],
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
groups[PG_HITD_MOTION],
|
||||
groups[PG_HITS_MOTION],
|
||||
# endif
|
||||
# ifdef WITH_CYCLES_DEBUG
|
||||
groups[PG_EXCP],
|
||||
groups[PG_EXCP],
|
||||
# endif
|
||||
};
|
||||
check_result_optix_ret(
|
||||
@@ -672,7 +742,11 @@ class OptiXDevice : public CUDADevice {
|
||||
sbt_params.missRecordCount = 1;
|
||||
sbt_params.hitgroupRecordBase = sbt_data.device_pointer + PG_HITD * sizeof(SbtRecord);
|
||||
sbt_params.hitgroupRecordStrideInBytes = sizeof(SbtRecord);
|
||||
sbt_params.hitgroupRecordCount = 3; // PG_HITD, PG_HITL, PG_HITS
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
sbt_params.hitgroupRecordCount = 5; // PG_HITD(_MOTION), PG_HITS(_MOTION), PG_HITL
|
||||
# else
|
||||
sbt_params.hitgroupRecordCount = 3; // PG_HITD, PG_HITS, PG_HITL
|
||||
# endif
|
||||
|
||||
// Launch the ray generation program
|
||||
check_result_optix(optixLaunch(pipelines[PIP_PATH_TRACE],
|
||||
@@ -727,19 +801,18 @@ class OptiXDevice : public CUDADevice {
|
||||
// 0 1 2
|
||||
// 3 4 5
|
||||
// 6 7 8 9
|
||||
RenderTile rtiles[10];
|
||||
rtiles[4] = rtile;
|
||||
task.map_neighbor_tiles(rtiles, this);
|
||||
rtile = rtiles[4]; // Tile may have been modified by mapping code
|
||||
RenderTileNeighbors neighbors(rtile);
|
||||
task.map_neighbor_tiles(neighbors, this);
|
||||
RenderTile ¢er_tile = neighbors.tiles[RenderTileNeighbors::CENTER];
|
||||
RenderTile &target_tile = neighbors.target;
|
||||
rtile = center_tile; // Tile may have been modified by mapping code
|
||||
|
||||
// Calculate size of the tile to denoise (including overlap)
|
||||
int4 rect = make_int4(
|
||||
rtiles[4].x, rtiles[4].y, rtiles[4].x + rtiles[4].w, rtiles[4].y + rtiles[4].h);
|
||||
int4 rect = center_tile.bounds();
|
||||
// Overlap between tiles has to be at least 64 pixels
|
||||
// TODO(pmours): Query this value from OptiX
|
||||
rect = rect_expand(rect, 64);
|
||||
int4 clip_rect = make_int4(
|
||||
rtiles[3].x, rtiles[1].y, rtiles[5].x + rtiles[5].w, rtiles[7].y + rtiles[7].h);
|
||||
int4 clip_rect = neighbors.bounds();
|
||||
rect = rect_clip(rect, clip_rect);
|
||||
int2 rect_size = make_int2(rect.z - rect.x, rect.w - rect.y);
|
||||
int2 overlap_offset = make_int2(rtile.x - rect.x, rtile.y - rect.y);
|
||||
@@ -760,14 +833,14 @@ class OptiXDevice : public CUDADevice {
|
||||
device_only_memory<float> input(this, "denoiser input");
|
||||
device_vector<TileInfo> tile_info_mem(this, "denoiser tile info", MEM_READ_WRITE);
|
||||
|
||||
if ((!rtiles[0].buffer || rtiles[0].buffer == rtile.buffer) &&
|
||||
(!rtiles[1].buffer || rtiles[1].buffer == rtile.buffer) &&
|
||||
(!rtiles[2].buffer || rtiles[2].buffer == rtile.buffer) &&
|
||||
(!rtiles[3].buffer || rtiles[3].buffer == rtile.buffer) &&
|
||||
(!rtiles[5].buffer || rtiles[5].buffer == rtile.buffer) &&
|
||||
(!rtiles[6].buffer || rtiles[6].buffer == rtile.buffer) &&
|
||||
(!rtiles[7].buffer || rtiles[7].buffer == rtile.buffer) &&
|
||||
(!rtiles[8].buffer || rtiles[8].buffer == rtile.buffer)) {
|
||||
bool contiguous_memory = true;
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
if (neighbors.tiles[i].buffer && neighbors.tiles[i].buffer != rtile.buffer) {
|
||||
contiguous_memory = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (contiguous_memory) {
|
||||
// Tiles are in continous memory, so can just subtract overlap offset
|
||||
input_ptr -= (overlap_offset.x + overlap_offset.y * rtile.stride) * pixel_stride;
|
||||
// Stride covers the whole width of the image and not just a single tile
|
||||
@@ -782,19 +855,19 @@ class OptiXDevice : public CUDADevice {
|
||||
input_stride *= rect_size.x;
|
||||
|
||||
TileInfo *tile_info = tile_info_mem.alloc(1);
|
||||
for (int i = 0; i < 9; i++) {
|
||||
tile_info->offsets[i] = rtiles[i].offset;
|
||||
tile_info->strides[i] = rtiles[i].stride;
|
||||
tile_info->buffers[i] = rtiles[i].buffer;
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
tile_info->offsets[i] = neighbors.tiles[i].offset;
|
||||
tile_info->strides[i] = neighbors.tiles[i].stride;
|
||||
tile_info->buffers[i] = neighbors.tiles[i].buffer;
|
||||
}
|
||||
tile_info->x[0] = rtiles[3].x;
|
||||
tile_info->x[1] = rtiles[4].x;
|
||||
tile_info->x[2] = rtiles[5].x;
|
||||
tile_info->x[3] = rtiles[5].x + rtiles[5].w;
|
||||
tile_info->y[0] = rtiles[1].y;
|
||||
tile_info->y[1] = rtiles[4].y;
|
||||
tile_info->y[2] = rtiles[7].y;
|
||||
tile_info->y[3] = rtiles[7].y + rtiles[7].h;
|
||||
tile_info->x[0] = neighbors.tiles[3].x;
|
||||
tile_info->x[1] = neighbors.tiles[4].x;
|
||||
tile_info->x[2] = neighbors.tiles[5].x;
|
||||
tile_info->x[3] = neighbors.tiles[5].x + neighbors.tiles[5].w;
|
||||
tile_info->y[0] = neighbors.tiles[1].y;
|
||||
tile_info->y[1] = neighbors.tiles[4].y;
|
||||
tile_info->y[2] = neighbors.tiles[7].y;
|
||||
tile_info->y[3] = neighbors.tiles[7].y + neighbors.tiles[7].h;
|
||||
tile_info_mem.copy_to_device();
|
||||
|
||||
void *args[] = {
|
||||
@@ -804,7 +877,7 @@ class OptiXDevice : public CUDADevice {
|
||||
|
||||
# if OPTIX_DENOISER_NO_PIXEL_STRIDE
|
||||
device_only_memory<float> input_rgb(this, "denoiser input rgb");
|
||||
input_rgb.alloc_to_device(rect_size.x * rect_size.y * 3 * task.denoising.optix_input_passes);
|
||||
input_rgb.alloc_to_device(rect_size.x * rect_size.y * 3 * task.denoising.input_passes);
|
||||
|
||||
void *input_args[] = {&input_rgb.device_pointer,
|
||||
&input_ptr,
|
||||
@@ -813,7 +886,7 @@ class OptiXDevice : public CUDADevice {
|
||||
&input_stride,
|
||||
&task.pass_stride,
|
||||
const_cast<int *>(pass_offset),
|
||||
&task.denoising.optix_input_passes,
|
||||
&task.denoising.input_passes,
|
||||
&rtile.sample};
|
||||
launch_filter_kernel(
|
||||
"kernel_cuda_filter_convert_to_rgb", rect_size.x, rect_size.y, input_args);
|
||||
@@ -824,7 +897,7 @@ class OptiXDevice : public CUDADevice {
|
||||
# endif
|
||||
|
||||
const bool recreate_denoiser = (denoiser == NULL) ||
|
||||
(task.denoising.optix_input_passes != denoiser_input_passes);
|
||||
(task.denoising.input_passes != denoiser_input_passes);
|
||||
if (recreate_denoiser) {
|
||||
// Destroy existing handle before creating new one
|
||||
if (denoiser != NULL) {
|
||||
@@ -833,23 +906,29 @@ class OptiXDevice : public CUDADevice {
|
||||
|
||||
// Create OptiX denoiser handle on demand when it is first used
|
||||
OptixDenoiserOptions denoiser_options;
|
||||
assert(task.denoising.optix_input_passes >= 1 && task.denoising.optix_input_passes <= 3);
|
||||
assert(task.denoising.input_passes >= 1 && task.denoising.input_passes <= 3);
|
||||
denoiser_options.inputKind = static_cast<OptixDenoiserInputKind>(
|
||||
OPTIX_DENOISER_INPUT_RGB + (task.denoising.optix_input_passes - 1));
|
||||
OPTIX_DENOISER_INPUT_RGB + (task.denoising.input_passes - 1));
|
||||
# if OPTIX_ABI_VERSION < 28
|
||||
denoiser_options.pixelFormat = OPTIX_PIXEL_FORMAT_FLOAT3;
|
||||
# endif
|
||||
check_result_optix_ret(optixDenoiserCreate(context, &denoiser_options, &denoiser));
|
||||
check_result_optix_ret(
|
||||
optixDenoiserSetModel(denoiser, OPTIX_DENOISER_MODEL_KIND_HDR, NULL, 0));
|
||||
|
||||
// OptiX denoiser handle was created with the requested number of input passes
|
||||
denoiser_input_passes = task.denoising.optix_input_passes;
|
||||
denoiser_input_passes = task.denoising.input_passes;
|
||||
}
|
||||
|
||||
OptixDenoiserSizes sizes = {};
|
||||
check_result_optix_ret(
|
||||
optixDenoiserComputeMemoryResources(denoiser, rect_size.x, rect_size.y, &sizes));
|
||||
|
||||
# if OPTIX_ABI_VERSION < 28
|
||||
const size_t scratch_size = sizes.recommendedScratchSizeInBytes;
|
||||
# else
|
||||
const size_t scratch_size = sizes.withOverlapScratchSizeInBytes;
|
||||
# endif
|
||||
const size_t scratch_offset = sizes.stateSizeInBytes;
|
||||
|
||||
// Allocate denoiser state if tile size has changed since last setup
|
||||
@@ -897,10 +976,10 @@ class OptiXDevice : public CUDADevice {
|
||||
int2 output_offset = overlap_offset;
|
||||
overlap_offset = make_int2(0, 0); // Not supported by denoiser API, so apply manually
|
||||
# else
|
||||
output_layers[0].data = rtiles[9].buffer + pixel_offset;
|
||||
output_layers[0].width = rtiles[9].w;
|
||||
output_layers[0].height = rtiles[9].h;
|
||||
output_layers[0].rowStrideInBytes = rtiles[9].stride * pixel_stride;
|
||||
output_layers[0].data = target_tile.buffer + pixel_offset;
|
||||
output_layers[0].width = target_tile.w;
|
||||
output_layers[0].height = target_tile.h;
|
||||
output_layers[0].rowStrideInBytes = target_tile.stride * pixel_stride;
|
||||
output_layers[0].pixelStrideInBytes = pixel_stride;
|
||||
# endif
|
||||
output_layers[0].format = OPTIX_PIXEL_FORMAT_FLOAT3;
|
||||
@@ -913,7 +992,7 @@ class OptiXDevice : public CUDADevice {
|
||||
denoiser_state.device_pointer,
|
||||
scratch_offset,
|
||||
input_layers,
|
||||
task.denoising.optix_input_passes,
|
||||
task.denoising.input_passes,
|
||||
overlap_offset.x,
|
||||
overlap_offset.y,
|
||||
output_layers,
|
||||
@@ -922,26 +1001,26 @@ class OptiXDevice : public CUDADevice {
|
||||
|
||||
# if OPTIX_DENOISER_NO_PIXEL_STRIDE
|
||||
void *output_args[] = {&input_ptr,
|
||||
&rtiles[9].buffer,
|
||||
&target_tile.buffer,
|
||||
&output_offset.x,
|
||||
&output_offset.y,
|
||||
&rect_size.x,
|
||||
&rect_size.y,
|
||||
&rtiles[9].x,
|
||||
&rtiles[9].y,
|
||||
&rtiles[9].w,
|
||||
&rtiles[9].h,
|
||||
&rtiles[9].offset,
|
||||
&rtiles[9].stride,
|
||||
&target_tile.x,
|
||||
&target_tile.y,
|
||||
&target_tile.w,
|
||||
&target_tile.h,
|
||||
&target_tile.offset,
|
||||
&target_tile.stride,
|
||||
&task.pass_stride,
|
||||
&rtile.sample};
|
||||
launch_filter_kernel(
|
||||
"kernel_cuda_filter_convert_from_rgb", rtiles[9].w, rtiles[9].h, output_args);
|
||||
"kernel_cuda_filter_convert_from_rgb", target_tile.w, target_tile.h, output_args);
|
||||
# endif
|
||||
|
||||
check_result_cuda_ret(cuStreamSynchronize(0));
|
||||
|
||||
task.unmap_neighbor_tiles(rtiles, this);
|
||||
task.unmap_neighbor_tiles(neighbors, this);
|
||||
}
|
||||
else {
|
||||
// Run CUDA denoising kernels
|
||||
@@ -993,7 +1072,11 @@ class OptiXDevice : public CUDADevice {
|
||||
sbt_params.missRecordCount = 1;
|
||||
sbt_params.hitgroupRecordBase = sbt_data.device_pointer + PG_HITD * sizeof(SbtRecord);
|
||||
sbt_params.hitgroupRecordStrideInBytes = sizeof(SbtRecord);
|
||||
sbt_params.hitgroupRecordCount = 3; // PG_HITD, PG_HITL, PG_HITS
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
sbt_params.hitgroupRecordCount = 5; // PG_HITD(_MOTION), PG_HITS(_MOTION), PG_HITL
|
||||
# else
|
||||
sbt_params.hitgroupRecordCount = 3; // PG_HITD, PG_HITS, PG_HITL
|
||||
# endif
|
||||
|
||||
check_result_optix(optixLaunch(pipelines[PIP_SHADER_EVAL],
|
||||
cuda_stream[thread_index],
|
||||
@@ -1070,7 +1153,7 @@ class OptiXDevice : public CUDADevice {
|
||||
&build_input,
|
||||
1,
|
||||
temp_mem.device_pointer,
|
||||
temp_mem.device_size,
|
||||
sizes.tempSizeInBytes,
|
||||
out_data,
|
||||
sizes.outputSizeInBytes,
|
||||
&out_handle,
|
||||
@@ -1142,7 +1225,6 @@ class OptiXDevice : public CUDADevice {
|
||||
continue;
|
||||
}
|
||||
|
||||
const size_t num_curves = hair->num_curves();
|
||||
const size_t num_segments = hair->num_segments();
|
||||
|
||||
size_t num_motion_steps = 1;
|
||||
@@ -1152,7 +1234,18 @@ class OptiXDevice : public CUDADevice {
|
||||
}
|
||||
|
||||
device_vector<OptixAabb> aabb_data(this, "temp_aabb_data", MEM_READ_ONLY);
|
||||
aabb_data.alloc(num_segments * num_motion_steps);
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
device_vector<int> index_data(this, "temp_index_data", MEM_READ_ONLY);
|
||||
device_vector<float4> vertex_data(this, "temp_vertex_data", MEM_READ_ONLY);
|
||||
// Four control points for each curve segment
|
||||
const size_t num_vertices = num_segments * 4;
|
||||
if (DebugFlags().optix.curves_api && hair->curve_shape == CURVE_THICK) {
|
||||
index_data.alloc(num_segments);
|
||||
vertex_data.alloc(num_vertices * num_motion_steps);
|
||||
}
|
||||
else
|
||||
# endif
|
||||
aabb_data.alloc(num_segments * num_motion_steps);
|
||||
|
||||
// Get AABBs for each motion step
|
||||
for (size_t step = 0; step < num_motion_steps; ++step) {
|
||||
@@ -1165,44 +1258,127 @@ class OptiXDevice : public CUDADevice {
|
||||
keys = motion_keys->data_float3() + attr_offset * hair->curve_keys.size();
|
||||
}
|
||||
|
||||
size_t i = step * num_segments;
|
||||
for (size_t j = 0; j < num_curves; ++j) {
|
||||
const Hair::Curve c = hair->get_curve(j);
|
||||
for (size_t j = 0, i = 0; j < hair->num_curves(); ++j) {
|
||||
const Hair::Curve curve = hair->get_curve(j);
|
||||
|
||||
for (size_t k = 0; k < c.num_segments(); ++i, ++k) {
|
||||
BoundBox bounds = BoundBox::empty;
|
||||
c.bounds_grow(k, keys, hair->curve_radius.data(), bounds);
|
||||
for (int segment = 0; segment < curve.num_segments(); ++segment, ++i) {
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
if (DebugFlags().optix.curves_api && hair->curve_shape == CURVE_THICK) {
|
||||
int k0 = curve.first_key + segment;
|
||||
int k1 = k0 + 1;
|
||||
int ka = max(k0 - 1, curve.first_key);
|
||||
int kb = min(k1 + 1, curve.first_key + curve.num_keys - 1);
|
||||
|
||||
aabb_data[i].minX = bounds.min.x;
|
||||
aabb_data[i].minY = bounds.min.y;
|
||||
aabb_data[i].minZ = bounds.min.z;
|
||||
aabb_data[i].maxX = bounds.max.x;
|
||||
aabb_data[i].maxY = bounds.max.y;
|
||||
aabb_data[i].maxZ = bounds.max.z;
|
||||
const float4 px = make_float4(keys[ka].x, keys[k0].x, keys[k1].x, keys[kb].x);
|
||||
const float4 py = make_float4(keys[ka].y, keys[k0].y, keys[k1].y, keys[kb].y);
|
||||
const float4 pz = make_float4(keys[ka].z, keys[k0].z, keys[k1].z, keys[kb].z);
|
||||
const float4 pw = make_float4(hair->curve_radius[ka],
|
||||
hair->curve_radius[k0],
|
||||
hair->curve_radius[k1],
|
||||
hair->curve_radius[kb]);
|
||||
|
||||
// Convert Catmull-Rom data to Bezier spline
|
||||
static const float4 cr2bsp0 = make_float4(+7, -4, +5, -2) / 6.f;
|
||||
static const float4 cr2bsp1 = make_float4(-2, 11, -4, +1) / 6.f;
|
||||
static const float4 cr2bsp2 = make_float4(+1, -4, 11, -2) / 6.f;
|
||||
static const float4 cr2bsp3 = make_float4(-2, +5, -4, +7) / 6.f;
|
||||
|
||||
index_data[i] = i * 4;
|
||||
float4 *const v = vertex_data.data() + step * num_vertices + index_data[i];
|
||||
v[0] = make_float4(
|
||||
dot(cr2bsp0, px), dot(cr2bsp0, py), dot(cr2bsp0, pz), dot(cr2bsp0, pw));
|
||||
v[1] = make_float4(
|
||||
dot(cr2bsp1, px), dot(cr2bsp1, py), dot(cr2bsp1, pz), dot(cr2bsp1, pw));
|
||||
v[2] = make_float4(
|
||||
dot(cr2bsp2, px), dot(cr2bsp2, py), dot(cr2bsp2, pz), dot(cr2bsp2, pw));
|
||||
v[3] = make_float4(
|
||||
dot(cr2bsp3, px), dot(cr2bsp3, py), dot(cr2bsp3, pz), dot(cr2bsp3, pw));
|
||||
}
|
||||
else
|
||||
# endif
|
||||
{
|
||||
BoundBox bounds = BoundBox::empty;
|
||||
curve.bounds_grow(segment, keys, hair->curve_radius.data(), bounds);
|
||||
|
||||
const size_t index = step * num_segments + i;
|
||||
aabb_data[index].minX = bounds.min.x;
|
||||
aabb_data[index].minY = bounds.min.y;
|
||||
aabb_data[index].minZ = bounds.min.z;
|
||||
aabb_data[index].maxX = bounds.max.x;
|
||||
aabb_data[index].maxY = bounds.max.y;
|
||||
aabb_data[index].maxZ = bounds.max.z;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Upload AABB data to GPU
|
||||
aabb_data.copy_to_device();
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
index_data.copy_to_device();
|
||||
vertex_data.copy_to_device();
|
||||
# endif
|
||||
|
||||
vector<device_ptr> aabb_ptrs;
|
||||
aabb_ptrs.reserve(num_motion_steps);
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
vector<device_ptr> width_ptrs;
|
||||
vector<device_ptr> vertex_ptrs;
|
||||
width_ptrs.reserve(num_motion_steps);
|
||||
vertex_ptrs.reserve(num_motion_steps);
|
||||
# endif
|
||||
for (size_t step = 0; step < num_motion_steps; ++step) {
|
||||
aabb_ptrs.push_back(aabb_data.device_pointer + step * num_segments * sizeof(OptixAabb));
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
const device_ptr base_ptr = vertex_data.device_pointer +
|
||||
step * num_vertices * sizeof(float4);
|
||||
width_ptrs.push_back(base_ptr + 3 * sizeof(float)); // Offset by vertex size
|
||||
vertex_ptrs.push_back(base_ptr);
|
||||
# endif
|
||||
}
|
||||
|
||||
// Disable visibility test anyhit program, since it is already checked during intersection
|
||||
// Those trace calls that require anyhit can force it with OPTIX_RAY_FLAG_ENFORCE_ANYHIT
|
||||
unsigned int build_flags = OPTIX_GEOMETRY_FLAG_DISABLE_ANYHIT;
|
||||
// Force a single any-hit call, so shadow record-all behavior works correctly
|
||||
unsigned int build_flags = OPTIX_GEOMETRY_FLAG_REQUIRE_SINGLE_ANYHIT_CALL;
|
||||
OptixBuildInput build_input = {};
|
||||
build_input.type = OPTIX_BUILD_INPUT_TYPE_CUSTOM_PRIMITIVES;
|
||||
build_input.aabbArray.aabbBuffers = (CUdeviceptr *)aabb_ptrs.data();
|
||||
build_input.aabbArray.numPrimitives = num_segments;
|
||||
build_input.aabbArray.strideInBytes = sizeof(OptixAabb);
|
||||
build_input.aabbArray.flags = &build_flags;
|
||||
build_input.aabbArray.numSbtRecords = 1;
|
||||
build_input.aabbArray.primitiveIndexOffset = hair->optix_prim_offset;
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
if (DebugFlags().optix.curves_api && hair->curve_shape == CURVE_THICK) {
|
||||
build_input.type = OPTIX_BUILD_INPUT_TYPE_CURVES;
|
||||
build_input.curveArray.curveType = OPTIX_PRIMITIVE_TYPE_ROUND_CUBIC_BSPLINE;
|
||||
build_input.curveArray.numPrimitives = num_segments;
|
||||
build_input.curveArray.vertexBuffers = (CUdeviceptr *)vertex_ptrs.data();
|
||||
build_input.curveArray.numVertices = num_vertices;
|
||||
build_input.curveArray.vertexStrideInBytes = sizeof(float4);
|
||||
build_input.curveArray.widthBuffers = (CUdeviceptr *)width_ptrs.data();
|
||||
build_input.curveArray.widthStrideInBytes = sizeof(float4);
|
||||
build_input.curveArray.indexBuffer = (CUdeviceptr)index_data.device_pointer;
|
||||
build_input.curveArray.indexStrideInBytes = sizeof(int);
|
||||
build_input.curveArray.flag = build_flags;
|
||||
build_input.curveArray.primitiveIndexOffset = hair->optix_prim_offset;
|
||||
}
|
||||
else
|
||||
# endif
|
||||
{
|
||||
// Disable visibility test any-hit program, since it is already checked during
|
||||
// intersection. Those trace calls that require anyhit can force it with a ray flag.
|
||||
build_flags |= OPTIX_GEOMETRY_FLAG_DISABLE_ANYHIT;
|
||||
|
||||
build_input.type = OPTIX_BUILD_INPUT_TYPE_CUSTOM_PRIMITIVES;
|
||||
# if OPTIX_ABI_VERSION < 23
|
||||
build_input.aabbArray.aabbBuffers = (CUdeviceptr *)aabb_ptrs.data();
|
||||
build_input.aabbArray.numPrimitives = num_segments;
|
||||
build_input.aabbArray.strideInBytes = sizeof(OptixAabb);
|
||||
build_input.aabbArray.flags = &build_flags;
|
||||
build_input.aabbArray.numSbtRecords = 1;
|
||||
build_input.aabbArray.primitiveIndexOffset = hair->optix_prim_offset;
|
||||
# else
|
||||
build_input.customPrimitiveArray.aabbBuffers = (CUdeviceptr *)aabb_ptrs.data();
|
||||
build_input.customPrimitiveArray.numPrimitives = num_segments;
|
||||
build_input.customPrimitiveArray.strideInBytes = sizeof(OptixAabb);
|
||||
build_input.customPrimitiveArray.flags = &build_flags;
|
||||
build_input.customPrimitiveArray.numSbtRecords = 1;
|
||||
build_input.customPrimitiveArray.primitiveIndexOffset = hair->optix_prim_offset;
|
||||
# endif
|
||||
}
|
||||
|
||||
// Allocate memory for new BLAS and build it
|
||||
OptixTraversableHandle handle;
|
||||
@@ -1257,8 +1433,8 @@ class OptiXDevice : public CUDADevice {
|
||||
vertex_ptrs.push_back(vertex_data.device_pointer + num_verts * step * sizeof(float3));
|
||||
}
|
||||
|
||||
// No special build flags for triangle primitives
|
||||
unsigned int build_flags = OPTIX_GEOMETRY_FLAG_NONE;
|
||||
// Force a single any-hit call, so shadow record-all behavior works correctly
|
||||
unsigned int build_flags = OPTIX_GEOMETRY_FLAG_REQUIRE_SINGLE_ANYHIT_CALL;
|
||||
OptixBuildInput build_input = {};
|
||||
build_input.type = OPTIX_BUILD_INPUT_TYPE_TRIANGLES;
|
||||
build_input.triangleArray.vertexBuffers = (CUdeviceptr *)vertex_ptrs.data();
|
||||
@@ -1324,9 +1500,26 @@ class OptiXDevice : public CUDADevice {
|
||||
// Set user instance ID to object index
|
||||
instance.instanceId = ob->get_device_index();
|
||||
|
||||
// Volumes have a special bit set in the visibility mask so a trace can mask only volumes
|
||||
// See 'scene_intersect_volume' in bvh.h
|
||||
instance.visibilityMask = (ob->geometry->has_volume ? 3 : 1);
|
||||
// Have to have at least one bit in the mask, or else instance would always be culled
|
||||
instance.visibilityMask = 1;
|
||||
|
||||
if (ob->geometry->has_volume) {
|
||||
// Volumes have a special bit set in the visibility mask so a trace can mask only volumes
|
||||
instance.visibilityMask |= 2;
|
||||
}
|
||||
|
||||
if (ob->geometry->type == Geometry::HAIR) {
|
||||
// Same applies to curves (so they can be skipped in local trace calls)
|
||||
instance.visibilityMask |= 4;
|
||||
|
||||
# if OPTIX_ABI_VERSION >= 36
|
||||
if (motion_blur && ob->geometry->has_motion_blur() && DebugFlags().optix.curves_api &&
|
||||
static_cast<const Hair *>(ob->geometry)->curve_shape == CURVE_THICK) {
|
||||
// Select between motion blur and non-motion blur built-in intersection module
|
||||
instance.sbtOffset = PG_HITD_MOTION - PG_HITD;
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
// Insert motion traversable if object has motion
|
||||
if (motion_blur && ob->use_motion()) {
|
||||
|
@@ -29,6 +29,7 @@ CCL_NAMESPACE_BEGIN
|
||||
class Device;
|
||||
class RenderBuffers;
|
||||
class RenderTile;
|
||||
class RenderTileNeighbors;
|
||||
class Tile;
|
||||
|
||||
enum DenoiserType {
|
||||
@@ -41,6 +42,14 @@ enum DenoiserType {
|
||||
DENOISER_ALL = ~0,
|
||||
};
|
||||
|
||||
enum DenoiserInput {
|
||||
DENOISER_INPUT_RGB = 1,
|
||||
DENOISER_INPUT_RGB_ALBEDO = 2,
|
||||
DENOISER_INPUT_RGB_ALBEDO_NORMAL = 3,
|
||||
|
||||
DENOISER_INPUT_NUM,
|
||||
};
|
||||
|
||||
typedef int DenoiserTypeMask;
|
||||
|
||||
class DenoiseParams {
|
||||
@@ -72,10 +81,10 @@ class DenoiseParams {
|
||||
/* Clamp the input to the range of +-1e8. Should be enough for any legitimate data. */
|
||||
bool clamp_input;
|
||||
|
||||
/** Optix Denoiser **/
|
||||
/** OIDN/Optix Denoiser **/
|
||||
|
||||
/* Passes handed over to the OptiX denoiser (default to color + albedo). */
|
||||
int optix_input_passes;
|
||||
/* Passes handed over to the OIDN/OptiX denoiser (default to color + albedo). */
|
||||
DenoiserInput input_passes;
|
||||
|
||||
DenoiseParams()
|
||||
{
|
||||
@@ -91,7 +100,7 @@ class DenoiseParams {
|
||||
neighbor_frames = 2;
|
||||
clamp_input = true;
|
||||
|
||||
optix_input_passes = 2;
|
||||
input_passes = DENOISER_INPUT_RGB_ALBEDO_NORMAL;
|
||||
|
||||
start_sample = 0;
|
||||
}
|
||||
@@ -150,8 +159,8 @@ class DeviceTask {
|
||||
function<void(RenderTile &)> update_tile_sample;
|
||||
function<void(RenderTile &)> release_tile;
|
||||
function<bool()> get_cancel;
|
||||
function<void(RenderTile *, Device *)> map_neighbor_tiles;
|
||||
function<void(RenderTile *, Device *)> unmap_neighbor_tiles;
|
||||
function<void(RenderTileNeighbors &, Device *)> map_neighbor_tiles;
|
||||
function<void(RenderTileNeighbors &, Device *)> unmap_neighbor_tiles;
|
||||
|
||||
uint tile_types;
|
||||
DenoiseParams denoising;
|
||||
|
@@ -1850,7 +1850,7 @@ void OpenCLDevice::denoise(RenderTile &rtile, DenoisingTask &denoising)
|
||||
denoising.render_buffer.samples = rtile.sample;
|
||||
denoising.buffer.gpu_temporary_mem = true;
|
||||
|
||||
denoising.run_denoising(&rtile);
|
||||
denoising.run_denoising(rtile);
|
||||
}
|
||||
|
||||
void OpenCLDevice::shader(DeviceTask &task)
|
||||
|
@@ -172,11 +172,11 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
|
||||
0.0f,
|
||||
ray->t,
|
||||
ray->time,
|
||||
0xFF,
|
||||
0xF,
|
||||
OPTIX_RAY_FLAG_NONE,
|
||||
0,
|
||||
0,
|
||||
0, // SBT offset for PG_HITD
|
||||
0,
|
||||
0,
|
||||
p0,
|
||||
p1,
|
||||
p2,
|
||||
@@ -264,12 +264,13 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
|
||||
0.0f,
|
||||
ray->t,
|
||||
ray->time,
|
||||
// Skip curves
|
||||
0x3,
|
||||
// Need to always call into __anyhit__kernel_optix_local_hit
|
||||
0xFF,
|
||||
OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
|
||||
1,
|
||||
2, // SBT offset for PG_HITL
|
||||
0,
|
||||
0,
|
||||
0, // SBT offset for PG_HITL
|
||||
p0,
|
||||
p1,
|
||||
p2,
|
||||
@@ -374,12 +375,12 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
|
||||
0.0f,
|
||||
ray->t,
|
||||
ray->time,
|
||||
0xF,
|
||||
// Need to always call into __anyhit__kernel_optix_shadow_all_hit
|
||||
0xFF,
|
||||
OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
|
||||
2,
|
||||
1, // SBT offset for PG_HITS
|
||||
0,
|
||||
0,
|
||||
0, // SBT offset for PG_HITS
|
||||
p0,
|
||||
p1,
|
||||
*num_hits,
|
||||
@@ -458,12 +459,12 @@ ccl_device_intersect bool scene_intersect_volume(KernelGlobals *kg,
|
||||
0.0f,
|
||||
ray->t,
|
||||
ray->time,
|
||||
// Visibility mask set to only intersect objects with volumes
|
||||
0x02,
|
||||
// Skip everything but volumes
|
||||
0x2,
|
||||
OPTIX_RAY_FLAG_NONE,
|
||||
0,
|
||||
0,
|
||||
0, // SBT offset for PG_HITD
|
||||
0,
|
||||
0,
|
||||
p0,
|
||||
p1,
|
||||
p2,
|
||||
|
@@ -734,7 +734,6 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
|
||||
}
|
||||
|
||||
sd->u = isect->u;
|
||||
sd->v = isect->v;
|
||||
|
||||
P = P + D * t;
|
||||
|
||||
@@ -750,6 +749,7 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
|
||||
|
||||
sd->N = normalize(sine * bitangent - cosine * normalize(cross(tangent, bitangent)));
|
||||
sd->Ng = -D;
|
||||
sd->v = isect->v;
|
||||
|
||||
# if 0
|
||||
/* This approximates the position and geometric normal of a thick curve too,
|
||||
@@ -764,8 +764,11 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
|
||||
* This could be optimized by recording the normal in the intersection,
|
||||
* however for Optix this would go beyond the size of the payload. */
|
||||
const float3 P_inside = float4_to_float3(catmull_rom_basis_eval(P_curve, isect->u));
|
||||
sd->Ng = normalize(P - P_inside);
|
||||
sd->N = sd->Ng;
|
||||
const float3 Ng = normalize(P - P_inside);
|
||||
|
||||
sd->N = Ng;
|
||||
sd->Ng = Ng;
|
||||
sd->v = 0.0f;
|
||||
}
|
||||
|
||||
# ifdef __DPDU__
|
||||
|
@@ -379,7 +379,7 @@ ccl_device_inline void camera_sample(KernelGlobals *kg,
|
||||
const int shutter_table_offset = kernel_data.cam.shutter_table_offset;
|
||||
ray->time = lookup_table_read(kg, time, shutter_table_offset, SHUTTER_TABLE_SIZE);
|
||||
/* TODO(sergey): Currently single rolling shutter effect type only
|
||||
* where scan-lines are acquired from top to bottom and whole scanline
|
||||
* where scan-lines are acquired from top to bottom and whole scan-line
|
||||
* is acquired at once (no delay in acquisition happens between pixels
|
||||
* of single scan-line).
|
||||
*
|
||||
|
@@ -284,19 +284,11 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg,
|
||||
#ifdef __HOLDOUT__
|
||||
if (((sd->flag & SD_HOLDOUT) || (sd->object_flag & SD_OBJECT_HOLDOUT_MASK)) &&
|
||||
(state->flag & PATH_RAY_TRANSPARENT_BACKGROUND)) {
|
||||
const float3 holdout_weight = shader_holdout_apply(kg, sd);
|
||||
if (kernel_data.background.transparent) {
|
||||
float3 holdout_weight;
|
||||
if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) {
|
||||
holdout_weight = make_float3(1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
else {
|
||||
holdout_weight = shader_holdout_eval(kg, sd);
|
||||
}
|
||||
/* any throughput is ok, should all be identical here */
|
||||
L->transparent += average(holdout_weight * throughput);
|
||||
}
|
||||
|
||||
if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) {
|
||||
if (isequal_float3(holdout_weight, make_float3(1.0f, 1.0f, 1.0f))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@@ -1017,15 +1017,36 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd)
|
||||
|
||||
/* Holdout */
|
||||
|
||||
ccl_device float3 shader_holdout_eval(KernelGlobals *kg, ShaderData *sd)
|
||||
ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd)
|
||||
{
|
||||
float3 weight = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
ShaderClosure *sc = &sd->closure[i];
|
||||
/* For objects marked as holdout, preserve transparency and remove all other
|
||||
* closures, replacing them with a holdout weight. */
|
||||
if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) {
|
||||
if ((sd->flag & SD_TRANSPARENT) && !(sd->flag & SD_HAS_ONLY_VOLUME)) {
|
||||
weight = make_float3(1.0f, 1.0f, 1.0f) - sd->closure_transparent_extinction;
|
||||
|
||||
if (CLOSURE_IS_HOLDOUT(sc->type))
|
||||
weight += sc->weight;
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
ShaderClosure *sc = &sd->closure[i];
|
||||
if (!CLOSURE_IS_BSDF_TRANSPARENT(sc->type)) {
|
||||
sc->type = NBUILTIN_CLOSURES;
|
||||
}
|
||||
}
|
||||
|
||||
sd->flag &= ~(SD_CLOSURE_FLAGS - (SD_TRANSPARENT | SD_BSDF));
|
||||
}
|
||||
else {
|
||||
weight = make_float3(1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
ShaderClosure *sc = &sd->closure[i];
|
||||
if (CLOSURE_IS_HOLDOUT(sc->type)) {
|
||||
weight += sc->weight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return weight;
|
||||
|
@@ -77,7 +77,7 @@ ccl_device_inline float4 svm_image_texture_read(KernelGlobals *kg,
|
||||
return make_float4(f, f, f, 1.0f);
|
||||
}
|
||||
/* Byte */
|
||||
#ifdef cl_khr_fp16
|
||||
#ifdef __KERNEL_CL_KHR_FP16__
|
||||
/* half and half4 are optional in OpenCL */
|
||||
else if (texture_type == IMAGE_DATA_TYPE_HALF) {
|
||||
float f = tex_fetch(half, info, offset);
|
||||
|
@@ -15,6 +15,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// clang-format off
|
||||
#include "kernel/kernel_compat_optix.h"
|
||||
#include "util/util_atomic.h"
|
||||
#include "kernel/kernel_types.h"
|
||||
@@ -23,6 +24,7 @@
|
||||
|
||||
#include "kernel/kernel_path.h"
|
||||
#include "kernel/kernel_bake.h"
|
||||
// clang-format on
|
||||
|
||||
template<typename T> ccl_device_forceinline T *get_payload_ptr_0()
|
||||
{
|
||||
@@ -139,8 +141,8 @@ extern "C" __global__ void __anyhit__kernel_optix_local_hit()
|
||||
}
|
||||
else {
|
||||
if (local_isect->num_hits && optixGetRayTmax() > local_isect->hits[0].t) {
|
||||
// Record closest intersection only (do not terminate ray here, since there is no guarantee
|
||||
// about distance ordering in anyhit)
|
||||
// Record closest intersection only
|
||||
// Do not terminate ray here, since there is no guarantee about distance ordering in any-hit
|
||||
return optixIgnoreIntersection();
|
||||
}
|
||||
|
||||
@@ -153,15 +155,9 @@ extern "C" __global__ void __anyhit__kernel_optix_local_hit()
|
||||
isect->object = get_object_id();
|
||||
isect->type = kernel_tex_fetch(__prim_type, isect->prim);
|
||||
|
||||
if (optixIsTriangleHit()) {
|
||||
const float2 barycentrics = optixGetTriangleBarycentrics();
|
||||
isect->u = 1.0f - barycentrics.y - barycentrics.x;
|
||||
isect->v = barycentrics.x;
|
||||
}
|
||||
else {
|
||||
isect->u = __uint_as_float(optixGetAttribute_0());
|
||||
isect->v = __uint_as_float(optixGetAttribute_1());
|
||||
}
|
||||
const float2 barycentrics = optixGetTriangleBarycentrics();
|
||||
isect->u = 1.0f - barycentrics.y - barycentrics.x;
|
||||
isect->v = barycentrics.x;
|
||||
|
||||
// Record geometric normal
|
||||
const uint tri_vindex = kernel_tex_fetch(__prim_tri_index, isect->prim);
|
||||
@@ -198,10 +194,18 @@ extern "C" __global__ void __anyhit__kernel_optix_shadow_all_hit()
|
||||
isect->u = 1.0f - barycentrics.y - barycentrics.x;
|
||||
isect->v = barycentrics.x;
|
||||
}
|
||||
# ifdef __HAIR__
|
||||
else {
|
||||
isect->u = __uint_as_float(optixGetAttribute_0());
|
||||
const float u = __uint_as_float(optixGetAttribute_0());
|
||||
isect->u = u;
|
||||
isect->v = __uint_as_float(optixGetAttribute_1());
|
||||
|
||||
// Filter out curve endcaps
|
||||
if (u == 0.0f || u == 1.0f) {
|
||||
return optixIgnoreIntersection();
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef __TRANSPARENT_SHADOWS__
|
||||
// Detect if this surface has a shader with transparent shadows
|
||||
@@ -213,7 +217,6 @@ extern "C" __global__ void __anyhit__kernel_optix_shadow_all_hit()
|
||||
# ifdef __TRANSPARENT_SHADOWS__
|
||||
}
|
||||
|
||||
// TODO(pmours): Do we need REQUIRE_UNIQUE_ANYHIT for this to work?
|
||||
optixSetPayload_2(optixGetPayload_2() + 1); // num_hits++
|
||||
|
||||
// Continue tracing
|
||||
@@ -227,13 +230,25 @@ extern "C" __global__ void __anyhit__kernel_optix_visibility_test()
|
||||
uint visibility = optixGetPayload_4();
|
||||
#ifdef __VISIBILITY_FLAG__
|
||||
const uint prim = optixGetPrimitiveIndex();
|
||||
if ((kernel_tex_fetch(__prim_visibility, prim) & visibility) == 0)
|
||||
if ((kernel_tex_fetch(__prim_visibility, prim) & visibility) == 0) {
|
||||
return optixIgnoreIntersection();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __HAIR__
|
||||
if (!optixIsTriangleHit()) {
|
||||
// Filter out curve endcaps
|
||||
const float u = __uint_as_float(optixGetAttribute_0());
|
||||
if (u == 0.0f || u == 1.0f) {
|
||||
return optixIgnoreIntersection();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Shadow ray early termination
|
||||
if (visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if (visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
return optixTerminateRay();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" __global__ void __closesthit__kernel_optix_hit()
|
||||
@@ -250,7 +265,7 @@ extern "C" __global__ void __closesthit__kernel_optix_hit()
|
||||
optixSetPayload_2(__float_as_uint(barycentrics.x));
|
||||
}
|
||||
else {
|
||||
optixSetPayload_1(optixGetAttribute_0());
|
||||
optixSetPayload_1(optixGetAttribute_0()); // Same as 'optixGetCurveParameter()'
|
||||
optixSetPayload_2(optixGetAttribute_1());
|
||||
}
|
||||
}
|
||||
@@ -286,7 +301,6 @@ ccl_device_inline void optix_intersection_curve(const uint prim, const uint type
|
||||
__float_as_int(isect.u), // Attribute_0
|
||||
__float_as_int(isect.v)); // Attribute_1
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extern "C" __global__ void __intersection__curve_ribbon()
|
||||
|
@@ -122,12 +122,18 @@ vector geographical_to_direction(float lat, float lon)
|
||||
return vector(cos(lat) * cos(lon), cos(lat) * sin(lon), sin(lat));
|
||||
}
|
||||
|
||||
color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
||||
float precise_angle(vector a, vector b)
|
||||
{
|
||||
return 2.0 * atan2(length(a - b), length(a + b));
|
||||
}
|
||||
|
||||
color sky_radiance_nishita(vector dir, float nishita_data[10], string filename)
|
||||
{
|
||||
/* definitions */
|
||||
float sun_elevation = nishita_data[6];
|
||||
float sun_rotation = nishita_data[7];
|
||||
float angular_diameter = nishita_data[8];
|
||||
float sun_intensity = nishita_data[9];
|
||||
int sun_disc = angular_diameter > 0;
|
||||
float alpha = 1.0;
|
||||
color xyz;
|
||||
@@ -138,13 +144,13 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
||||
if (dir[2] >= 0.0) {
|
||||
/* definitions */
|
||||
vector sun_dir = geographical_to_direction(sun_elevation, sun_rotation + M_PI_2);
|
||||
float sun_dir_angle = acos(dot(dir, sun_dir));
|
||||
float sun_dir_angle = precise_angle(dir, sun_dir);
|
||||
float half_angular = angular_diameter / 2.0;
|
||||
float dir_elevation = M_PI_2 - direction[0];
|
||||
|
||||
/* if ray inside sun disc render it, otherwise render sky */
|
||||
if (sun_dir_angle < half_angular && sun_disc == 1) {
|
||||
/* get 3 pixels data */
|
||||
/* get 2 pixels data */
|
||||
color pixel_bottom = color(nishita_data[0], nishita_data[1], nishita_data[2]);
|
||||
color pixel_top = color(nishita_data[3], nishita_data[4], nishita_data[5]);
|
||||
float y;
|
||||
@@ -153,13 +159,13 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
||||
if (sun_elevation - half_angular > 0.0) {
|
||||
if ((sun_elevation + half_angular) > 0.0) {
|
||||
y = ((dir_elevation - sun_elevation) / angular_diameter) + 0.5;
|
||||
xyz = mix(pixel_bottom, pixel_top, y);
|
||||
xyz = mix(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (sun_elevation + half_angular > 0.0) {
|
||||
y = dir_elevation / (sun_elevation + half_angular);
|
||||
xyz = mix(pixel_bottom, pixel_top, y);
|
||||
xyz = mix(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
/* limb darkening, coefficient is 0.6f */
|
||||
@@ -171,7 +177,8 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
||||
else {
|
||||
/* sky interpolation */
|
||||
float x = (direction[1] + M_PI + sun_rotation) / M_2PI;
|
||||
float y = 1.0 - (dir_elevation / M_PI_2);
|
||||
/* more pixels toward horizon compensation */
|
||||
float y = 1.0 - sqrt(dir_elevation / M_PI_2);
|
||||
if (x > 1.0) {
|
||||
x = x - 1.0;
|
||||
}
|
||||
@@ -201,19 +208,20 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
||||
return xyz_to_rgb(xyz[0], xyz[1], xyz[2]) * 120000.0;
|
||||
}
|
||||
|
||||
shader node_sky_texture(int use_mapping = 0,
|
||||
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
vector Vector = P,
|
||||
string type = "hosek_wilkie",
|
||||
float theta = 0.0,
|
||||
float phi = 0.0,
|
||||
string filename = "",
|
||||
color radiance = color(0.0, 0.0, 0.0),
|
||||
float config_x[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_y[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_z[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float nishita_data[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
output color Color = color(0.0, 0.0, 0.0))
|
||||
shader node_sky_texture(
|
||||
int use_mapping = 0,
|
||||
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
vector Vector = P,
|
||||
string type = "hosek_wilkie",
|
||||
float theta = 0.0,
|
||||
float phi = 0.0,
|
||||
string filename = "",
|
||||
color radiance = color(0.0, 0.0, 0.0),
|
||||
float config_x[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_y[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_z[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float nishita_data[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
output color Color = color(0.0, 0.0, 0.0))
|
||||
{
|
||||
vector p = Vector;
|
||||
|
||||
|
@@ -136,6 +136,7 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals *kg,
|
||||
float sun_elevation = nishita_data[6];
|
||||
float sun_rotation = nishita_data[7];
|
||||
float angular_diameter = nishita_data[8];
|
||||
float sun_intensity = nishita_data[9];
|
||||
bool sun_disc = (angular_diameter > 0.0f);
|
||||
float3 xyz;
|
||||
/* convert dir to spherical coordinates */
|
||||
@@ -145,13 +146,13 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals *kg,
|
||||
if (dir.z >= 0.0f) {
|
||||
/* definitions */
|
||||
float3 sun_dir = geographical_to_direction(sun_elevation, sun_rotation + M_PI_2_F);
|
||||
float sun_dir_angle = acos(dot(dir, sun_dir));
|
||||
float sun_dir_angle = precise_angle(dir, sun_dir);
|
||||
float half_angular = angular_diameter / 2.0f;
|
||||
float dir_elevation = M_PI_2_F - direction.x;
|
||||
|
||||
/* if ray inside sun disc render it, otherwise render sky */
|
||||
if (sun_disc && sun_dir_angle < half_angular) {
|
||||
/* get 3 pixels data */
|
||||
/* get 2 pixels data */
|
||||
float3 pixel_bottom = make_float3(nishita_data[0], nishita_data[1], nishita_data[2]);
|
||||
float3 pixel_top = make_float3(nishita_data[3], nishita_data[4], nishita_data[5]);
|
||||
float y;
|
||||
@@ -160,13 +161,13 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals *kg,
|
||||
if (sun_elevation - half_angular > 0.0f) {
|
||||
if (sun_elevation + half_angular > 0.0f) {
|
||||
y = ((dir_elevation - sun_elevation) / angular_diameter) + 0.5f;
|
||||
xyz = interp(pixel_bottom, pixel_top, y);
|
||||
xyz = interp(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (sun_elevation + half_angular > 0.0f) {
|
||||
y = dir_elevation / (sun_elevation + half_angular);
|
||||
xyz = interp(pixel_bottom, pixel_top, y);
|
||||
xyz = interp(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
/* limb darkening, coefficient is 0.6f */
|
||||
@@ -178,7 +179,8 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals *kg,
|
||||
else {
|
||||
/* sky interpolation */
|
||||
float x = (direction.y + M_PI_F + sun_rotation) / M_2PI_F;
|
||||
float y = dir_elevation / M_PI_2_F;
|
||||
/* more pixels toward horizon compensation */
|
||||
float y = safe_sqrtf(dir_elevation / M_PI_2_F);
|
||||
if (x > 1.0f) {
|
||||
x -= 1.0f;
|
||||
}
|
||||
@@ -301,7 +303,7 @@ ccl_device void svm_node_tex_sky(
|
||||
/* Nishita */
|
||||
else {
|
||||
/* Define variables */
|
||||
float nishita_data[9];
|
||||
float nishita_data[10];
|
||||
|
||||
float4 data = read_node_float(kg, offset);
|
||||
nishita_data[0] = data.x;
|
||||
@@ -317,7 +319,8 @@ ccl_device void svm_node_tex_sky(
|
||||
|
||||
data = read_node_float(kg, offset);
|
||||
nishita_data[8] = data.x;
|
||||
uint texture_id = __float_as_uint(data.y);
|
||||
nishita_data[9] = data.y;
|
||||
uint texture_id = __float_as_uint(data.z);
|
||||
|
||||
/* Compute Sky */
|
||||
f = sky_radiance_nishita(kg, dir, nishita_data, texture_id);
|
||||
|
@@ -2,6 +2,7 @@
|
||||
set(INC
|
||||
..
|
||||
../../glew-mx
|
||||
../../sky/include
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
@@ -92,6 +93,7 @@ set(LIB
|
||||
cycles_device
|
||||
cycles_subd
|
||||
cycles_util
|
||||
bf_intern_sky
|
||||
)
|
||||
|
||||
if(WITH_CYCLES_OSL)
|
||||
|
@@ -52,7 +52,7 @@ class BufferParams {
|
||||
/* passes */
|
||||
vector<Pass> passes;
|
||||
bool denoising_data_pass;
|
||||
/* If only some light path types should be denoised, an additional pass is needed. */
|
||||
/* If only some light path types should be target, an additional pass is needed. */
|
||||
bool denoising_clean_pass;
|
||||
/* When we're prefiltering the passes during rendering, we need to keep both the
|
||||
* original and the prefiltered data around because neighboring tiles might still
|
||||
@@ -149,6 +149,50 @@ class RenderTile {
|
||||
RenderBuffers *buffers;
|
||||
|
||||
RenderTile();
|
||||
|
||||
int4 bounds() const
|
||||
{
|
||||
return make_int4(x, /* xmin */
|
||||
y, /* ymin */
|
||||
x + w, /* xmax */
|
||||
y + h); /* ymax */
|
||||
}
|
||||
};
|
||||
|
||||
/* Render Tile Neighbors
|
||||
* Set of neighboring tiles used for denoising. Tile order:
|
||||
* 0 1 2
|
||||
* 3 4 5
|
||||
* 6 7 8 */
|
||||
|
||||
class RenderTileNeighbors {
|
||||
public:
|
||||
static const int SIZE = 9;
|
||||
static const int CENTER = 4;
|
||||
|
||||
RenderTile tiles[SIZE];
|
||||
RenderTile target;
|
||||
|
||||
RenderTileNeighbors(const RenderTile ¢er)
|
||||
{
|
||||
tiles[CENTER] = center;
|
||||
}
|
||||
|
||||
int4 bounds() const
|
||||
{
|
||||
return make_int4(tiles[3].x, /* xmin */
|
||||
tiles[1].y, /* ymin */
|
||||
tiles[5].x + tiles[5].w, /* xmax */
|
||||
tiles[7].y + tiles[7].h); /* ymax */
|
||||
}
|
||||
|
||||
void set_bounds_from_center()
|
||||
{
|
||||
tiles[3].x = tiles[CENTER].x;
|
||||
tiles[1].y = tiles[CENTER].y;
|
||||
tiles[5].x = tiles[CENTER].x + tiles[CENTER].w;
|
||||
tiles[7].y = tiles[CENTER].y + tiles[CENTER].h;
|
||||
}
|
||||
};
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "util/util_function.h"
|
||||
#include "util/util_logging.h"
|
||||
#include "util/util_math_cdf.h"
|
||||
#include "util/util_task.h"
|
||||
#include "util/util_vector.h"
|
||||
|
||||
/* needed for calculating differentials */
|
||||
@@ -496,20 +497,35 @@ void Camera::device_update_volume(Device * /*device*/, DeviceScene *dscene, Scen
|
||||
if (!need_device_update && !need_flags_update) {
|
||||
return;
|
||||
}
|
||||
KernelCamera *kcam = &dscene->data.cam;
|
||||
BoundBox viewplane_boundbox = viewplane_bounds_get();
|
||||
for (size_t i = 0; i < scene->objects.size(); ++i) {
|
||||
Object *object = scene->objects[i];
|
||||
if (object->geometry->has_volume && viewplane_boundbox.intersects(object->bounds)) {
|
||||
/* TODO(sergey): Consider adding more grained check. */
|
||||
VLOG(1) << "Detected camera inside volume.";
|
||||
kcam->is_inside_volume = 1;
|
||||
break;
|
||||
|
||||
KernelIntegrator *kintegrator = &dscene->data.integrator;
|
||||
if (kintegrator->use_volumes) {
|
||||
KernelCamera *kcam = &dscene->data.cam;
|
||||
BoundBox viewplane_boundbox = viewplane_bounds_get();
|
||||
|
||||
/* Parallel object update, with grain size to avoid too much threading overhead
|
||||
* for individual objects. */
|
||||
static const int OBJECTS_PER_TASK = 32;
|
||||
parallel_for(blocked_range<size_t>(0, scene->objects.size(), OBJECTS_PER_TASK),
|
||||
[&](const blocked_range<size_t> &r) {
|
||||
for (size_t i = r.begin(); i != r.end(); i++) {
|
||||
Object *object = scene->objects[i];
|
||||
if (object->geometry->has_volume &&
|
||||
viewplane_boundbox.intersects(object->bounds)) {
|
||||
/* TODO(sergey): Consider adding more grained check. */
|
||||
VLOG(1) << "Detected camera inside volume.";
|
||||
kcam->is_inside_volume = 1;
|
||||
parallel_for_cancel();
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!kcam->is_inside_volume) {
|
||||
VLOG(1) << "Camera is outside of the volume.";
|
||||
}
|
||||
}
|
||||
if (!kcam->is_inside_volume) {
|
||||
VLOG(1) << "Camera is outside of the volume.";
|
||||
}
|
||||
|
||||
need_device_update = false;
|
||||
need_flags_update = false;
|
||||
}
|
||||
|
@@ -271,42 +271,45 @@ bool DenoiseTask::acquire_tile(Device *device, Device *tile_device, RenderTile &
|
||||
*
|
||||
* However, since there is only one large memory, the denoised result has to be written to
|
||||
* a different buffer to avoid having to copy an entire horizontal slice of the image. */
|
||||
void DenoiseTask::map_neighboring_tiles(RenderTile *tiles, Device *tile_device)
|
||||
void DenoiseTask::map_neighboring_tiles(RenderTileNeighbors &neighbors, Device *tile_device)
|
||||
{
|
||||
RenderTile ¢er_tile = neighbors.tiles[RenderTileNeighbors::CENTER];
|
||||
RenderTile &target_tile = neighbors.target;
|
||||
|
||||
/* Fill tile information. */
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (i == 4) {
|
||||
for (int i = 0; i < RenderTileNeighbors::SIZE; i++) {
|
||||
if (i == RenderTileNeighbors::CENTER) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RenderTile &tile = neighbors.tiles[i];
|
||||
int dx = (i % 3) - 1;
|
||||
int dy = (i / 3) - 1;
|
||||
tiles[i].x = clamp(tiles[4].x + dx * denoiser->tile_size.x, 0, image.width);
|
||||
tiles[i].w = clamp(tiles[4].x + (dx + 1) * denoiser->tile_size.x, 0, image.width) - tiles[i].x;
|
||||
tiles[i].y = clamp(tiles[4].y + dy * denoiser->tile_size.y, 0, image.height);
|
||||
tiles[i].h = clamp(tiles[4].y + (dy + 1) * denoiser->tile_size.y, 0, image.height) -
|
||||
tiles[i].y;
|
||||
tile.x = clamp(center_tile.x + dx * denoiser->tile_size.x, 0, image.width);
|
||||
tile.w = clamp(center_tile.x + (dx + 1) * denoiser->tile_size.x, 0, image.width) - tile.x;
|
||||
tile.y = clamp(center_tile.y + dy * denoiser->tile_size.y, 0, image.height);
|
||||
tile.h = clamp(center_tile.y + (dy + 1) * denoiser->tile_size.y, 0, image.height) - tile.y;
|
||||
|
||||
tiles[i].buffer = tiles[4].buffer;
|
||||
tiles[i].offset = tiles[4].offset;
|
||||
tiles[i].stride = image.width;
|
||||
tile.buffer = center_tile.buffer;
|
||||
tile.offset = center_tile.offset;
|
||||
tile.stride = image.width;
|
||||
}
|
||||
|
||||
/* Allocate output buffer. */
|
||||
device_vector<float> *output_mem = new device_vector<float>(
|
||||
tile_device, "denoising_output", MEM_READ_WRITE);
|
||||
output_mem->alloc(OUTPUT_NUM_CHANNELS * tiles[4].w * tiles[4].h);
|
||||
output_mem->alloc(OUTPUT_NUM_CHANNELS * center_tile.w * center_tile.h);
|
||||
|
||||
/* Fill output buffer with noisy image, assumed by kernel_filter_finalize
|
||||
* when skipping denoising of some pixels. */
|
||||
float *result = output_mem->data();
|
||||
float *in = &image.pixels[image.num_channels * (tiles[4].y * image.width + tiles[4].x)];
|
||||
float *in = &image.pixels[image.num_channels * (center_tile.y * image.width + center_tile.x)];
|
||||
|
||||
const DenoiseImageLayer &layer = image.layers[current_layer];
|
||||
const int *input_to_image_channel = layer.input_to_image_channel.data();
|
||||
|
||||
for (int y = 0; y < tiles[4].h; y++) {
|
||||
for (int x = 0; x < tiles[4].w; x++, result += OUTPUT_NUM_CHANNELS) {
|
||||
for (int y = 0; y < center_tile.h; y++) {
|
||||
for (int x = 0; x < center_tile.w; x++, result += OUTPUT_NUM_CHANNELS) {
|
||||
for (int i = 0; i < OUTPUT_NUM_CHANNELS; i++) {
|
||||
result[i] = in[image.num_channels * x + input_to_image_channel[INPUT_NOISY_IMAGE + i]];
|
||||
}
|
||||
@@ -317,35 +320,38 @@ void DenoiseTask::map_neighboring_tiles(RenderTile *tiles, Device *tile_device)
|
||||
output_mem->copy_to_device();
|
||||
|
||||
/* Fill output tile info. */
|
||||
tiles[9] = tiles[4];
|
||||
tiles[9].buffer = output_mem->device_pointer;
|
||||
tiles[9].stride = tiles[9].w;
|
||||
tiles[9].offset -= tiles[9].x + tiles[9].y * tiles[9].stride;
|
||||
target_tile = center_tile;
|
||||
target_tile.buffer = output_mem->device_pointer;
|
||||
target_tile.stride = target_tile.w;
|
||||
target_tile.offset -= target_tile.x + target_tile.y * target_tile.stride;
|
||||
|
||||
thread_scoped_lock output_lock(output_mutex);
|
||||
assert(output_pixels.count(tiles[4].tile_index) == 0);
|
||||
output_pixels[tiles[9].tile_index] = output_mem;
|
||||
assert(output_pixels.count(center_tile.tile_index) == 0);
|
||||
output_pixels[target_tile.tile_index] = output_mem;
|
||||
}
|
||||
|
||||
void DenoiseTask::unmap_neighboring_tiles(RenderTile *tiles)
|
||||
void DenoiseTask::unmap_neighboring_tiles(RenderTileNeighbors &neighbors)
|
||||
{
|
||||
RenderTile ¢er_tile = neighbors.tiles[RenderTileNeighbors::CENTER];
|
||||
RenderTile &target_tile = neighbors.target;
|
||||
|
||||
thread_scoped_lock output_lock(output_mutex);
|
||||
assert(output_pixels.count(tiles[4].tile_index) == 1);
|
||||
device_vector<float> *output_mem = output_pixels[tiles[9].tile_index];
|
||||
output_pixels.erase(tiles[4].tile_index);
|
||||
assert(output_pixels.count(center_tile.tile_index) == 1);
|
||||
device_vector<float> *output_mem = output_pixels[target_tile.tile_index];
|
||||
output_pixels.erase(center_tile.tile_index);
|
||||
output_lock.unlock();
|
||||
|
||||
/* Copy denoised pixels from device. */
|
||||
output_mem->copy_from_device(0, OUTPUT_NUM_CHANNELS * tiles[9].w, tiles[9].h);
|
||||
output_mem->copy_from_device(0, OUTPUT_NUM_CHANNELS * target_tile.w, target_tile.h);
|
||||
|
||||
float *result = output_mem->data();
|
||||
float *out = &image.pixels[image.num_channels * (tiles[9].y * image.width + tiles[9].x)];
|
||||
float *out = &image.pixels[image.num_channels * (target_tile.y * image.width + target_tile.x)];
|
||||
|
||||
const DenoiseImageLayer &layer = image.layers[current_layer];
|
||||
const int *output_to_image_channel = layer.output_to_image_channel.data();
|
||||
|
||||
for (int y = 0; y < tiles[9].h; y++) {
|
||||
for (int x = 0; x < tiles[9].w; x++, result += OUTPUT_NUM_CHANNELS) {
|
||||
for (int y = 0; y < target_tile.h; y++) {
|
||||
for (int x = 0; x < target_tile.w; x++, result += OUTPUT_NUM_CHANNELS) {
|
||||
for (int i = 0; i < OUTPUT_NUM_CHANNELS; i++) {
|
||||
out[image.num_channels * x + output_to_image_channel[i]] = result[i];
|
||||
}
|
||||
|
@@ -196,8 +196,8 @@ class DenoiseTask {
|
||||
|
||||
/* Device task callbacks */
|
||||
bool acquire_tile(Device *device, Device *tile_device, RenderTile &tile);
|
||||
void map_neighboring_tiles(RenderTile *tiles, Device *tile_device);
|
||||
void unmap_neighboring_tiles(RenderTile *tiles);
|
||||
void map_neighboring_tiles(RenderTileNeighbors &neighbors, Device *tile_device);
|
||||
void unmap_neighboring_tiles(RenderTileNeighbors &neighbors);
|
||||
void release_tile();
|
||||
bool get_cancel();
|
||||
};
|
||||
|
@@ -16,16 +16,20 @@
|
||||
|
||||
#include "render/image_sky.h"
|
||||
|
||||
#include "sky_model.h"
|
||||
|
||||
#include "util/util_image.h"
|
||||
#include "util/util_logging.h"
|
||||
#include "util/util_path.h"
|
||||
#include "util/util_sky_model.h"
|
||||
#include "util/util_task.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
SkyLoader::SkyLoader(
|
||||
float sun_elevation, int altitude, float air_density, float dust_density, float ozone_density)
|
||||
SkyLoader::SkyLoader(float sun_elevation,
|
||||
float altitude,
|
||||
float air_density,
|
||||
float dust_density,
|
||||
float ozone_density)
|
||||
: sun_elevation(sun_elevation),
|
||||
altitude(altitude),
|
||||
air_density(air_density),
|
||||
@@ -56,23 +60,22 @@ bool SkyLoader::load_pixels(const ImageMetaData &metadata,
|
||||
int width = metadata.width;
|
||||
int height = metadata.height;
|
||||
float *pixel_data = (float *)pixels;
|
||||
float altitude_f = (float)altitude;
|
||||
|
||||
/* precompute sky texture */
|
||||
const int rows_per_task = divide_up(1024, width);
|
||||
parallel_for(blocked_range<size_t>(0, height, rows_per_task),
|
||||
[&](const blocked_range<size_t> &r) {
|
||||
nishita_skymodel_precompute_texture(pixel_data,
|
||||
metadata.channels,
|
||||
r.begin(),
|
||||
r.end(),
|
||||
width,
|
||||
height,
|
||||
sun_elevation,
|
||||
altitude_f,
|
||||
air_density,
|
||||
dust_density,
|
||||
ozone_density);
|
||||
SKY_nishita_skymodel_precompute_texture(pixel_data,
|
||||
metadata.channels,
|
||||
r.begin(),
|
||||
r.end(),
|
||||
width,
|
||||
height,
|
||||
sun_elevation,
|
||||
altitude,
|
||||
air_density,
|
||||
dust_density,
|
||||
ozone_density);
|
||||
});
|
||||
|
||||
return true;
|
||||
|
@@ -21,14 +21,14 @@ CCL_NAMESPACE_BEGIN
|
||||
class SkyLoader : public ImageLoader {
|
||||
private:
|
||||
float sun_elevation;
|
||||
int altitude;
|
||||
float altitude;
|
||||
float air_density;
|
||||
float dust_density;
|
||||
float ozone_density;
|
||||
|
||||
public:
|
||||
SkyLoader(float sun_elevation,
|
||||
int altitude,
|
||||
float altitude,
|
||||
float air_density,
|
||||
float dust_density,
|
||||
float ozone_density);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user