Page MenuHome

Cycles: enable NanoVDB by default
Closed, ResolvedPublicTO DO

Description

For 2.92 we want to enable NanoVDB by default in Cycles. The implementation is available rB3df90de6c226: Cycles: Add NanoVDB support for rendering volumes, but disabled by default.

Potential features to add:

  • Half float support for grids to reduce memory usage further

Event Timeline

Brecht Van Lommel (brecht) changed the task status from Needs Triage to Confirmed.Oct 5 2020, 3:11 PM
Brecht Van Lommel (brecht) created this task.
Brecht Van Lommel (brecht) changed the subtype of this task from "Report" to "To Do".Oct 5 2020, 3:42 PM

Dear platform maintainers, can you add the NanoVDB library?

It's enabled by default in the CMake deps builder. This will install as a header only library in a new nanovdb folder, the openvdb library does not need to be updated.

@Sergey Sharybin (sergey) @Sebastián Barschkis (sebbas) @Ray molenkamp (LazyDodo) @Bastien Montagne (mont29)

Added the libs, however enabling it leads to a single failed test

This comment was removed by Juan Gea (juang3d).
Juan Gea (juang3d) added a comment.EditedOct 31 2020, 9:10 PM

With Linux I get a redeclaration error as soon as I enable NanoVDB, without it Blender builds fine, with it I get this:

Just with CUDA/Optix BTW, without CUDA/Optix it builds fine with NanoVDB

That's because NanoVDB includes stdint.h, but Cycles already declared those types in kernel_compat_cuda/optix.h (for NVRTC compatibility I guess). NanoVDB does the same when __CUDACC_RTC__ is defined, so I guess we could define that before including NanoVDB even in the NVCC case. Or instead too include stdint.h in the compat headers when __CUDACC_RTC__ is not defined instead of typedefing (probably the cleaner solution). @Brecht Van Lommel (brecht) Thoughts?
I'm thinking of this in the compat headers:

#ifdef __CUDACC_RTC__
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
#else
#  include <stdint.h>
#endinf
typedef unsigned short half;
typedef unsigned long long CUtexObject;

@Patrick Mours (pmoursnv), the suggested code looks good to me. The typedefs are indeed there for NVRTC.

Juan Gea (juang3d) added a comment.EditedNov 2 2020, 5:08 PM

Sorry for my lack of knowledge here, but I'm not sure if there is a typo here or if it's correct.

Meaning I'm not sure if its #ifdef or #ifndef, looking at other parts of the code I see several #ifndef in the kernel_compat files, also in the same way I'm not sure if it's #endif or #endinf.

Again this can be my lack of knowledge, I'm tyring to apply this code to kernel_compat_cuda.h and kernel_compat_optix.h, not sure if it's needed somewhere else too.

P.S.: ok, just changing the #endinf wiht an #endif solved it, I assume it was a typo in the code, and there is no need for #ifndef instead of #ifdef :)

Juan Gea (juang3d) added a comment.EditedNov 2 2020, 6:07 PM

I detected the same as @Ray molenkamp (LazyDodo) the volume is shifted to the right of the picture, I compared a simple scene from 2.91 with 2.92

@Patrick Mours (pmoursnv) not a problem, I was unsure if #endinf was something that I didn't knew, since there was #ifndef in the code, and I didn't knew that either :)

Thanks!

I have a question regarding the implementation of this feature, I've noticed that the memory usage is greatly reduce, vastly I would say, so it's awesome, but there is a difference in render time, in some test my time went from 19 seconds to 25 seconds, making it slower, @Brecht Van Lommel (brecht) do you think that could be interesting to locate a check box in performance tab to enable / disable this?

I don't think we should add an option. I don't want to maintain two different code paths for the same thing long term, and also for the GPU kernels isn't not great to increase in size that much.

Better focus would be to improve e.g. volume stepping performance by relying on NanoVDB traversal in addition to sampling.

I also imagine for that for CPU rendering there is still room for optimization in NanoVDB.

Ok, understood, if you think there is room for improvement then there is no reason to keep somethign older for the user :)

OK, so after almost a day of work I managed to get install_deps to build this (why can't they use default standard way of doing things???), but when trying to build Blender I get lots of those errors:

FAILED: intern/cycles/kernel/CMakeFiles/cycles_kernel.dir/kernels/cpu/kernel_split_sse3.cpp.o 
/usr/lib/ccache/g++ -DBOOST_ALL_NO_LIB -DBOOST_ATOMIC_DYN_LINK -DBOOST_CHRONO_DYN_LINK -DBOOST_DATE_TIME_DYN_LINK -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_IOSTREAMS_DYN_LINK -DBOOST_LOCALE_DYN_LINK -DBOOST_REGEX_DYN_LINK -DBOOST_SYSTEM_DYN_LINK -DBOOST_THREAD_DYN_LINK -DBOOST_WAVE_DYN_LINK -DCCL_NAMESPACE_BEGIN="namespace ccl {" -DCCL_NAMESPACE_END=} -DCYCLES_GFLAGS_NAMESPACE=gflags -DDEBUG -DEMBREE_STATIC_LIB -DGOOGLE_GLOG_DLL_DECL="" -DOSL_STATIC_BUILD -DOSL_STATIC_LIBRARY -DWITH_BLENDER_GUARDEDALLOC -DWITH_CYCLES_LOGGING -DWITH_EMBREE -DWITH_KERNEL_AVX -DWITH_KERNEL_AVX2 -DWITH_KERNEL_SSE2 -DWITH_KERNEL_SSE3 -DWITH_KERNEL_SSE41 -DWITH_NANOVDB -DWITH_OPENGL -DWITH_OPENSUBDIV -DWITH_OSL -DWITH_SYSTEM_PUGIXML -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -D__LITTLE_ENDIAN__ -D__MMX__ -D__SSE2__ -D__SSE__ -I/home/bastien/blender/src/intern/cycles/../atomic -I/home/bastien/blender/src/intern/cycles/kernel/.. -isystem /opt/lib/osl/include -isystem /opt/lib/embree/include -isystem /opt/lib/nanovdb -isystem /opt/lib/osd/include -isystem /home/bastien/blender/src/extern/glog/include -isystem /home/bastien/blender/src/extern/gflags/src -isystem /usr/include/OpenImageIO -isystem /usr/include/OpenEXR -Wredundant-decls -Wall -Wno-invalid-offsetof -Wno-sign-compare -Wlogical-op -Winit-self -Wmissing-include-dirs -Wno-div-by-zero -Wtype-limits -Werror=return-type -Wno-char-subscripts -Wno-unknown-pragmas -Wpointer-arith  -Wwrite-strings -Wundef -Wformat-signedness -Wrestrict -Wuninitialized -Wundef -Wmissing-declarations -Wimplicit-fallthrough=5  -fuse-ld=gold -fuse-ld=lld -std=c++17   -msse -pipe -fPIC -funsigned-char -fno-strict-aliasing -msse2 -fmacro-prefix-map="/home/bastien/blender/src/"="" -fmacro-prefix-map="/home/bastien/blender/build_master_debug/"="" -fno-trapping-math -fno-math-errno -fno-signed-zeros -fno-signaling-nans -fno-rounding-math -mfpmath=sse -Werror=float-conversion -Werror=double-promotion -Wno-error=unused-macros -g -fsanitize=address -fsanitize=bool -fsanitize=bounds -fsanitize=enum -fsanitize=float-cast-overflow -fsanitize=float-divide-by-zero -fsanitize=nonnull-attribute -fsanitize=returns-nonnull-attribute -fsanitize=signed-integer-overflow -fsanitize=undefined -fsanitize=vla-bound -fno-sanitize=alignment  -fsanitize=leak -fsanitize=object-size -fno-sanitize=vptr -fno-trapping-math -fno-math-errno -fno-signed-zeros -fno-signaling-nans -fno-rounding-math -mfpmath=sse -msse -msse2 -msse3 -mssse3 -MD -MT intern/cycles/kernel/CMakeFiles/cycles_kernel.dir/kernels/cpu/kernel_split_sse3.cpp.o -MF intern/cycles/kernel/CMakeFiles/cycles_kernel.dir/kernels/cpu/kernel_split_sse3.cpp.o.d -o intern/cycles/kernel/CMakeFiles/cycles_kernel.dir/kernels/cpu/kernel_split_sse3.cpp.o -c /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h: In instantiation of ‘static ccl::float4 ccl::{anonymous}::NanoVDBInterpolator<T>::interp_3d(const TextureInfo&, float, float, float, ccl::InterpolationType) [with T = float; ccl::TextureInfo = ccl::TextureInfo; ccl::InterpolationType = ccl::InterpolationType]’:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:568:42:   required from here
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:500:30: error: no matching function for call to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>::SampleFromVoxels(nanovdb::NanoRoot<float>&)’
  500 |         return read(nanovdb::SampleFromVoxels<ReadAccessorT, 0, false>(root)(xyz));
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:22,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:120:17: note: candidate: ‘nanovdb::SampleFromVoxels<TreeOrAccT, 0, false>::SampleFromVoxels(const TreeOrAccT&) [with TreeOrAccT = nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>]’
  120 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                 ^~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:120:52: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>&’
  120 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                                  ~~~~~~~~~~~~~~~~~~^~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>::SampleFromVoxels(const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&)’
  112 | class SampleFromVoxels<TreeOrAccT, 0, false>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>::SampleFromVoxels(nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&&)’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&&’
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:502:30: error: no matching function for call to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>::SampleFromVoxels(nanovdb::NanoRoot<float>&)’
  502 |         return read(nanovdb::SampleFromVoxels<ReadAccessorT, 1, false>(root)(xyz));
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:22,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:297:17: note: candidate: ‘nanovdb::SampleFromVoxels<TreeOrAccT, 1, false>::SampleFromVoxels(const TreeOrAccT&) [with TreeOrAccT = nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>]’
  297 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc) {}
      |                 ^~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:297:52: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>&’
  297 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc) {}
      |                                  ~~~~~~~~~~~~~~~~~~^~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>::SampleFromVoxels(const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&)’
  288 | class SampleFromVoxels<TreeOrAccT, 1, false> : public TrilinearSampler<TreeOrAccT>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>::SampleFromVoxels(nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&&)’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&&’
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:504:30: error: no matching function for call to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>::SampleFromVoxels(nanovdb::NanoRoot<float>&)’
  504 |         return read(nanovdb::SampleFromVoxels<ReadAccessorT, 3, false>(root)(xyz));
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:22,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:958:17: note: candidate: ‘nanovdb::SampleFromVoxels<TreeOrAccT, 3, false>::SampleFromVoxels(const TreeOrAccT&) [with TreeOrAccT = nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>]’
  958 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                 ^~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:958:52: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>&’
  958 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                                  ~~~~~~~~~~~~~~~~~~^~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>::SampleFromVoxels(const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&)’
  950 | class SampleFromVoxels<TreeOrAccT, 3, false> : public TricubicSampler<TreeOrAccT>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>::SampleFromVoxels(nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&&)’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<float>’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<float, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&&’
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h: In instantiation of ‘static ccl::float4 ccl::{anonymous}::NanoVDBInterpolator<T>::interp_3d(const TextureInfo&, float, float, float, ccl::InterpolationType) [with T = nanovdb::Vec3<float>; ccl::TextureInfo = ccl::TextureInfo; ccl::InterpolationType = ccl::InterpolationType]’:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:570:51:   required from here
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:500:30: error: no matching function for call to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>::SampleFromVoxels(nanovdb::NanoRoot<nanovdb::Vec3<float> >&)’
  500 |         return read(nanovdb::SampleFromVoxels<ReadAccessorT, 0, false>(root)(xyz));
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:22,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:120:17: note: candidate: ‘nanovdb::SampleFromVoxels<TreeOrAccT, 0, false>::SampleFromVoxels(const TreeOrAccT&) [with TreeOrAccT = nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>]’
  120 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                 ^~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:120:52: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>&’
  120 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                                  ~~~~~~~~~~~~~~~~~~^~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>::SampleFromVoxels(const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&)’
  112 | class SampleFromVoxels<TreeOrAccT, 0, false>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>::SampleFromVoxels(nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&&)’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:112:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 0, false>&&’
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:502:30: error: no matching function for call to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>::SampleFromVoxels(nanovdb::NanoRoot<nanovdb::Vec3<float> >&)’
  502 |         return read(nanovdb::SampleFromVoxels<ReadAccessorT, 1, false>(root)(xyz));
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:22,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:297:17: note: candidate: ‘nanovdb::SampleFromVoxels<TreeOrAccT, 1, false>::SampleFromVoxels(const TreeOrAccT&) [with TreeOrAccT = nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>]’
  297 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc) {}
      |                 ^~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:297:52: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>&’
  297 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc) {}
      |                                  ~~~~~~~~~~~~~~~~~~^~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>::SampleFromVoxels(const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&)’
  288 | class SampleFromVoxels<TreeOrAccT, 1, false> : public TrilinearSampler<TreeOrAccT>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>::SampleFromVoxels(nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&&)’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:288:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 1, false>&&’
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:504:30: error: no matching function for call to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>::SampleFromVoxels(nanovdb::NanoRoot<nanovdb::Vec3<float> >&)’
  504 |         return read(nanovdb::SampleFromVoxels<ReadAccessorT, 3, false>(root)(xyz));
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_image.h:22,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/split/kernel_split_common.h:40,
                 from /home/bastien/blender/src/intern/cycles/kernel/../kernel/kernels/cpu/kernel_cpu_impl.h:41,
                 from /home/bastien/blender/src/intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp:38:
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:958:17: note: candidate: ‘nanovdb::SampleFromVoxels<TreeOrAccT, 3, false>::SampleFromVoxels(const TreeOrAccT&) [with TreeOrAccT = nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>]’
  958 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                 ^~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:958:52: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>&’
  958 |     __hostdev__ SampleFromVoxels(const TreeOrAccT& acc)
      |                                  ~~~~~~~~~~~~~~~~~~^~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>::SampleFromVoxels(const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&)’
  950 | class SampleFromVoxels<TreeOrAccT, 3, false> : public TricubicSampler<TreeOrAccT>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘const nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note: candidate: ‘constexpr nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>::SampleFromVoxels(nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&&)’
/opt/lib/nanovdb/nanovdb/util/SampleFromVoxels.h:950:7: note:   no known conversion for argument 1 from ‘nanovdb::NanoRoot<nanovdb::Vec3<float> >’ {aka ‘const nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >’} to ‘nanovdb::SampleFromVoxels<nanovdb::ReadAccessor<nanovdb::RootNode<nanovdb::InternalNode<nanovdb::InternalNode<nanovdb::LeafNode<nanovdb::Vec3<float>, nanovdb::Coord, nanovdb::Mask, 3>, 4>, 5> >, -1, -1, -1>, 3, false>&&’

Any insight?

The regression test suite completes to 100% with NanoVDB enabled now for me. There were some changes that probably fix the above errors too.

I wonder what was the urgency to add this lib? Current building/install process for it is completely unconventional to say the least, and it's extremely unstable...

BTW, next time please specify exact revision needed, since their current HEAD is already 100% incompatible with our own code (and the expected e62f7a0bf1e27397223c61ddeaaf57edf111b77f we use with Blender). Had to dig into cmake files to find that, lost a lot of time on this piece of unfinished software. :(

And I really don't think such experimental lib should be enabled by default, this is call for all kind of issues imho. Would recommend waiting for it to be properly integrated in OpenVDB at least, i.e. be in their master, and be installable in a decent, standard way,

I'll admit, the whole, "oh just build this random git hash, but leave the original openvdb we have alone, and just copy these headers, it'll work" is somewhat unorthodox, but given @Brecht Van Lommel (brecht) signed off on it I didn't question it.

NanoVDB is standalone and header-only, so I don't really see the problem. Being able to just copy the headers without invoking a build system is the whole point of that. And it's only part of the official OpenVDB repository for simplicity in finding it, but really wouldn't have to be. Handling it as a separate library in Blender makes it easier to update when NanoVDB changes, without having to update OpenVDB too, which may have wider implications. Building random Git hashes in Blender isn't new either, the same is done for some other dependencies (CLEW, CUEW, HIDAPI, ...). Could we have waited for it to land in some versioned OpenVDB release? Probably. But that is a) likely months away (the OpenVDB release cycles isn't all that quick) and b) would still throw up the question of whether we really want to update the entire OpenVDB library (based on the VFX reference platform requirements etc.). Keeping it separate avoids all that.
I'm sorry there have been API changes since the last revision was chosen, which I had missed, that prolonged your time investment. That was unfortunate and my mistake for not keeping track of upstream changes. But there is no need to call NanoVDB unfinished for it. We are mostly using only the data structure in Cycles, which is stable (see bottom of https://github.com/AcademySoftwareFoundation/openvdb/blob/feature/nanovdb/nanovdb/docs/FAQ.md). There are API improvements still happening around that, but that doesn't change how it works at its core.

It's an important feature for volume rendering, that goes along with the volume object. It's unfortunate that this complicates building with install_deps.sh, but to me it's all the more reason to simplify that system to become something to use only system packages, and not bother trying to match Blender release builds by building libraries from source.

Brecht Van Lommel (brecht) claimed this task.
Brecht Van Lommel (brecht) updated the task description. (Show Details)