Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7ec6329dc | ||
|
|
a28c227175 | ||
|
|
30e59dc432 | ||
|
|
3fff04fa64 | ||
|
|
a75b75617b | ||
|
|
9abae44383 | ||
|
|
7fffe564ef | ||
|
|
375c683456 | ||
|
|
960336887b | ||
|
|
6966d7453d | ||
|
|
d0b0556a6c |
@@ -1,175 +0,0 @@
|
||||
|
||||
name: AX
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
# run this workflow every day 7am UTC
|
||||
- cron: '0 7 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, mac, linux, grammar)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
linux-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
strategy:
|
||||
matrix:
|
||||
# Only test unified builds (core+ax). weekly CI should test standalone
|
||||
config:
|
||||
- { image: '2026', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
- { image: '2026', cxx: 'g++', build: 'Release', cmake: '' }
|
||||
- { image: '2026', cxx: 'clang++', build: 'Debug', cmake: '' }
|
||||
- { image: '2025-clang19.1', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
- { image: '2024-clang16.2', cxx: 'clang++', build: 'Release', cmake: '' }
|
||||
# Needed to test LLVM 15.X
|
||||
- { image: '2023-clang15', cxx: 'clang++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
# 2026 images are broken with gtest/glfw installs
|
||||
- name: deps
|
||||
if: contains(matrix.config.image, '2026')
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: ccache
|
||||
# don't use ccache for debug builds
|
||||
if: matrix.config.build == 'Release'
|
||||
id: ccache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/ccache
|
||||
key: linux-ax${{ matrix.config.image }}-${{ matrix.config.cxx }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: linux-ax${{ matrix.config.image }}-${{ matrix.config.cxx }}-
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components='core,python,axcore,axbin,axtest'
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
# Keep ccache light by stripping out any caches not accessed in the last day
|
||||
- name: ccache_clean
|
||||
if: matrix.config.build == 'Release'
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
macos-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'mac'
|
||||
runs-on: ${{ matrix.config.runner }}
|
||||
name: macos-cxx:${{ matrix.config.cxx }}-llvm:${{ matrix.config.llvm }}-${{ matrix.config.build }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { runner: 'macos-15', cxx: 'clang++', build: 'Release', llvm: '21' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '21' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '20' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '19' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '18' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '17' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '16' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="core,python,axcore,axbin,axtest"
|
||||
--cargs=\"
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
-DLLVM_DIR=/opt/homebrew/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
|
||||
gen-grammar:
|
||||
if: |
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.type == 'grammar'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: build
|
||||
run: ./ci/build.sh -v --components=axgr --target=openvdb_ax_grammar --cargs=\"-DOPENVDB_AX_GRAMMAR_NO_LINES=ON\"
|
||||
- name: upload grammar
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ax_grammar
|
||||
path: ./build/openvdb_ax/openvdb_ax/openvdb_ax/grammar
|
||||
retention-days: 5
|
||||
@@ -1,194 +0,0 @@
|
||||
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'nanovdb/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'nanovdb/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
# run this workflow every day 7am UTC
|
||||
- cron: '0 7 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, linux, win, mac)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
linux-vfx:
|
||||
# VFX platform jobs. These are run on the appropriate CentOS images from
|
||||
# the provided ASWF docker containers
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux:${{ matrix.config.image }}-abi:${{ matrix.config.abi }}-cxx:${{ matrix.config.cxx }}-type:${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { cxx: clang++, image: '2026', abi: '13', build: 'Release', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
|
||||
- { cxx: g++, image: '2026', abi: '13', build: 'Release', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
|
||||
- { cxx: clang++, image: '2026', abi: '13', build: 'Debug', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
|
||||
- { cxx: clang++, image: '2025-clang19.1', abi: '12', build: 'Release', cmake: '' }
|
||||
- { cxx: clang++, image: '2024-clang17.2', abi: '11', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
# 2026 images are broken with gtest/glfw installs
|
||||
- name: deps
|
||||
if: contains(matrix.config.image, '2026')
|
||||
run: |
|
||||
./ci/install_gtest.sh latest
|
||||
./ci/install_glfw.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: ccache
|
||||
# don't use ccache for debug builds
|
||||
if: matrix.config.build == 'Release'
|
||||
id: ccache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/ccache
|
||||
key: linux-vfx${{ matrix.config.image }}-abi${{ matrix.config.abi }}-${{ matrix.config.cxx }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: linux-vfx${{ matrix.config.image }}-abi${{ matrix.config.abi }}-${{ matrix.config.cxx }}-
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=\"core,python,bin,view,render,test\"
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
-DOPENVDB_ABI_VERSION_NUMBER=${{ matrix.config.abi }}
|
||||
\"
|
||||
- name: test
|
||||
# Skip Debug on commits as they take a while.
|
||||
if: github.event_name == 'schedule'|| matrix.config.build == 'Release'
|
||||
run: |
|
||||
cd build && ctest -V
|
||||
cd - && ./ci/test_install.sh
|
||||
# Keep ccache light by stripping out any caches not accessed in the last day
|
||||
- name: ccache_clean
|
||||
if: matrix.config.build == 'Release'
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
windows:
|
||||
# Windows CI. Tests a dynamic build with MD.
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'win'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: windows
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: x64-windows
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
shell: pwsh
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\Release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config='Release'
|
||||
--components='core,bin,view,render,python,test'
|
||||
--cargs=\'
|
||||
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXR=ON
|
||||
-DUSE_PNG=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: size
|
||||
# Print the build directy size (monitor if we're hitting runner limits)
|
||||
run: du -h build
|
||||
- name: test
|
||||
run: cd build && ctest -V -C Release
|
||||
|
||||
macos:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'mac'
|
||||
runs-on: ${{ matrix.config.image }}
|
||||
name: ${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: clang++
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { image: macos-14 }
|
||||
- { image: macos-15 }
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install
|
||||
run: |
|
||||
./ci/install_macos.sh
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=Release
|
||||
--components=\"core,python,bin,view,render,test\"
|
||||
--cargs=\'
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
+15
-80
@@ -23,14 +23,9 @@ on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
deploy:
|
||||
description: 'Deploy to openvdb-website (docs/coverage)?'
|
||||
description: 'Deploy docs?'
|
||||
required: true
|
||||
default: 'none'
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
default: 'false'
|
||||
|
||||
jobs:
|
||||
doxygen:
|
||||
@@ -38,15 +33,17 @@ jobs:
|
||||
env:
|
||||
CXX: g++
|
||||
container:
|
||||
image: aswf/ci-openvdb:2026
|
||||
image: aswf/ci-openvdb:2019
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
- name: install_doxygen
|
||||
run: ./ci/install_doxygen.sh 1_8_11
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: install_epydoc
|
||||
run: pip install epydoc
|
||||
- name: install_latex
|
||||
run: ./ci/install_texlive.sh
|
||||
run: yum -y install texlive-latex-bin texlive-dvips texlive-collection-fontsrecommended texlive-collection-latexrecommended
|
||||
- name: install_cmake
|
||||
run: ./ci/install_cmake.sh 3.15.0
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
@@ -59,10 +56,11 @@ jobs:
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON
|
||||
\"
|
||||
- name: epydoc
|
||||
run: |
|
||||
epydoc --html -o /usr/local/share/doc/OpenVDB/html/python pyopenvdb
|
||||
- name: pre_deploy
|
||||
# Overwrite global SSH configuration
|
||||
# https://github.com/peaceiris/actions-gh-pages/issues/719
|
||||
# https://linuxhint.com/ssh-stricthostkeychecking/
|
||||
run: >
|
||||
echo "Host *
|
||||
StrictHostKeyChecking no
|
||||
@@ -73,78 +71,15 @@ jobs:
|
||||
if: |
|
||||
github.repository_owner == 'AcademySoftwareFoundation' &&
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.deploy == 'docs'
|
||||
github.event.inputs.deploy == 'true'
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
deploy_key: ${{ secrets.PRIVATE_KEY }}
|
||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
publish_dir: /usr/local/share/doc/OpenVDB/html
|
||||
destination_dir: documentation/doxygen
|
||||
external_repository: AcademySoftwareFoundation/openvdb-website
|
||||
publish_branch: master
|
||||
publish_branch: doxygen
|
||||
full_commit_message: "Automatic doxygen documentation update
|
||||
- Deployed from: AcademySoftwareFoundation/openvdb ${{ github.sha }}
|
||||
|
||||
Signed-off-by: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>"
|
||||
|
||||
#############################################################################
|
||||
################################ Coverage ###################################
|
||||
#############################################################################
|
||||
|
||||
linux-coverage:
|
||||
if: |
|
||||
github.repository_owner == 'AcademySoftwareFoundation' &&
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.deploy == 'coverage'
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
env:
|
||||
CXX: g++
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_gcovr
|
||||
run: pip install gcovr
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=coverage
|
||||
--components="core,axcore,test,axtest"
|
||||
--cargs=\"-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF\"
|
||||
- name: test_and_gcov
|
||||
run: |
|
||||
cd build
|
||||
ctest -V
|
||||
make gcov_html
|
||||
cd -
|
||||
- name: zip_large_html
|
||||
# The index.function list is > 100mb. Just zip it and provide it as a
|
||||
# download (could instead use LFS to host but not really worth it).
|
||||
run: |
|
||||
cd build/gcov_html
|
||||
tar -czvf index.functions.html.tar.gz index.functions.html
|
||||
sed -i -e 's/index.functions.html/index.functions.html.tar.gz/g' index.html
|
||||
sed -i -e 's/List of functions/Download function index/g' index.html
|
||||
rm index.functions.html
|
||||
cd -
|
||||
- name: pre_deploy
|
||||
# Overwrite global SSH configuration
|
||||
# https://github.com/peaceiris/actions-gh-pages/issues/719
|
||||
# https://linuxhint.com/ssh-stricthostkeychecking/
|
||||
run: >
|
||||
echo "Host *
|
||||
StrictHostKeyChecking no
|
||||
UserKnownHostsFile=/dev/null
|
||||
" > /etc/ssh/ssh_config
|
||||
- name: deploy
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
publish_dir: ./build/gcov_html
|
||||
destination_dir: documentation/code_coverage
|
||||
external_repository: AcademySoftwareFoundation/openvdb-website
|
||||
publish_branch: master
|
||||
full_commit_message: "Automatic code coverage update
|
||||
- Deployed from: AcademySoftwareFoundation/openvdb ${{ github.sha }}
|
||||
|
||||
Signed-off-by: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>"
|
||||
|
||||
|
||||
@@ -1,178 +0,0 @@
|
||||
|
||||
name: Houdini
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
# run this workflow every day 7am UTC
|
||||
- cron: '0 7 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
checksecret:
|
||||
# Check that valid github secrets have been set. This isn't needed to retrieve
|
||||
# the cache, but ensures that the job doens't start with an empty cache
|
||||
name: Verify Houdini Secrets
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
HOUDINI_SECRETS: ${{ steps.check.outputs.HOUDINI_SECRETS }}
|
||||
steps:
|
||||
- id: check
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
run: echo "HOUDINI_SECRETS=${{ env.HOUDINI_CLIENT_ID != '' && env.HOUDINI_SECRET_KEY != '' }}" >> $GITHUB_OUTPUT
|
||||
- name: Skip Next Jobs
|
||||
if: steps.check.outputs.HOUDINI_SECRETS != 'true'
|
||||
run: echo "HOUDINI_CLIENT_ID and HOUDINI_SECRET_KEY GitHub Action Secrets needs to be set to install Houdini builds"
|
||||
|
||||
linux-vfx-houdini:
|
||||
needs: [checksecret]
|
||||
if: >
|
||||
${{ needs.checksecret.outputs.HOUDINI_SECRETS == 'true' ||
|
||||
github.repository_owner == 'AcademySoftwareFoundation' }}
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: hou:${{ matrix.config.hou_hash }}-vfx:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-build:${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-base:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { cxx: clang++, image: '2026', hou_hash: '21_0', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: clang++, image: '2026', hou_hash: '21_0', build: 'Debug', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: g++, image: '2026', hou_hash: '21_0', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: clang++, image: '2024', hou_hash: '20_5', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
- { cxx: g++, image: '2024', hou_hash: '20_5', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: install_gtest
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: ccache
|
||||
# don't use ccache for debug builds
|
||||
if: matrix.config.build == 'Release'
|
||||
id: ccache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/ccache
|
||||
key: linux-vfx-hou${{ matrix.config.hou_hash }}-${{ matrix.config.image }}-${{ matrix.config.cxx }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: linux-vfx-hou${{ matrix.config.hou_hash }}-${{ matrix.config.image }}-${{ matrix.config.cxx }}-
|
||||
- name: fetch_houdini
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: hou
|
||||
key: dummy-houdini${{ matrix.config.hou_hash }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: vdb-v5-houdini${{ matrix.config.hou_hash }}-
|
||||
- name: validate_houdini
|
||||
run: test -f "hou/hou.tar.gz"
|
||||
# Make sure that the unpacked install is NOT in the root of the OpenVDB checkout
|
||||
# otherwise CMake's install RPATHs wil not work correctly.
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: build
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type="${{ matrix.config.build }}" \
|
||||
--components="${{ matrix.config.components }}" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
|
||||
-DOPENVDB_HOUDINI_INSTALL_PREFIX=/tmp \
|
||||
-DDISABLE_CMAKE_SEARCH_PATHS=ON \
|
||||
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON \
|
||||
\"
|
||||
- name: test
|
||||
if: matrix.config.build == 'Release'
|
||||
run: cd build && ctest -V
|
||||
# Keep ccache light by stripping out any caches not accessed in the last day
|
||||
- name: ccache_clean
|
||||
if: matrix.config.build == 'Release'
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
macos-houdini:
|
||||
needs: [checksecret]
|
||||
if: >
|
||||
${{ needs.checksecret.outputs.HOUDINI_SECRETS == 'true' ||
|
||||
github.repository_owner == 'AcademySoftwareFoundation' }}
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: fetch_houdini
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: hou
|
||||
key: dummy-houdini
|
||||
restore-keys: vdb-v5-houdini-macos-
|
||||
- name: validate_houdini
|
||||
run: test -f "hou/hou.tar.gz"
|
||||
# Make sure that the unpacked install is NOT in the root of the OpenVDB checkout
|
||||
# otherwise CMake's install RPATHs wil not work correctly.
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: install_deps
|
||||
run: ./ci/install_macos.sh 20
|
||||
- name: build
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type=Release \
|
||||
--components="core,hou,bin,view,render,python,test,axcore,axbin" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
|
||||
-DOPENVDB_HOUDINI_INSTALL_PREFIX=/tmp \
|
||||
-DDISABLE_CMAKE_SEARCH_PATHS=ON \
|
||||
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON \
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF \
|
||||
-DLLVM_DIR=/opt/homebrew/opt/llvm@20/lib/cmake/llvm \
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
@@ -1,189 +0,0 @@
|
||||
|
||||
name: NanoVDB
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
schedule:
|
||||
# run this workflow every day 7am UTC
|
||||
- cron: '0 7 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, linux, win, mac)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
linux-nanovdb:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-nanovdb:cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { cxx: g++, image: '2024-clang17.2', build: 'Release' }
|
||||
- { cxx: g++, image: '2024-clang17.2', build: 'Debug' }
|
||||
- { cxx: clang++, image: '2024-clang17.2', build: 'Release' }
|
||||
- { cxx: clang++, image: '2024-clang17.2', build: 'Debug' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: setup_cuda_12
|
||||
run: |
|
||||
echo "/usr/local/cuda-12/bin" >> $GITHUB_PATH
|
||||
echo "LD_LIBRARY_PATH=/usr/local/cuda-12/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
|
||||
- name: build
|
||||
# NOTE: CMAKE_POSITION_INDEPENDENT_CODE set to fix default behaviour change in clang 14
|
||||
# https://github.com/AcademySoftwareFoundation/aswf-docker/issues/228
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DNANOVDB_USE_CUDA=ON
|
||||
-DCMAKE_CUDA_ARCHITECTURES="80"
|
||||
-DNANOVDB_USE_OPENVDB=ON
|
||||
-DCMAKE_INSTALL_PREFIX=`pwd`
|
||||
-DUSE_BLOSC=OFF
|
||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && sudo ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
windows-nanovdb:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'win'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: 'x64-windows'
|
||||
visual_studio: "Visual Studio 17 2022"
|
||||
cuda: "12.4.0"
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\Release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install_cuda
|
||||
shell: powershell
|
||||
run: .\ci\install_windows_cuda.ps1
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
# nvcc doesn't set _WIN32 when run in bash so we need to set it manually
|
||||
shell: bash
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=Release
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'
|
||||
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DNANOVDB_USE_CUDA=ON
|
||||
-DCMAKE_CUDA_ARCHITECTURES="80"
|
||||
-DCMAKE_CUDA_FLAGS="-D_WIN32"
|
||||
-DNANOVDB_USE_OPENVDB=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: test
|
||||
shell: bash
|
||||
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
macos-nanovdb:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'mac'
|
||||
runs-on: ${{ matrix.config.runner }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Release' }
|
||||
- { runner: 'macos-14', cxx: 'clang++', build: 'Debug' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
./ci/install_macos.sh
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_USE_CUDA=OFF -DNANOVDB_USE_OPENVDB=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \'
|
||||
- name: test
|
||||
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
nanovdb-lite:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'linux'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2024-clang17.2
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_gtest
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: build_and_test
|
||||
run: |
|
||||
cd nanovdb/nanovdb
|
||||
sudo mkdir .build
|
||||
cd .build
|
||||
sudo cmake -DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_BUILD_UNITTESTS=ON -DNANOVDB_USE_OPENVDB=OFF -DNANOVDB_USE_CUDA=OFF ../
|
||||
sudo make -j8 install
|
||||
sudo ctest -V
|
||||
@@ -1,610 +0,0 @@
|
||||
# This workflow runs once a week and tests a variety of configurations,
|
||||
# dependencies and other specific or expensive checkes (sanitizers).
|
||||
# It also contains the Houdini Cache jobs which update the CI cache
|
||||
# with new Houdini releases.
|
||||
|
||||
name: Weekly
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# run this workflow Sunday 00:00 UTC
|
||||
- cron: '0 0 * * 0'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, houdini, latest, extra, ax, blosc, abi)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
#############################################################################
|
||||
################################## Houdini ##################################
|
||||
#############################################################################
|
||||
|
||||
# Check that valid github secrets have been set for the ability to
|
||||
# download Houdini and cache it. The secrets are used in download_houdini.py
|
||||
checksecret:
|
||||
name: Verify Houdini Secrets
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
HOUDINI_SECRETS: ${{ steps.check.outputs.HOUDINI_SECRETS }}
|
||||
steps:
|
||||
- id: check
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
run: echo "HOUDINI_SECRETS=${{ env.HOUDINI_CLIENT_ID != '' && env.HOUDINI_SECRET_KEY != '' }}" >> $GITHUB_OUTPUT
|
||||
- name: Skip Next Jobs
|
||||
if: steps.check.outputs.HOUDINI_SECRETS != 'true'
|
||||
run: echo "HOUDINI_CLIENT_ID and HOUDINI_SECRET_KEY GitHub Action Secrets needs to be set to install Houdini builds"
|
||||
# Explicitly error on the ASWF repo, we expect this secret to always exist
|
||||
- name: Error ASWF
|
||||
if: steps.check.outputs.HOUDINI_SECRETS != 'true' && github.repository_owner == 'AcademySoftwareFoundation'
|
||||
run: exit 1
|
||||
|
||||
# download the latest production version of Houdini X, strip out headers,
|
||||
# libraries and binaries required for building OpenVDB and put it into
|
||||
# the GitHub Actions cache
|
||||
linux_houdini:
|
||||
needs: [checksecret]
|
||||
if: |
|
||||
(needs.checksecret.outputs.HOUDINI_SECRETS == 'true') &&
|
||||
(github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'houdini')
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: linux-houdini:${{ matrix.config.hou_hash }}
|
||||
env:
|
||||
CXX: clang++
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { houdini_version: '21.0', platform: 'linux_x86_64_gcc11.2', hou_hash: '21_0' }
|
||||
- { houdini_version: '20.5', platform: 'linux_x86_64_gcc11.2', hou_hash: '20_5' }
|
||||
fail-fast: false
|
||||
container:
|
||||
image: aswf/ci-base:2024
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: download_houdini
|
||||
run: ./ci/download_houdini.sh ${{ matrix.config.houdini_version }} ${{ matrix.config.platform }} --prod
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: write_houdini_cache
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: hou
|
||||
key: vdb-v5-houdini${{ matrix.config.hou_hash }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
|
||||
macos_houdini:
|
||||
needs: [checksecret]
|
||||
if: |
|
||||
(needs.checksecret.outputs.HOUDINI_SECRETS == 'true') &&
|
||||
(github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'houdini')
|
||||
# Note that macos-14 (current macos-latest) switches to M1. We could instead test
|
||||
# the arm build here instead of the x86 one.
|
||||
runs-on: macos-latest
|
||||
name: macos-houdini
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: download_houdini
|
||||
run: ./ci/download_houdini.sh 21.0 macosx_arm64_clang15.0_14 --prod
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: write_houdini_cache
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: hou
|
||||
key: vdb-v5-houdini-macos-${{ steps.timestamp.outputs.timestamp }}
|
||||
|
||||
#############################################################################
|
||||
########################### Core Library Extras #############################
|
||||
#############################################################################
|
||||
|
||||
# Extra configuration tests for the OpenVDB Core library. These test a
|
||||
# variety of options with newer compilers.
|
||||
linux-extra:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'extra'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: linux-extra:${{ matrix.config.name }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: clang++
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { name: 'all', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=ON -DUSE_ZLIB=ON -DUSE_EXR=ON -DUSE_PNG=ON' }
|
||||
- { name: 'lite', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_ZLIB=OFF -DUSE_EXR=OFF -DUSE_PNG=OFF -DOPENVDB_USE_DELAYED_LOADING=OFF' }
|
||||
- { name: 'half', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_IMATH_HALF=ON' }
|
||||
- { name: 'sse', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=SSE42' }
|
||||
- { name: 'avx', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=AVX' }
|
||||
- { name: 'pygrid', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON' }
|
||||
- { name: 'asan', image: '2026', build: 'asan', components: 'core,test', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON -DNANOVDB_USE_OPENVDB=ON -DOPENVDB_AX_STATIC=OFF -DOPENVDB_CORE_STATIC=OFF -DUSE_BLOSC=OFF' } # We never called blosc_destroy(), so disable blosc to silence these errors
|
||||
- { name: 'ubsan', image: '2026', build: 'ubsan', components: 'core,test', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" ' }
|
||||
- { name: 'c++20', image: '2026', build: 'Release', components: 'core,test', cmake: '-DCMAKE_CXX_STANDARD=20' }
|
||||
- { name: 'conf', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
# 2026 images are broken with gtest/glfw/exr installs
|
||||
- name: deps
|
||||
if: contains(matrix.config.image, '2026')
|
||||
run: |
|
||||
./ci/install_gtest.sh latest
|
||||
./ci/install_glfw.sh latest
|
||||
./ci/install_imath.sh v3.2.2
|
||||
./ci/install_exr.sh v3.2.2
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="${{ matrix.config.components }}"
|
||||
--cargs=\"-DOPENVDB_CXX_STRICT=ON ${{ matrix.config.cmake }}\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
# Test latest dependencies, latest compilers and options
|
||||
latest:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'latest'
|
||||
runs-on: ${{ matrix.config.runson }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# llvm-17 is currently the default which has symbol issues with the python module
|
||||
- { runson: ubuntu-latest, cxx: g++, cmake: '-DOPENVDB_PYTHON_USE_AX=OFF' }
|
||||
# Disable the clang job for now. See https://github.com/actions/runner-images/issues/8659
|
||||
# - { runson: ubuntu-latest, cxx: clang++, cmake: '' }
|
||||
# @todo gcc on macos
|
||||
- { runson: macos-latest, cxx: '', cmake: '-DLLVM_DIR=/opt/homebrew/opt/llvm@20/lib/cmake/llvm' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Linux" ]; then
|
||||
sudo apt-get -q install -y libboost-dev libboost-iostreams-dev libtbb-dev libblosc-dev libgtest-dev libgmock-dev python3-numpy
|
||||
./ci/install_nanobind.sh 2.5.0
|
||||
elif [ "$RUNNER_OS" == "macOS" ]; then
|
||||
./ci/install_macos.sh 20
|
||||
./ci/install_tbb_macos.sh
|
||||
else
|
||||
echo "$RUNNER_OS not supported"; exit 1
|
||||
fi
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=Release
|
||||
--components=\"core,axcore,python,bin,render,test,axbin\"
|
||||
--cargs=\'
|
||||
-DCMAKE_CXX_STANDARD=20
|
||||
-DOPENVDB_USE_DELAYED_LOADING=OFF
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
${{ matrix.config.cmake }}
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
windows:
|
||||
# Windows CI. Tests static and dynamic builds with MT and MD respectively.
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'win'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
# USE_EXPLICIT_INSTANTIATION is disabled for debug static libraries
|
||||
# due to disk space constraints
|
||||
# - { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
# - { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
shell: pwsh
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--components=${{ matrix.config.components }}
|
||||
--cargs=\'
|
||||
${{ matrix.config.cmake }}
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXR=ON
|
||||
-DUSE_PNG=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: size
|
||||
# Print the build directy size (monitor if we're hitting runner limits)
|
||||
run: du -h build
|
||||
- name: test
|
||||
# Always run tests on weekly builds but skip Debug on commits as they take a while.
|
||||
# https://github.community/t/distinct-job-for-each-schedule/17811/2
|
||||
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
|
||||
run: cd build && ctest -V -C ${{ matrix.config.build }}
|
||||
|
||||
#############################################################################
|
||||
############################ AX Library Extras ##############################
|
||||
#############################################################################
|
||||
|
||||
linux-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: >
|
||||
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { image: '2025-clang18.1', cxx: 'clang++', build: 'Release', components: 'core,axcore,axbin,axtest', cmake: '' }
|
||||
# @note LLVM 17 builds are incompatible with the vdb python plugin on linux
|
||||
- { image: '2024-clang17.2', cxx: 'clang++', build: 'Release', components: 'core,axcore,axbin,axtest', cmake: '-DOPENVDB_PYTHON_USE_AX=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=${{ matrix.config.components }}
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
-DOPENVDB_BUILD_VDB_TOOL=OFF
|
||||
\"
|
||||
- name: clean
|
||||
if: matrix.config.components == 'core'
|
||||
run: rm -rf build
|
||||
- name: build
|
||||
if: matrix.config.components == 'core'
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="bin,axcore,axbin,axtest,python"
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
-DOPENVDB_BUILD_VDB_TOOL=OFF
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
|
||||
macos-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: ${{ matrix.config.runner }}
|
||||
name: macos-cxx:${{ matrix.config.cxx }}-llvm:${{ matrix.config.llvm }}-${{ matrix.config.build }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '20' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="core,python,bin,axcore,axbin,axtest"
|
||||
--cargs=\"
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
|
||||
-DLLVM_DIR=/opt/homebrew/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
|
||||
windows-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: ${{ matrix.config.vc }}-${{ matrix.config.crt }}-${{ matrix.config.build }}-llvm${{ matrix.config.llvm }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
# Export this with '' avoid bash treating \ as escape
|
||||
VDB_INSTALL_PREFIX: '${{ github.workspace }}\\install'
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
# @todo We don't currently run the axtests with shared builds of ax
|
||||
# due to symbol issues using LLVM as a static lib (which is the only
|
||||
# option on Windows).
|
||||
# @note currently only test static builds with MT as building LLVM as
|
||||
# a shared lib on windows is a bit dicey
|
||||
- { vc: 'x64-windows-static', llvm: '18.1.0', crt: 'MultiThreaded', components: 'core,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows-static', llvm: '18.1.0', crt: 'MultiThreadedDebug', components: 'core,axcore,axbin,axtest', build: 'Debug', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
- { vc: 'x64-windows', llvm: '18.1.0', crt: 'MultiThreadedDLL', components: 'core,axcore,axbin', build: 'Release', cmake: '-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF' }
|
||||
- { vc: 'x64-windows-static', llvm: '15.0.0', crt: 'MultiThreaded', components: 'core,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: llvm
|
||||
run: ./ci/install_llvm_windows.sh ${{ matrix.config.llvm }} ${{ matrix.config.crt }}
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: |
|
||||
vcpkg update
|
||||
vcpkg install tbb gtest
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--components="${{ matrix.config.components }}"
|
||||
--cargs=\'
|
||||
-A x64 -G \"Visual Studio 17 2022\"
|
||||
-DOPENVDB_USE_DELAYED_LOADING=OFF
|
||||
-DUSE_BLOSC=OFF \
|
||||
-DUSE_ZLIB=OFF \
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=OFF
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DLLVM_DIR=\"${HOME}\\llvm_install\\lib\\cmake\\llvm\"
|
||||
-DCMAKE_INSTALL_PREFIX=\"${VDB_INSTALL_PREFIX}\"
|
||||
${{ matrix.config.cmake }}
|
||||
\'
|
||||
- name: runtime_path
|
||||
shell: pwsh
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "$Env:VDB_INSTALL_PREFIX\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: test
|
||||
run: cd build && ctest -V -C ${{ matrix.config.build }}
|
||||
|
||||
#############################################################################
|
||||
################################## Blosc ####################################
|
||||
#############################################################################
|
||||
|
||||
windows-nanovdb:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'winnano'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
visual_studio: "Visual Studio 17 2022"
|
||||
cuda: "12.4.0"
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
# static build of blosc from vcpkg does not build internal sources.
|
||||
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
|
||||
# Boost as both shared and static libs are installed.
|
||||
- { vc: 'x64-windows-static', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded' }
|
||||
- { vc: 'x64-windows-static', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug' }
|
||||
- { vc: 'x64-windows', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
- { vc: 'x64-windows', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: path
|
||||
shell: powershell
|
||||
run: |
|
||||
# note: system path must be modified in a previous step to it's use
|
||||
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: install_cuda
|
||||
shell: powershell
|
||||
run: .\ci\install_windows_cuda.ps1
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: build
|
||||
shell: bash
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
|
||||
--cargs=\'
|
||||
${{ matrix.config.cmake }}
|
||||
-DMSVC_COMPRESS_PDB=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DNANOVDB_USE_CUDA=ON
|
||||
-DCMAKE_CUDA_ARCHITECTURES="80"
|
||||
-DNANOVDB_USE_OPENVDB=ON
|
||||
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
|
||||
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
|
||||
\'
|
||||
- name: test
|
||||
shell: bash
|
||||
run: cd build && ctest -V -E ".*cuda.*"
|
||||
|
||||
#############################################################################
|
||||
################################## Blosc ####################################
|
||||
#############################################################################
|
||||
|
||||
linux-blosc:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'blosc'
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
|
||||
name: linux-blosc:${{ matrix.blosc }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
strategy:
|
||||
matrix:
|
||||
blosc: ['1.21.0', 'latest']
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_blosc
|
||||
run: sudo ./ci/install_blosc.sh ${{ matrix.blosc }}
|
||||
- name: build
|
||||
run: >
|
||||
sudo ./ci/build.sh -v
|
||||
--build-type=Release
|
||||
--components=\"core,test\"
|
||||
- name: test
|
||||
run: cd build && sudo ctest -V
|
||||
|
||||
#############################################################################
|
||||
################################## ABI ######################################
|
||||
#############################################################################
|
||||
|
||||
linux-abi-checker:
|
||||
if: |
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
(github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'abi')
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
# The 'abicheck' build type sets these, but older versions of the library
|
||||
# may not have this build type. See OpenVDBCXX.cmake
|
||||
CXXFLAGS: "-gdwarf-4 -g3 -ggdb -Og"
|
||||
steps:
|
||||
- name: Enable Node 16
|
||||
run: |
|
||||
echo "ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true" >> $GITHUB_ENV
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
fetch-tags: true
|
||||
# Compute the latest major version - that is used as our baseline
|
||||
# note: For CI forks, make sure you have your tags synced
|
||||
- name: get_major_version
|
||||
run: |
|
||||
LATEST_VERSION_TAG=$(git tag --merged | sort --version-sort | tail -n1)
|
||||
echo "Computed latest VDB tag: ${LATEST_VERSION_TAG}"
|
||||
VDB_MAJOR_VERSION=$(echo ${LATEST_VERSION_TAG} | cut -f1 -d '.' | tr -d -c 0-9)
|
||||
echo "Using major version: ${VDB_MAJOR_VERSION}"
|
||||
echo "VDB_MAJOR_VERSION=${VDB_MAJOR_VERSION}" >> "$GITHUB_ENV"
|
||||
- name: install_deps
|
||||
run: sudo apt-get -q install -y libboost-iostreams-dev libtbb-dev libblosc-dev elfutils
|
||||
- name: install_abi_checker
|
||||
run: sudo apt-get -q install -y abi-dumper abi-compliance-checker
|
||||
- name: build_new
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-dir=build_new
|
||||
--build-type=abicheck
|
||||
--target=openvdb_shared
|
||||
--components=\"core\"
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON\'
|
||||
- name: checkout_baseline
|
||||
run: git checkout v${VDB_MAJOR_VERSION}.0.0
|
||||
- name: build_old
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-dir=build_old
|
||||
--build-type=abicheck
|
||||
--target=openvdb_shared
|
||||
--components=\"core\"
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON\'
|
||||
- name: abi_dump
|
||||
run: |
|
||||
abi-dumper build_new/openvdb/openvdb/libopenvdb.so -o ABI-NEW.dump -lver 1
|
||||
abi-dumper build_old/openvdb/openvdb/libopenvdb.so -o ABI-OLD.dump -lver 2
|
||||
# Replace the version namespace in the latest ABI dump with the baseline
|
||||
# version we're comparing against. We should probably instead build the
|
||||
# latest with the baseline version number but no CMake/defines allow us to
|
||||
# do this.
|
||||
- name: replace_symbols
|
||||
run: sed -i -E 's/openvdb([^v]*)v[0-9]*_[0-9]/openvdb\1v'${VDB_MAJOR_VERSION}'_0/g' ABI-NEW.dump
|
||||
- name: abi_check
|
||||
# -strict treats warnings as errors
|
||||
# -extended checks all member data
|
||||
# we check everything _not_ in openvdb::**::internal namespace
|
||||
run: >
|
||||
abi-compliance-checker -l OPENVDB
|
||||
-old ABI-OLD.dump
|
||||
-new ABI-NEW.dump
|
||||
-skip-internal-symbols "\d(openvdb.*internal)"
|
||||
-skip-internal-types "(openvdb.*internal)::"
|
||||
-strict
|
||||
-extended
|
||||
- name: upload_report
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: abi_report
|
||||
path: ./compat_reports/OPENVDB/2_to_1/compat_report.html
|
||||
retention-days: 5
|
||||
@@ -1,40 +0,0 @@
|
||||
|
||||
name: Whitespace
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'pendingchanges/**'
|
||||
- 'tsc/meetings/**'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'pendingchanges/**'
|
||||
- 'tsc/meetings/**'
|
||||
|
||||
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# Search the git repository for any trailing spaces excluding meeting notes and auto-generated wlt files
|
||||
trailingspaces:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: test
|
||||
run: |
|
||||
set +e
|
||||
git grep -n -I -E '^.+[ ]+$' -- ':!tsc/meetings/*' ':!pendingchanges/*' ':!*.wlt'
|
||||
test $? -eq 1
|
||||
|
||||
# Search for any tabs excluding meeting notes, image files and a few others
|
||||
spacesnottabs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: test
|
||||
run: |
|
||||
set +e
|
||||
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!*.wlt' ':!*.jpg' ':!*.gif' ':!*.mp4' ':!*.pt' ':!*.pth' ':!*.nvdb' ':!*.npz'
|
||||
test $? -eq 1
|
||||
@@ -1,2 +1 @@
|
||||
/build/*
|
||||
.DS_Store
|
||||
|
||||
@@ -1,819 +1,36 @@
|
||||
OpenVDB Version History
|
||||
=======================
|
||||
|
||||
Version 12.1.2 - In development
|
||||
|
||||
|
||||
Version 12.1.1 - September 30, 2025
|
||||
|
||||
OpenVDB AX:
|
||||
Fixes:
|
||||
- Fixed an issue which was causing host specific optimization passes to be
|
||||
omitted when using LLVM 16 and higher.
|
||||
|
||||
Houdini:
|
||||
- Fixed a compilation issue with the OpenVDB Activate SOP with Houdini 21
|
||||
[Reported by @callen128]
|
||||
|
||||
|
||||
Version 12.1.0 - August 8, 2025
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- New level set constructor tools::createLevelSetCapsule creates a grid
|
||||
containing a narrow-band level set representation of a capsule (tube
|
||||
with constant radius and sphere caps).
|
||||
- New level set constructor tools::createLevelSetTaperedCapsule creates a
|
||||
grid containing a narrow-band level set representation of a tapered
|
||||
capsule (tube with sphere caps and different radii at both ends, or
|
||||
equivalently the convex hull of two spheres with possibly different
|
||||
centers and radii).
|
||||
- New level set constructor tools::createLevelSetTubeComplex creates a grid
|
||||
containing a narrow-band level set representation of a tube complex (a
|
||||
collection of capsules or tapered capsules defined by endpoint coordinates
|
||||
and segment indices).
|
||||
- New level set constructor tools::createLevelSetDilatedMesh creates a grid
|
||||
containing a narrow-band level set representation of a dilated surface
|
||||
mesh (dilated by a radius in all directions).
|
||||
- New class tools::ConvexVoxelizer, used by the above methods, which can be
|
||||
inherited to implement a convex level set constructor.
|
||||
- Introduced anisotropic surfacing tools in points/PointRasterizeSDF.h and
|
||||
principal component analysis (PCA) methods in points/PrincipalComponentAnalysis.h.
|
||||
The latter tool analyses point neighborhoods and computes affine
|
||||
transformations representing elliptical distributions. The prior tool
|
||||
takes rotational and stretch point attributes (optionally computed from
|
||||
the prior PCA methods) and generates anisotropic surfaces.
|
||||
|
||||
Improvements:
|
||||
- Significantly improved the performance of all LeafNode ValueIterators,
|
||||
up to 5x on some platforms and up to 10x when delay loading is enabled.
|
||||
Construction of a ValueIterator from a leaf node now requests the leaf
|
||||
buffers ahead of iteration to avoid potentially expensive API calls.
|
||||
- Improved the performance of PointRasterizeSDF.h tools with larger radii
|
||||
with better bound computation approximations.
|
||||
- Significant performance improvement to delay loaded files - the warning
|
||||
logic which checks the underlying mapped file for the last modified time
|
||||
has been removed, resulting in performance gains upwards of 10x when
|
||||
loading in node data buffers. Note that the check that was removed is
|
||||
entirely redundant on Windows and would only print a warning on other
|
||||
system.
|
||||
[Contributed by jjtParadox]
|
||||
- Added OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION and OPENVDB_HAS_MEMBER_FUNCTION
|
||||
macros to help determine the presence and compatibility of interface
|
||||
member functions at compile time.
|
||||
- Added OPENVDB_ASSUME macros to mimic builtin assume and C++23 assume
|
||||
attributes.
|
||||
- Improved read and write of PLY files with vdb_tool so they support Vec3d
|
||||
and 64 bit attributes. Changed vdb_tool version number from 10.6.1 to
|
||||
10.7.0.
|
||||
|
||||
API Changes:
|
||||
- Mat3 and Mat4 functions have been marked [[nodiscard]] where it may be
|
||||
confusing if they are operating in place or returning a result, in
|
||||
particular tranpose, invert, adjoint, and timesDiagonal.
|
||||
- Re-worked the API in PointRasterizeSDF.h with the addition of anisotropic
|
||||
surfacing kernels. The new API exposes more concise free functions which
|
||||
take structs of parameters. The old API remains supported but is
|
||||
deprecated.
|
||||
- Deprecated providing a filter or interrupter as arguments to
|
||||
points::rasterize. These can instead be implemented on user transfer
|
||||
schemes.
|
||||
- Transfer schemes provided to points::rasterize can now optionally
|
||||
implement a rasterizePoints callback that takes a range of points per
|
||||
voxel.
|
||||
|
||||
Fixes:
|
||||
- Fixed a bug in points::rasterizeSpheres and points::rasterizeSmoothSpheres
|
||||
which could cause sections of the generated surface to incorrectly be
|
||||
marked as negative interior values.
|
||||
- Fixed a bug in points::rasterizeSmoothSpheres which could result in
|
||||
incomplete surface reconstruction with significantly larger search
|
||||
distances.
|
||||
- Fixed some precision issues in various Matrix methods.
|
||||
- Fixed bugs in vdb_tool that prevented build with newer namespaces in
|
||||
nanovdb.
|
||||
|
||||
OpenVDB AX:
|
||||
Improvements:
|
||||
- Added support for LLVM versions greater than 15. Upgraded CI to test with
|
||||
LLVM versions 16, 17, 18, 19 and 20.
|
||||
- As of this release, LLVM 15 is the minimum required version for OpenVDB
|
||||
AX. Note that there is an issue with LLVM 17 symbols which makes it
|
||||
incompatible with the OpenVDB Python plugin. AS such, LLVM version 18 and
|
||||
greater are the recommended LLVM versions to use, with LLVM 18 being the
|
||||
new future minimum version.
|
||||
- Significant performance improvement to the compilation of AX kernels when
|
||||
using LLVM 18 and greater.
|
||||
- Significant backend refactoring to AX IR generation to support newer
|
||||
versions of LLVM. In particular, parts of the codegen::Function and
|
||||
codegen::FunctionBuilder API require new usage from LLVM 16 due to
|
||||
the LLVM opaque pointer changes. If you're not using the OpenVDB AX
|
||||
Function codegen API then no client changes should be necessary.
|
||||
- Migrated OpenVDB AX unit tests from cppunit to gtest
|
||||
[Contributed by Tim Straubinger]
|
||||
|
||||
Fixes:
|
||||
- Fixed a case of undefined behaviour when explicitly casting variables to
|
||||
the same type as their storage type e.g:
|
||||
double a; double b = double(a);
|
||||
- Fixed an AX compiler error which would produce invalid IR when using 64bit
|
||||
integer variables for matrix array offsetting e.g:
|
||||
int64 a = 0; mat4f b = 1; float c = b[a,a];
|
||||
|
||||
NanoVDB:
|
||||
- Added nanovdb::openToIndexVDB, which can convert an OpenVDB grid into a
|
||||
NanoVDB IndexGrid.
|
||||
- Added new options "--index" and "--onIndex" to the command-line tool
|
||||
nanovdb_convert so it can produce IndexGrids.
|
||||
- Fixed memory leak in DeviceBuffer.
|
||||
- Added constructor for DeviceBuffer from an existing HostBuffer.
|
||||
- Added VoxelBlockManager, an acceleration structure for sequential access
|
||||
and stencil ops over active voxels.
|
||||
- Added helper functions for kernel launches with shared memory.
|
||||
- Added support for CUDA 13.0.
|
||||
- Fix warnings and compilation errors for GCC and Clang.
|
||||
- Fixed inconsistent usage of util::cuda::mallocAsync/freeAsync that
|
||||
affected vGPUs.
|
||||
- Added support for custom memory resources in PointsToGrid.
|
||||
- Fixed race condition in split/mergeGridHandles.
|
||||
- Fixed offset bug in nanovdb::tools::cuda::IndexToGrid related to non-POD
|
||||
build types.
|
||||
[Contributed by Andreas Henne]
|
||||
|
||||
Houdini:
|
||||
- Define OP_InputIdx and OP_OutputIdx for Houdini 21.0 compatibility
|
||||
- Add Houdini 21 style camera interface to support LOP cameras
|
||||
- Include env flag for avoiding stream writing (was backported to 19.5)
|
||||
|
||||
|
||||
Version 12.0.1 - April 3, 2025
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Added read and write support for OFF (Object File Format) files to
|
||||
vdb_tool
|
||||
|
||||
Build:
|
||||
- Fixed a build issue with vdb_render on Windows with newer versions of
|
||||
glew not including glu.h by default
|
||||
- Fixed issues with newer versions of clang refusing to accept older
|
||||
::template syntax
|
||||
|
||||
NanoVDB:
|
||||
New features:
|
||||
- Added support for multiple GPUs to DeviceBuffer
|
||||
- Added a UnifiedBuffer class that wraps CUDA unified memory
|
||||
- Added example for multiGPU sparse convolution
|
||||
- Added CUDA utility functions for device queries
|
||||
- Added functions to independently stop and compute the elapsed time for
|
||||
timer classes
|
||||
|
||||
Improvements:
|
||||
- Replaced CUB's CachingDeviceAllocator with the default asynchronous
|
||||
stream ordered allocator in PointsToGrid for improved performance
|
||||
|
||||
Bug fix:
|
||||
- Map is now properly transposed when converting NanoVDB to OpenVDB.
|
||||
- Fixed ostream specializations being hidden within the nanovdb namespace
|
||||
- Fixed a call to a non-existent method in GridBuild.h
|
||||
|
||||
|
||||
Version 12.0.0 - October 31, 2024
|
||||
|
||||
OpenVDB is now licensed under the Apache 2.0 license, instead of the MPL 2.0 license.
|
||||
|
||||
This version introduces ABI changes relative to older major releases,
|
||||
so to preserve ABI compatibility it might be necessary to define the
|
||||
macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 10 for
|
||||
Houdini 20.0 and 11 for Houdini 20.5.
|
||||
|
||||
GCC 9 is no longer supported.
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Added fillet() method in tools::LevelSetFilter to round off concave edges
|
||||
to create smoother transition between surfaces.
|
||||
|
||||
Improvements:
|
||||
- Added openvdb::assertAbort to replace cassert and a
|
||||
OPENVDB_ENABLE_ASSERTS cmake argument/compile define to toggle
|
||||
assertions in OpenVDB code, independantly of NDEBUG. Asserts are
|
||||
no longer enabled by default in when NDEBUG is absent (e.g.
|
||||
Debug builds).
|
||||
- Removed last traces of Boost when OPENVDB_USE_DELAYED_LOADING is OFF
|
||||
[Reported by Brian McKinnon]
|
||||
- RootNode code cleanup to eliminate redundant key conversion and
|
||||
to create map values in-place.
|
||||
- Add RootNode::deleteChildOrTile() to delete a child or tile of
|
||||
the root node.
|
||||
- ValueAccessors are now defined and created in the Tree class
|
||||
instead of in the Grid class so that custom Tree implementations
|
||||
may define and create their own ValueAccessors if desired.
|
||||
- Added support for PDAL to vdb_tool [Contributed by Tom Matterson]
|
||||
- LeafManager and NodeManager now use Index64 for leaf counts internally.
|
||||
- Added RootNode::probeChild() const.
|
||||
- Added RootNode::probeChild() and RootNode::probeConstChild().
|
||||
- Added RootNode::probe() and RootNode::probeConst() to query key presence,
|
||||
child node, value and active state.
|
||||
- Added InternalNode::probeChild() const.
|
||||
- Added InternalNode::probeChild() and probeChildConst() with coord access
|
||||
and optionally value and active state.
|
||||
- Added InternalNode::probeChild() and probeChildConst() with index access
|
||||
and optionally value and active state.
|
||||
- Added InternalNode::isValueOff(), LeafNode::isValueOff(),
|
||||
LeafNodeBool::isValueOff(), LeafNodeMask::isValueOff().
|
||||
- Added LeafNodeMask::probeValue(Index,val), LeafNodeBool::probeValue(Index,val).
|
||||
- Added RootNode::getValueUnsafe(), RootNode::getChildUnsafe(),
|
||||
RootNode::getConstChildUnsafe().
|
||||
- Added InternalNode::getValueUnsafe(), InternalNode::getChildUnsafe(),
|
||||
InternalNode::getConstChildUnsafe().
|
||||
- Added InternalNode::setActiveStateUnsafe(), InternalNode::setValueOnlyUnsafe(),
|
||||
InternalNode::setValueOnUnsafe(), InternalNode::setValueOffUnsafe().
|
||||
- Added InternalNode::setChildUnsafe(), InternalNode::resetChildUnsafe(),
|
||||
InternalNode::stealChildUnsafe(), InternalNode::deleteChildUnsafe().
|
||||
- For LeafNode, LeafNodeBool and LeafNodeMask - added
|
||||
LeafNode::getValueUnsafe(), LeafNode::setActiveStateunsafe(),
|
||||
LeafNode::setValueOnlyUnsafe(), LeafNode::setValueOnUnsafe(),
|
||||
LeafNode::setValueOffUnsafe().
|
||||
|
||||
ABI changes:
|
||||
- Tree::leafCount(), Tree::unallocatedLeafCount(),
|
||||
Tree::nonLeafCount() and Tree::nodeCount() now use Index64 in their
|
||||
return types instead of Index32.
|
||||
|
||||
API Changes:
|
||||
- RootNode::tileCount(), RootNode::activeTileCount() and
|
||||
RootNode::inactiveTileCount() are now public.
|
||||
- RootNode::hasKey() and RootNode::coordToKey() are now public.
|
||||
- RootNode::leafCount(), RootNode::nonLeafCount() and RootNode::nodeCount()
|
||||
now use Index64 instead of Index32. The Index32 variant is deprecated.
|
||||
- InternalNode::leafCount(), InternalNode::nonLeafCount() and
|
||||
InternalNode::nodeCount() now use Index64 instead of Index32. The Index32
|
||||
variant is deprecated.
|
||||
- LeafNode::leafCount() and LeafNode::nonLeafCount() now use Index64 instead
|
||||
of Index32. The Index32 variant is deprecated.
|
||||
|
||||
Bug Fixes:
|
||||
- Fix potential crash reading corrupt .vdb files with invalid
|
||||
blosc or zip chunks.
|
||||
[Fix thanks to Matthias Ueberheide]
|
||||
- Fix a bug in RootNode::setOrigin() where the origin was updated
|
||||
before the error was thrown potentially leaving the root in an
|
||||
invalid state.
|
||||
- Fixed a thread sanitizer issue which could cause undefined
|
||||
behaviour in VolumeToSpheres::fillWithSpheres
|
||||
[Reported by Jérémie Dumas]
|
||||
- Fixed an occurance of undefined behaviour in tools::activate
|
||||
(though this would typically not have manifested with any
|
||||
unintended behaviour)
|
||||
|
||||
NanoVDB:
|
||||
Bug fix:
|
||||
- nanovdb::readGrids works with raw grid buffer.
|
||||
|
||||
Improvements:
|
||||
- Restructure files location and namespace to be more align with
|
||||
OpenVDB. The namespaces touched by the restructuring are: io,
|
||||
cuda, util, tools, and math.
|
||||
- Add two scripts updateFiles.sh and updateFiles.py to update the
|
||||
files using NanoVDB. The script updateFiles.py works on both
|
||||
Windows and Linux. For a more complete list of changes, see API
|
||||
Changes (details).
|
||||
|
||||
- cuda::PointsToGrid supports target density.
|
||||
- Add support for NanoVDB Grid of type UInt8.
|
||||
- Add ability to use externally managed CUDA buffer.
|
||||
- Add create methods for CudaDeviceBuffer and exceptions.
|
||||
- Improve GridValidator logic, e.g. include check for grid count.
|
||||
- Add operator > and >= for class Coord according to lexicographical order.
|
||||
- Add toCodec to convert string to Codec enumeration type.
|
||||
- Add nanovdb::strlen<GridType>().
|
||||
- Add strncpy util.
|
||||
- Add NANOVDB_DISABLE_SYNC_CUDA_MALLOC that maps cudaMallocAsync
|
||||
and cudaFreeAsync to cudaMalloc and cudaFree respectively.
|
||||
- Add guard to UINT64_C.
|
||||
- Remove use of cudaMallocAsync in PointsToGrid.cuh.
|
||||
- Align PNanoVDB blind metadata to NanoVDB.
|
||||
|
||||
API Changes:
|
||||
- Change mapToGridType to toGridType.
|
||||
- Change mapToMagic to toMagic.
|
||||
- Change CpuTimer.h to Timer.h.
|
||||
|
||||
API Changes (details):
|
||||
- These APIs are now under the math namespace: Ray, DDA, HDDA,
|
||||
Vec3, Vec4, BBox, ZeroCrossing, TreeMarcher, PointTreeMarcher,
|
||||
BoxStencil, CurvatureStencil, GradStencil, WenoStencil, AlignUp,
|
||||
Min, Max, Abs, Clamp, Sqrt, Sign, Maximum, Delta, RoundDown, pi,
|
||||
isApproxZero, Round, createSampler, SampleFromVoxels.
|
||||
|
||||
- These APIs are now under the tools namespace: createNanoGrid,
|
||||
StatsMode, createLevelSetSphere, createFogVolumeSphere,
|
||||
createFogVolumeSphere, createFogVolumeSphere,
|
||||
createFogVolumeTorus, createLevelSetBox, CreateNanoGrid,
|
||||
updateGridStats, evalChecksum, validateChecksum, checkGrid,
|
||||
Extrema.
|
||||
- These APIs are now under the util namespace: is_floating_point,
|
||||
findLowestOn, findHighestOn, Range, streq, strcpy, strcat,
|
||||
empty, Split, invoke, forEach, reduce, prefixSum, is_same,
|
||||
is_specialization, PtrAdd, PtrDiff.
|
||||
|
||||
- Move nanovdb::build to nanovdb::tools::build.
|
||||
- Rename nanovdb::BBoxR to nanovdb::Vec3dBBox.
|
||||
- Rename nanovdb::BBox<nanovdb::Vec3d> to nanovdb::Vec3dBbox.
|
||||
- Move nanovdb::cudaCreateNodeManager to nanovdb::cuda::createNodeManager.
|
||||
- Move and rename nanovdb::cudaVoxelsToGrid to nanovdb::cuda::voxelsToGrid.
|
||||
- Move and rename nanovdb::cudaPointsToGrid to nanovdb::cuda::pointsToGrid.
|
||||
- Move nanovdb::DitherLUT to nanovdb::math::DitherLUT.
|
||||
- Move and rename nanovdb::PackedRGBA8 to nanovdb::math::Rgba8.
|
||||
- Move nanovdb::Rgba8 to nanovdb::math::Rgba8.
|
||||
- Move and rename nanovdb::CpuTimer to nanovdb::util::Timer.
|
||||
- Move nanovdb::GpuTimer to nanovdb::util::cuda::Timer.
|
||||
- Move and rename nanovdb::CountOn to nanovdb::util::countOn.
|
||||
|
||||
- Move util/GridHandle.h to GridHandle.h.
|
||||
- Move util/BuildGrid.h to tools/GridBuilder.h.
|
||||
- Move util/GridBuilder.h to tools/GridBuilder.h.
|
||||
- Move util/IO.h to io/IO.h.
|
||||
- Move util/CSampleFromVoxels.h to math/CSampleFromVoxels.h.
|
||||
- Move util/DitherLUT.h to math/DitherLUT.h.
|
||||
- Move util/HDDA.h to math/HDDA.h.
|
||||
- Move util/Ray.h to math/Ray.h.
|
||||
- Move util/SampleFromVoxels.h to math/SampleFromVoxels.h.
|
||||
- Move util/Stencils.h to nanovdb/math/Stencils.h.
|
||||
- Move util/CreateNanoGrid.h to tools/CreateNanoGrid.h.
|
||||
- Move and rename util/Primitives.h to tools/CreatePrimitives.h.
|
||||
- Move util/GridChecksum.h to tools/GridChecksum.h.
|
||||
- Move util/GridStats.h to tools/GridStats.h.
|
||||
- Move util/GridChecksum.h to tools/GridChecksum.h.
|
||||
- Move util/GridValidator.h to tools/GridValidator.h.
|
||||
- Move util/NanoToOpenVDB.h to tools/NanoToOpenVDB.h.
|
||||
- Move util/cuda/CudaGridChecksum.cuh to tools/cuda/CudaGridChecksum.cuh.
|
||||
- Move util/cuda/CudaGridStats.cuh to tools/cuda/CudaGridStats.cuh.
|
||||
- Move util/cuda/CudaGridValidator.cuh to tools/cuda/CudaGridValidator.cuh.
|
||||
- Move util/cuda/CudaIndexToGrid.cuh to tools/cuda/CudaIndexToGrid.cuh.
|
||||
- Move and rename util/cuda/CudaPointsToGrid.cuh to tools/cuda/PointsToGrid.cuh.
|
||||
- Move util/cuda/CudaSignedFloodFill.cuh to tools/cuda/CudaSignedFloodFill.cuh.
|
||||
- Move and rename util/cuda/CudaDeviceBuffer.h to cuda/DeviceBuffer.h.
|
||||
- Move and rename util/cuda/CudaGridHandle.cuh to cuda/GridHandle.cuh.
|
||||
- Move and rename util/cuda/CudaUtils.h to util/cuda/Util.h.
|
||||
- Move and consolidate util/cuda/GpuTimer.h to util/cuda/Timer.h.
|
||||
|
||||
Houdini:
|
||||
- When OPENVDB_ENABLE_RPATH is ON, the location of
|
||||
libopenvdb_houdini is now added to the rpath of all Houdini
|
||||
dsos.
|
||||
|
||||
Python:
|
||||
- OpenVDB Python bindings are now implemented using nanobind
|
||||
instead of pybind11
|
||||
- The OpenVDB Python module has been changed from pyopenvdb to openvdb
|
||||
- Added Python bindings for NanoVDB
|
||||
|
||||
Build:
|
||||
- Fixed an issue with OpenVDB AX's CMake on Windows where the
|
||||
static and shared library targets would have the same name
|
||||
[Reported by Nicholas Yue]
|
||||
- USE_EXPLICIT_INSTANTIATION is now disabled on Windows by default
|
||||
due to OOM linker issues.
|
||||
- Jemalloc is now the preferred allocator of choice on all
|
||||
platforms when CONCURRENT_MALLOC is set to Auto.
|
||||
- Fixed an issue with the Blosc CMake FindPackage for the OpenVDB
|
||||
Windows static library.
|
||||
|
||||
|
||||
Version 11.0.0 - November 1, 2023
|
||||
|
||||
This version introduces ABI changes relative to older major releases,
|
||||
so to preserve ABI compatibility it might be necessary to define the
|
||||
macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 9 for
|
||||
Houdini 19.5 and 10 for Houdini 20.0.
|
||||
|
||||
OpenEXR 2 and Python 2 are no longer supported.
|
||||
|
||||
OpenVDB:
|
||||
Improvements:
|
||||
- Removed use of boost::any in favor of std::any.
|
||||
[Contributed by Brian McKinnon]
|
||||
|
||||
Bug Fixes:
|
||||
- Fix potential crash reading corrupt .vdb files with invalid
|
||||
blosc or zip chunks.
|
||||
[Contributed by Matthias Ueberheide]
|
||||
|
||||
NanoVDB:
|
||||
Highlights:
|
||||
- Several new tools to generate and modify NanoVDB grids on the GPU.
|
||||
- New file format that supports streaming of raw grid buffers.
|
||||
|
||||
New Features:
|
||||
- New memory efficient GridClass::IndexGrid that separates values from tree
|
||||
- 4 new GridTypes (Index, OnIndex, IndexMask, OnIndexMask) used by IndexGrid
|
||||
- Added createNanoGrid that replaces older conversion methods in GridBuilder.h,
|
||||
IndexGridBuilder.h and OpenToNanoVDB.h
|
||||
- Added cudaPointsToGrid that constructs a point device grid from a list of
|
||||
points.
|
||||
- Added cudaVoxelsToGrid that constructs a voxel device grid from a list of
|
||||
voxels.
|
||||
- Added cuda/CudaUtils.h with several cuda utility functions.
|
||||
- Added GpuTimer for timing of kernels in a specific cuda stream.
|
||||
- Added cudaIndexToGrid that converts IndexGrids into regular Grids.
|
||||
- Added cudaSignedFloodFill that performs signed-flood filling on the GPU.
|
||||
- Added cudaAddBlindData that adds blind data to an existing grid on the GPU.
|
||||
- Added cudaGridChecksum that computes checksums of device grids.
|
||||
- Added cudaGridHandle that handles grids on the GPU.
|
||||
- Added cudaNodeManager that constructs a NodeManager on the GPU.
|
||||
- Added build type Points and GridType::PointIndex for point grids.
|
||||
- Added GridType::Vec3u16 and GridType::Vec3u8 for compressed coordinates.
|
||||
- Added PrefixSum.h for concurrent computation of prefix sum on the CPU.
|
||||
|
||||
API Changes:
|
||||
- Version 32.6.0 (ABI is unchanged).
|
||||
- Transition from C++11 to C++17
|
||||
- Vec3R is deprecated, please use Vec3d instead.
|
||||
- nanoToOpenVDB now takes the index of a NanoVDB in a GridHandle.
|
||||
- GridData, InternalData and LeafData are now public.
|
||||
- GridMetaData can be copied.
|
||||
- Improvements to GridBuilder.h that allows construction of grids on CPU.
|
||||
- GridHandle's move c-tor now requires the GridBuffer to contain a valid grid.
|
||||
- Moved CudaDeviceBuffer.h to cuda/CudaDeviceBuffer.h.
|
||||
- New API for acceleration of custom random-access with ValueAccessors.
|
||||
- Added BitFlags class for convenient bit-mask operations.
|
||||
- Added Vec2/3::min/maxComponentAtomic GPU methods.
|
||||
- Added BBox::expandAtomic and BBox::intersectAtomic.
|
||||
- Added Coord::expandAtomic.
|
||||
- Added Map constructors.
|
||||
- Added Mask::DenseIterator, Mask::setOnAtomic, and Mask::setOffAtomic.
|
||||
- InternalNode::ChildIterator is now const-correct.
|
||||
- Added several new NanoVDB Build Traits.
|
||||
- Syncing PNanoVDB.h with NanoVDB.h.
|
||||
|
||||
Build:
|
||||
- Support for OpenEXR 2.X has been removed.
|
||||
- Better support for building with external package configurations
|
||||
with CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON.
|
||||
|
||||
Python:
|
||||
- Removed Python 2 support.
|
||||
[Contributed by Matthew Cong]
|
||||
- Removed explicit bindings for Math types.
|
||||
[Contributed by Matthew Cong]
|
||||
- Improved type casting for TypedMetadata.
|
||||
[Contributed by Matthew Cong]
|
||||
|
||||
|
||||
Version 10.1.0 - October 11, 2023
|
||||
|
||||
Highlights:
|
||||
- OpenVDB Python bindings are now implemented using pybind11 instead of
|
||||
Boost.Python.
|
||||
[Contributed by Matthew Cong]
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Added points::replicate() for the replication of PointDataGrid points
|
||||
and attributes.
|
||||
|
||||
Improvements:
|
||||
- Upgraded OpenVDBs internal half representation to IMath 3.1.6. Brings
|
||||
conversion support using F16C instructions (if enabled using -mf16c) and
|
||||
the removal of the exponent lookup table in favor of bit shifting.
|
||||
- OpenVDBs copy of Half.h is no longer built with an internal lookup table,
|
||||
but explicitly selects the non-LUT version and disables the creation of
|
||||
the LUT. This is required to avoid symbol conflicts with different
|
||||
namespaced OpenVDB builds.
|
||||
- Removed boost::uuid from Archive, instead std::random_device is used
|
||||
directly to generate UUID-like objects.
|
||||
- Moved all cases of file static/global variables which relied on non-trivial
|
||||
construction into function scopes as static locals. These would previously
|
||||
initialize themselves on start-up in a non-deterministic, compiler-dictated
|
||||
order(static-initialization-order-fiasco). This order is now defined by the
|
||||
program's execution.
|
||||
- Fixed the constants used in openvdb::math::Coord::hash() and
|
||||
nanovdb::Coord::hash() to correctly be prime numbers (note that this
|
||||
changes the result of these methods).
|
||||
[Contributed by Benedikt Mersch]
|
||||
- Updated tools::meshToVolume to take two new optional arguments to provide
|
||||
an interior test oracle and an interior testing method. These allow the
|
||||
default outside-flood-fill to be replaced if the actual sidedness can be
|
||||
known.
|
||||
[Contributed by Tomas Skrivan]
|
||||
- LevelSetRebuild now includes example code that demonstrates the intended
|
||||
use of the new meshToVolume interior testing parameters for the
|
||||
resampling of level sets, where the original grid is used as the true
|
||||
sign value. However, due to differences between polygonalization and
|
||||
trilinear interpolation, this behaviour is disabled and exists as a
|
||||
reference.
|
||||
- Introduced openvdb::TupleList to wrap std::tuple and provide interface
|
||||
interop methods with openvdb::TypeList.
|
||||
- Added OPENVDB_FORCE_INLINE, OPENVDB_LIKELY and OPENVDB_UNLIKELY macros.
|
||||
- Introduced openvdb::make_index_sequence to solve clang compilations
|
||||
issues with compiler built-in index_sequence implementations.
|
||||
|
||||
API changes:
|
||||
- Significant infrastructural change to the ValueAccessor header and
|
||||
implementation. All ValueAccessor specializations have been consolidated
|
||||
into a single class which supports all possible ValueAccessor configurations
|
||||
using index_sequences. Backward compatible declarations have been provided.
|
||||
The new ValueAccessor implementation is marked as final.
|
||||
- PagedArray iterators no longer derive from std::iterator
|
||||
(but remains standard compliant).
|
||||
|
||||
Bug Fixes:
|
||||
- Internal counters in tree::RangeIterator were limited to 32bit precision.
|
||||
They are now extended to size_t.
|
||||
[Reported by SpaceX]
|
||||
- Fixed a bug when compiling with -fvisibility=hidden and GCC 11 which
|
||||
would cause a crash in openvdb::initialize().
|
||||
- Fixed a bug with LeafManager which wouldn't correctly
|
||||
initialize its LeafNode array for single level Tree configurations
|
||||
i.e. RootNode<LeafNode> (bug introduced in 7.2.0).
|
||||
[Reported by @lanwatch]
|
||||
- Fixed a bug with LeafNodeBool Topology constructor with designated
|
||||
on/off values which wouldn't apply them correctly.
|
||||
[Reported by @hozhaoea]
|
||||
|
||||
OpenVDB AX:
|
||||
Improvements:
|
||||
- Added support for LLVM 15.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed a bug in AX on older X86 hardware which could cause a crash when
|
||||
accessing point attributes with half compression (bug introduced in 9.1.0).
|
||||
- Fixed an incorrect option in the `vdb_ax` command line tool where the default
|
||||
optimization level was set to NONE instead of O3 (issue introduced in 10.0.0).
|
||||
|
||||
Houdini:
|
||||
Improvements:
|
||||
- Added Preserve Holes option to VDB From Polygons that uses the
|
||||
fast winding oracle to not collapse holes in polygonal geometry.
|
||||
|
||||
Bug Fixes:
|
||||
- Fix a bug in the projection mode of the Advect Points SOP that was causing
|
||||
a segfault.
|
||||
|
||||
Build:
|
||||
- Fixed a build issue where Boost was not being pulled in when
|
||||
OPENVDB_USE_DELAYED_LOADING was set to OFF.
|
||||
- Fixed a build issue with AX on 32-bit platforms.
|
||||
[Reported by Mathieu Malaterre]
|
||||
- Fixed a compilation issue with the min() and max() methods on Stencils
|
||||
in openvdb/math/Stencils.h.
|
||||
[Reported by Samuel Mauch]
|
||||
- Fixed a compilation error that would be encountered when attempting to
|
||||
enable the SSE4.2 or AVX SIMD options on non-x86 based platforms.
|
||||
- Improved support for compiling with C++20.
|
||||
[Contributed by Denys Maletskyy and Jérémie Dumas]
|
||||
- OpenVDB's CMake no longer modifies the BUILD_SHARED_LIBS variable.
|
||||
[Reported by Maksim Shabunin]
|
||||
- Fix int-in-bool-context GCC9+ warnings by switching to use constexpr if.
|
||||
|
||||
Version 10.0.1 - November 30, 2022
|
||||
|
||||
Bug Fixes:
|
||||
- Fix uninitialized point flags in tools::VolumeToMesh which could result in
|
||||
non-deterministic results (bug introduced in 10.0.0).
|
||||
|
||||
Build:
|
||||
- Fixed CXX standard requirement for VDB components in FindOpenVDB.cmake
|
||||
|
||||
Version 10.0.0 - October 27, 2022
|
||||
|
||||
This version introduces ABI changes relative to older major releases,
|
||||
so to preserve ABI compatibility it might be necessary to define the
|
||||
macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 8 for
|
||||
Houdini 19.0 and 9 for Houdini 19.5.
|
||||
|
||||
Highlights:
|
||||
- Introducing OpenVDBLink, which provides a Mathematica interface to
|
||||
OpenVDB. This link ports over access to various grid containers including
|
||||
level sets, fog volumes, vector grids, integer grids, Boolean grids,
|
||||
and mask grids. Construction, modification, combinations, visualisations,
|
||||
queries, import, export, etc. can be achieved over grids too. Any
|
||||
Mathematica 3D region that's ConstantRegionQ and BoundedRegionQ can
|
||||
be represented as a level set grid, providing a more seamless integration
|
||||
with OpenVDB.
|
||||
- Introducing a new command-line tool, dubbed vdb_tool, that can combine any
|
||||
number of the high-level tools available in openvdb/tools. For
|
||||
instance, it can convert a sequence of polygon meshes and particles to
|
||||
level sets, perform a large number of operations on these level set
|
||||
surfaces and export them as adaptive polygon meshes.
|
||||
|
||||
OpenVDB:
|
||||
Improvements:
|
||||
- Significantly improved the performance of all ValueAccessor methods which
|
||||
access LeafNode value buffer data. This improvement applies to any type
|
||||
which is delay load compatible (all default types except for bool and mask
|
||||
grids) and improves the performance of many OpenVDB tools.
|
||||
- Improved the performance of volumeToMesh by 10-15%.
|
||||
|
||||
ABI changes:
|
||||
- ABI change to openvdb::RootNode, which now has a new member that defines
|
||||
the origin of the node. For now this origin is set to a default value of
|
||||
(0,0,0), but in the near future we will allow for offsets to improve
|
||||
access performance and reduce the memory footprints.
|
||||
- Removed deprecated virtual methods from AttributeArray.
|
||||
|
||||
API changes:
|
||||
- Removed PagedArray::push_back().
|
||||
- Removed Tree visitor methods from Tree, RootNode, InternalNode and
|
||||
LeafNode classes - visit(), visit2(), visitActiveBBox().
|
||||
- Removed LeafManager::getNodes().
|
||||
- Removed tools::dilateVoxels() and tools::erodeVoxels() in favor of
|
||||
tools::dilateActiveValues() and tools::erodeActiveValues().
|
||||
- Removed tools::FindActiveValues::any() and
|
||||
tools::FindActiveValues::none().
|
||||
- StringGrid and StringTrees have been removed.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed an issue with tools::topologyToLevelSet which would previously
|
||||
ignore active tiles in the input topology.
|
||||
[Reported by Tobias Rittig]
|
||||
- Fixed a bug with ValueAccessor::addLeaf and ValueAccessor::addTile which
|
||||
wouldn't add the provided leaf nodes to the underlying tree. This bug did
|
||||
NOT affect the specialized accessors which are used by the default tree
|
||||
configuration.
|
||||
[Contributed by Andrey Zakirov]
|
||||
- Fixed a bug where ValueAccessor::probeNode<NodeT> and
|
||||
ValueAccessor:probeConstNode<NodeT> would return a nullptr if the NodeT
|
||||
type was not explicitly being cached by the accessor but the node existed
|
||||
in the tree.
|
||||
- Fixed a bug on Windows where math::Abs could truncate 64bit integer values.
|
||||
[Contributed by Edward Lam]
|
||||
- Fixed an occurrence of undefined behaviour with math::floatToInt32 and
|
||||
math::doubleToInt64.
|
||||
[Reported by Vojtěch Bubník]
|
||||
- Fixed bugs in the sum merge that produced incorrect merged grids when
|
||||
deep-copying the input nodes or when non-zero background grids were being
|
||||
used.
|
||||
- Fixed a bug in FastSweeping where voxels/tiles are left with min/max float
|
||||
values.
|
||||
- Fixed a bug in math/Tuple.h that prevented compilation with VS2017.
|
||||
|
||||
OpenVDB AX:
|
||||
Improvements:
|
||||
- Major updates to the command line interface of the vdb_ax binary, exposing
|
||||
more controls such as tile streaming, value iterator types and attribute
|
||||
bindings.
|
||||
|
||||
OpenVDB Houdini:
|
||||
New Features:
|
||||
- Add convex hull activation for VDB Activate SOP (requires 19.5).
|
||||
|
||||
Improvements:
|
||||
- Improved SDF activation to use dynamic node manager.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed a bug in VDB Visualize SOP where color values that exceed
|
||||
the range wrap around instead of being clamped.
|
||||
|
||||
NanoVDB:
|
||||
New Features:
|
||||
- Added nanovdb::IndexGrid that allows for arbitrary voxel values and even
|
||||
multiple channels to be associated with NanoVDB grids. They are more
|
||||
flexible and memory efficient than regular grids at a small cost of
|
||||
random-access performance. IndexGrids are constructed with the new
|
||||
nanovdb::IndexGridBuilder and accessed with the new
|
||||
nanovdb::ChannelAccessor.
|
||||
- Added iterators to all tree node classes for visiting inactive, active, or
|
||||
all values and child nodes.
|
||||
- NanoVDB.h now includes standalone implementations of reading and writing
|
||||
uncompressed nanovdb grids buffers.
|
||||
- Added Stats::getExtrema, which computes the min/max values of all voxels
|
||||
in a NanoVDB grid that intersects with a user-defined bounding-box.
|
||||
- Added nanovdb::Mask::countOn(int) which is essential to the new
|
||||
nanovdb::IndexGrid.
|
||||
- Added RootNode::probeChild and InternalNode::probeChild.
|
||||
|
||||
Improvements:
|
||||
- Added a new much improved nanovdb::NodeManager, that is both faster and
|
||||
more memory efficient, and that works on both the CPU and GPU. Note, it
|
||||
uses a handle for allocation (just like nanovdb::Grid) and replaces the
|
||||
old nanovdb::LeafManager which is now deprecated.
|
||||
- NanoToOpenVDB is extended to work with grids templated on Fp4, Fp8, Fp16,
|
||||
FpN, bool and ValueMask.
|
||||
- Renamed RootNode::findTile to RootNode::probeTile and made it public.
|
||||
- Made Mask::getWord return both a const and non-const reference.
|
||||
- Improved unit-tests to use explicit 32B alignment (see alignment bug-fix
|
||||
below).
|
||||
- PNanoVDB.h (a C99 port of NanoVDB.h) has been updated.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed a bug in nanovdb::HostBuffer that could produce crashes due to
|
||||
misaligned CPU memory allocations.
|
||||
- Fixed bug related to uninitialized memory in nanovdb::Grid which could
|
||||
confuse CRC32 checksum validation.
|
||||
- Fixed bugs related to the use of intrinsic functions for fast bit-counting
|
||||
in nanovdb.
|
||||
- Fixed a potential security vulnerability in NanoVDB.h related to buffer
|
||||
overflow exploits.
|
||||
|
||||
Build:
|
||||
- Added OPENVDB_USE_DELAYED_LOAD flag that enables delayed loading and
|
||||
defaults to on.
|
||||
- Add a placeholder to inject the specific revision and URL used
|
||||
to build OpenVDB, useful for 3rd party build scripts to publish
|
||||
their exact versions.
|
||||
- Fixed an issue where OPENVDB_AX_DLL was not being defined on shared
|
||||
library builds of AX, resulting in symbols not being exported.
|
||||
[Reported by Ray Molenkamp]
|
||||
- Fixed an issue where setting Tbb_INCLUDE_DIR could cause CMake failures.
|
||||
- Updated FindTBB.cmake to support newer library ABI suffixing in
|
||||
TBB 2021.5.
|
||||
- Updated FindBlosc.cmake to better handle cases where blosc is built with
|
||||
external sources.
|
||||
- Resolved LLVM deprecation warnings in AX and added support for LLVM 14.
|
||||
- On Windows (MSVC), OpenVDB is now built with extra compiler options to
|
||||
ensure stricter C++ conformance: /permissive- /Zc:throwingNew /Zc:inline.
|
||||
- On Windows (MSVC), the _USE_MATH_DEFINES macro is no longer defined when
|
||||
including <openvdb/Platform.h> (or any dependent headers). If you were
|
||||
relying on this in your own project for M_PI, M_PI_2, etc. you can add
|
||||
-D_USE_MATH_DEFINES to your own project compiler options. See
|
||||
https://docs.microsoft.com/en-us/cpp/c-runtime-library/math-constants
|
||||
for more info.
|
||||
|
||||
Version 9.1.0 - June 9, 2022
|
||||
Version 9.0.1 - In development
|
||||
|
||||
Bug Fixes:
|
||||
- Minor fix to move assignment operator in nanovdb/util/HostBuffer.h.
|
||||
This could potentially be a problem on Windows debug builds (unconfirmed).
|
||||
- Minor fix to range in openvdb/tools/LevelSetSphere.h. This could result
|
||||
in data races for multi-threaded execution (unconfirmed)
|
||||
[Reported by Tommy Hinks]
|
||||
- Fixed a bug with Tree::combineExtended which wouldn't propagate the
|
||||
resulting active state when a destination tile overlapped a source child node.
|
||||
[Reported by @frapit]
|
||||
in data races for multi-threaded execution (unconfirmed) [Reported by Tommy Hinks]
|
||||
- Fixed a bug with Tree::combineExtended which wouldn't propagate the resulting active state when a destination tile overlapped a source child node. [Reported by @frapit]
|
||||
- Fix unit tests failures with Blosc versions >= 1.19.0.
|
||||
- Fixed a regression in ax::run which wouldn't propagate exceptions
|
||||
- Fixed a bug where ax::ast::parse could return a partially constructed but
|
||||
invalid AST on failure
|
||||
- Fixed AX logger exit handling in ax::Compiler::compile and ax::ast::parse
|
||||
- Fixed an issue which could result in significant compilation times when
|
||||
instantiating TypeList<>::Unique<>
|
||||
|
||||
New features:
|
||||
- Added support for AMD's HIP API in NanoVDB
|
||||
[Contributed by Blender Foundation]
|
||||
- Added bindings mechanism to AX to allow differing data and AX attribute
|
||||
names (@) in Point and Volume executables.
|
||||
- Added support for AMD's HIP API in NanoVDB [Contributed by Blender Foundation]
|
||||
- Added bindings mechanism to AX to allow differing data and AX attribute names (@) in Point and Volume executables.
|
||||
- Added support for OpenVDB AX on Windows.
|
||||
- Added tools::memUsageIfLoaded() which returns the memory consumption of
|
||||
a deserialized VDB tree, useful if delay-loading is enabled.
|
||||
- Added points::rasterizeSpheres() and points::rasterizeSmoothSpheres()
|
||||
variants, new kernels and improved performance for OpenVDB points to
|
||||
surface rasterization.
|
||||
- Added points::rasterizeTrilinear() for OpenVDB points, fast staggered
|
||||
or colocated trilinear rasterization for scalar and vector attributes.
|
||||
- Exposed TypeList declarations in openvdb.h which denote the default set
|
||||
of types supported by OpenVDB.
|
||||
- Added points::FrustumRasterizer for efficient rasterization of OpenVDB
|
||||
points to frustum volumes with optional motion blur.
|
||||
|
||||
Improvements:
|
||||
- Added a --thread [n] argument to the vdb_ax binary.
|
||||
- Added a --copy-file-metadata option to vdb_ax. This behaviour is now
|
||||
off by default.
|
||||
- Added support for multiple input files with the vdb_ax binary using -i.
|
||||
Positional arguments as input files are deprecated.
|
||||
- Added tools::minMax() which supports multithreaded evaluation of active
|
||||
minimum and maximum values. Grid::evalMinMax() has been deprecated.
|
||||
- Significant performance improvements to AX point kernels, primarily due to
|
||||
providing AX access to attribute buffers for superior code generation.
|
||||
- vdb_print now prints both the in-core memory and total memory usage for
|
||||
VDB grids.
|
||||
- Improved build support for MinGW
|
||||
[Contributed by Mehdi Chinoune]
|
||||
- Added a new foreach method to TypeList for iterating over types without
|
||||
constructing them.
|
||||
- Added TypeList::Transform declaration for transforming TypeLists into new
|
||||
types.
|
||||
- Moved Grid::apply implementation to TypeList::apply to allow for other
|
||||
polymorphic types to invoke it.
|
||||
- Minor updates to NanoVDB to remove compiler warnings.
|
||||
- Added a --copy-file-metadata option to vdb_ax. This behaviour is now off by default.
|
||||
- Added support for multiple input files with the vdb_ax binary using -i. Positional arguments as input files are deprecated.
|
||||
- Added tools::minMax() which supports multithreaded evaluation of active minimum and maximum values. Grid::evalMinMax() has been deprecated. [Contributed by Greg Hurst]
|
||||
|
||||
Build:
|
||||
- Regenerated AX grammar with Flex 2.6.4 and Bison 3.8.2.
|
||||
- Improved locating NumPy in CMake when multiple python versions are installed.
|
||||
- Fixed an issue which could report Python as missing when using CMake 3.18
|
||||
and later on some systems.
|
||||
[Reported by Sam James]
|
||||
- Changed the way boost_python and boost_numpy are located. Both components
|
||||
must match the major/minor version of python in use. This can be
|
||||
circumvented by providing Boost_PYTHON_VERSION or
|
||||
Boost_PYTHON_VERSION_MAJOR.
|
||||
- Relocated OpenVDB binaries to a new openvdb_cmd root directory.
|
||||
- FindTBB.cmake now prioritises newer TBB installations.
|
||||
- Added option to compress PDB data in MSVC debug builds.
|
||||
- Fixed an issue which could report Python as missing when using CMake 3.18 and later on some systems. [Reported by Sam James]
|
||||
|
||||
Houdini:
|
||||
- Added Attribute Bindings to AX SOP to allow differently named AX
|
||||
attributes (@) and target point attributes/volumes.
|
||||
- Fix race condition in OpenVDB Merge SOP that could cause crashes or
|
||||
merged VDBs to not be deleted.
|
||||
- VDB Activate SOP no longer stops at the first non-VDB primitive, but
|
||||
instead just skips such primitives.
|
||||
- Added VDB Rasterize Frustum SOP for efficient rasterization of OpenVDB
|
||||
points into frustum volumes with optional motion blur.
|
||||
- Added Attribute Bindings to AX SOP to allow differently named AX attributes (@) and target point attributes/volumes.
|
||||
- Fix race condition in OpenVDB Merge SOP that could cause crashes
|
||||
or merged VDBs to not be deleted.
|
||||
|
||||
|
||||
Version 9.0.0 - October 29, 2021
|
||||
@@ -1205,7 +422,7 @@ Version 8.0.0 - December 23, 2020
|
||||
providing users with a new way of interacting with OpenVDB data. AX is
|
||||
tailored towards writing highly parallelizable and customizable OpenVDB
|
||||
volume and point kernel operations. See the documentation for more:
|
||||
https://www.openvdb.org/documentation/openvdbax.html
|
||||
https://academysoftwarefoundation.github.io/openvdb/openvdbax.html
|
||||
|
||||
New features:
|
||||
- Added tools::anyActiveVoxels and tools::anyActiveTiles that check
|
||||
|
||||
+63
-131
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -18,12 +18,12 @@
|
||||
and required dependencies are expected. See the dependency documentation
|
||||
for more information:
|
||||
|
||||
https://www.openvdb.org/documentation/doxygen/dependencies.html
|
||||
https://academysoftwarefoundation.github.io/openvdb/dependencies.html
|
||||
|
||||
And the documentation on building OpenVDB for more in depth installation
|
||||
instructions:
|
||||
|
||||
https://www.openvdb.org/documentation/doxygen/build.html
|
||||
https://academysoftwarefoundation.github.io/openvdb/build.html
|
||||
|
||||
This CMakeLists file provides most available options for configuring the
|
||||
build and installation of all OpenVDB components. By default the core
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
# note: cmake_minimum_required must be called before project commands to
|
||||
# ensure policy scope is set up correctly
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
# CMP0091 allows for MSVC ABI targetting via CMAKE_MSVC_RUNTIME_LIBRARY
|
||||
# from CMake 3.15 and above. Must come before project().
|
||||
@@ -52,9 +52,9 @@ endif()
|
||||
|
||||
###### Version
|
||||
|
||||
set(OpenVDB_MAJOR_VERSION 12)
|
||||
set(OpenVDB_MINOR_VERSION 1)
|
||||
set(OpenVDB_PATCH_VERSION 2)
|
||||
set(OpenVDB_MAJOR_VERSION 9)
|
||||
set(OpenVDB_MINOR_VERSION 0)
|
||||
set(OpenVDB_PATCH_VERSION 1)
|
||||
set(OpenVDB_VERSION "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}")
|
||||
|
||||
project(OpenVDB LANGUAGES CXX VERSION ${OpenVDB_VERSION})
|
||||
@@ -64,7 +64,7 @@ project(OpenVDB LANGUAGES CXX VERSION ${OpenVDB_VERSION})
|
||||
include(CMakeDependentOption)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# Components
|
||||
# todo epydoc and pdflatex
|
||||
option(OPENVDB_BUILD_CORE "Enable the core OpenVDB library. Both static and shared versions are enabled by default" ON)
|
||||
option(OPENVDB_BUILD_BINARIES "Enable the vdb binaries. Only vdb_print is enabled by default" ON)
|
||||
option(OPENVDB_BUILD_PYTHON_MODULE "Build the pyopenvdb Python module" OFF)
|
||||
@@ -72,38 +72,24 @@ option(OPENVDB_BUILD_UNITTESTS "Build the OpenVDB unit tests" OFF)
|
||||
option(OPENVDB_BUILD_DOCS "Build the OpenVDB documentation" OFF)
|
||||
option(OPENVDB_BUILD_HOUDINI_PLUGIN "Build the Houdini plugin" OFF)
|
||||
option(OPENVDB_BUILD_HOUDINI_ABITESTS "Build the Houdini ABI tests" OFF)
|
||||
option(OPENVDB_BUILD_MAYA_PLUGIN "Build the Maya plugin" OFF)
|
||||
|
||||
option(OPENVDB_BUILD_AX "Build the OpenVDB AX library. Turns ON if USE_AX is ON." ${USE_AX})
|
||||
option(OPENVDB_BUILD_AX_UNITTESTS "Build the OpenVDB AX unit tests" OFF)
|
||||
|
||||
option(OPENVDB_BUILD_NANOVDB "Build the NanoVDB library. Turns ON if USE_NANOVDB is ON." ${USE_NANOVDB})
|
||||
|
||||
# Global options
|
||||
option(OPENVDB_BUILD_MAYA_PLUGIN "Build the Maya plugin" OFF)
|
||||
option(OPENVDB_ENABLE_RPATH "Build with RPATH information" ON)
|
||||
option(OPENVDB_ENABLE_ASSERTS "Build with asserts in OpenVDB code enabled" OFF)
|
||||
option(OPENVDB_USE_DELAYED_LOADING "Build the core OpenVDB library with delayed-loading." ON)
|
||||
option(OPENVDB_CXX_STRICT "Enable or disable pre-defined compiler warnings" OFF)
|
||||
|
||||
cmake_dependent_option(OPENVDB_INSTALL_CMAKE_MODULES
|
||||
"Install the provided OpenVDB CMake modules when building the core library"
|
||||
ON "OPENVDB_BUILD_CORE" OFF)
|
||||
option(USE_CCACHE "Build using Ccache if found on the path" ON)
|
||||
# Disable this on Windows due to linker OOM issues:
|
||||
# LNK1248: image size (XXX) exceeds maximum allowable size (FFFFFFFF)
|
||||
# https://github.com/AcademySoftwareFoundation/openvdb/issues/1718
|
||||
# https://github.com/AcademySoftwareFoundation/openvdb/issues/1624
|
||||
cmake_dependent_option(USE_EXPLICIT_INSTANTIATION "Use explicit instantiation for all supported classes
|
||||
and methods against a pre-defined list of OpenVDB trees. This makes the core library larger and slower
|
||||
to compile, but speeds up the compilation of all dependent code by bypassing the expensive template
|
||||
instantation." ON "NOT WIN32" OFF)
|
||||
option(OPENVDB_FUTURE_DEPRECATION "Generate messages for upcoming deprecation" ON)
|
||||
option(OPENVDB_ENABLE_UNINSTALL "Adds a CMake uninstall target." ON)
|
||||
option(USE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." OFF)
|
||||
|
||||
# Component dependency options
|
||||
cmake_dependent_option(USE_PKGCONFIG "Use pkg-config to search for dependent libraries." ON "NOT WIN32" OFF)
|
||||
option(USE_HOUDINI [=[
|
||||
Build the library against a Houdini installation. Turns on automatically if OPENVDB_BUILD_HOUDINI_PLUGIN is enabled.
|
||||
When enabled, you do not need to provide dependency locations for TBB, Blosc, Imath and OpenEXR. Boost must be
|
||||
provided. Imath/OpenEXR can optionally be provided.]=] OFF)
|
||||
When enabled, you do not need to provide dependency locations for TBB, Blosc, IlmBase and OpenEXR. Boost must be
|
||||
provided. IlmBase/OpenEXR can optionally be provided if Houdini Version >= 17.5.]=] OFF)
|
||||
option(USE_MAYA [=[
|
||||
Build the library against a Maya installation. Turns on automatically if OPENVDB_BUILD_MAYA_PLUGIN is enabled.
|
||||
When enabled, you do not need to provide dependency locations for TBB. All other dependencies must be provided.]=] OFF)
|
||||
@@ -134,6 +120,7 @@ option(USE_NANOVDB "Use NanoVDB while building openvdb components." ${OPENVDB_BU
|
||||
|
||||
cmake_dependent_option(OPENVDB_DISABLE_BOOST_IMPLICIT_LINKING
|
||||
"Disable the implicit linking of Boost libraries on Windows" ON "WIN32" OFF)
|
||||
option(USE_CCACHE "Build using Ccache if found on the path" ON)
|
||||
option(USE_STATIC_DEPENDENCIES [=[
|
||||
Only search for and use static libraries. If OFF the shared versions of requried libraries are prioritised, falling
|
||||
back to static libraries. Forcing individual static dependencies can be enabled by setting XXX_USE_STATIC_LIBS
|
||||
@@ -147,6 +134,17 @@ Disable CMakes default system search paths when locating dependencies. When enab
|
||||
its default system search routine if it cannot find a dependency with the provided settings. When disabled, only
|
||||
paths provided through the Xxx_ROOT, supported XXX_INCLUDEDIR/XXX_LIBRARYDIR variables or the SYSTEM_LIBRARY_PATHS
|
||||
list will be searched.]=] OFF)
|
||||
option(OPENVDB_USE_DEPRECATED_ABI_7 "Bypass minimum ABI requirement checks" OFF)
|
||||
option(OPENVDB_USE_DEPRECATED_ABI_8 "Bypass minimum ABI requirement checks" OFF)
|
||||
option(OPENVDB_USE_FUTURE_ABI_10 "Bypass future ABI check" OFF)
|
||||
option(OPENVDB_FUTURE_DEPRECATION "Generate messages for upcoming deprecation" ON)
|
||||
option(OPENVDB_ENABLE_UNINSTALL "Adds a CMake uninstall target." ON)
|
||||
option(USE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." OFF)
|
||||
cmake_dependent_option(USE_PKGCONFIG "Use pkg-config to search for dependent libraries." ON "NOT WIN32" OFF)
|
||||
|
||||
option(USE_EXPLICIT_INSTANTIATION "Use explicit instantiation for all supported classes and methods against a
|
||||
pre-defined list of OpenVDB trees. This makes the core library larger and slower to compile, but speeds up
|
||||
the compilation of all dependent code by bypassing the expensive template instantation." ON)
|
||||
|
||||
set(SYSTEM_LIBRARY_PATHS "" CACHE STRING [=[
|
||||
A global list of library paths to additionally use into when searching for dependencies.]=])
|
||||
@@ -154,7 +152,6 @@ set(MSVC_MP_THREAD_COUNT "" CACHE STRING [=[
|
||||
The number of threads to use when invoking MSVC builds with cmake --build. CMake defaults to 1. Note that
|
||||
cmake --parallel and CMAKE_BUILD_PARALLEL_LEVEL only change the number of PROJECTS that are built in parallel,
|
||||
NOT the number of TU's ]=])
|
||||
option(MSVC_COMPRESS_PDB "Whether to attempt to compress PDB symbol data in MSVC debug builds." OFF)
|
||||
|
||||
set(_CONCURRENT_MALLOC_OPTIONS None Auto Jemalloc Tbbmalloc)
|
||||
if(NOT CONCURRENT_MALLOC)
|
||||
@@ -249,9 +246,11 @@ mark_as_advanced(
|
||||
OPENVDB_BUILD_HOUDINI_ABITESTS
|
||||
OPENVDB_CXX_STRICT
|
||||
OPENVDB_ENABLE_RPATH
|
||||
OPENVDB_USE_DELAYED_LOADING
|
||||
OPENVDB_FUTURE_DEPRECATION
|
||||
OPENVDB_SIMD
|
||||
OPENVDB_USE_DEPRECATED_ABI_7
|
||||
OPENVDB_USE_DEPRECATED_ABI_8
|
||||
OPENVDB_USE_FUTURE_ABI_10
|
||||
SYSTEM_LIBRARY_PATHS
|
||||
USE_CCACHE
|
||||
USE_COLORED_OUTPUT
|
||||
@@ -259,7 +258,6 @@ mark_as_advanced(
|
||||
USE_IMATH_HALF
|
||||
USE_LOG4CPLUS
|
||||
USE_MAYA
|
||||
MSVC_COMPRESS_PDB
|
||||
)
|
||||
|
||||
#########################################################################
|
||||
@@ -268,20 +266,6 @@ mark_as_advanced(
|
||||
|
||||
include(cmake/config/OpenVDBVersions.cmake)
|
||||
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_CMAKE_VERSION)
|
||||
if(CMAKE_VERSION VERSION_LESS ${FUTURE_MINIMUM_CMAKE_VERSION})
|
||||
message(DEPRECATION "Support for CMake versions < ${FUTURE_MINIMUM_CMAKE_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
foreach(DEPRECATED_ABI ${OPENVDB_DEPRECATED_ABI_LIST})
|
||||
option(OPENVDB_USE_DEPRECATED_ABI_${DEPRECATED_ABI} "Bypass minimum ABI requirement checks" OFF)
|
||||
mark_as_advanced(OPENVDB_USE_DEPRECATED_ABI_${DEPRECATED_ABI})
|
||||
endforeach()
|
||||
option(OPENVDB_USE_FUTURE_ABI_${FUTURE_OPENVDB_ABI_VERSION} "Bypass future ABI check" OFF)
|
||||
mark_as_advanced(OPENVDB_USE_FUTURE_ABI_${FUTURE_OPENVDB_ABI_VERSION})
|
||||
|
||||
#########################################################################
|
||||
|
||||
enable_testing()
|
||||
@@ -291,35 +275,13 @@ enable_testing()
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
||||
|
||||
# Add cmake modules to installation command
|
||||
|
||||
if(SKBUILD)
|
||||
set(OPENVDB_INSTALL_BINDIR openvdb/${CMAKE_INSTALL_BINDIR})
|
||||
set(OPENVDB_INSTALL_LIBDIR openvdb/${CMAKE_INSTALL_LIBDIR})
|
||||
set(OPENVDB_INSTALL_INCLUDEDIR openvdb/${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
if(OPENVDB_BUILD_NANOVDB)
|
||||
set(NANOVDB_INSTALL_BINDIR nanovdb/${CMAKE_INSTALL_BINDIR})
|
||||
set(NANOVDB_INSTALL_LIBDIR nanovdb/${CMAKE_INSTALL_LIBDIR})
|
||||
set(NANOVDB_INSTALL_INCLUDEDIR nanovdb/${CMAKE_INSTALL_INCLUDEDIR})
|
||||
set(NANOVDB_INSTALL_DOCDIR nanovdb/${CMAKE_INSTALL_DOCDIR})
|
||||
endif()
|
||||
else()
|
||||
set(OPENVDB_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
|
||||
set(OPENVDB_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
||||
set(OPENVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
if(OPENVDB_BUILD_NANOVDB)
|
||||
set(NANOVDB_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
|
||||
set(NANOVDB_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
||||
set(NANOVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
set(NANOVDB_INSTALL_DOCDIR ${CMAKE_INSTALL_DOCDIR})
|
||||
endif()
|
||||
endif()
|
||||
# @todo fix our glew cmake module
|
||||
|
||||
if(OPENVDB_INSTALL_CMAKE_MODULES)
|
||||
set(OPENVDB_CMAKE_MODULES
|
||||
cmake/FindBlosc.cmake
|
||||
cmake/FindJemalloc.cmake
|
||||
cmake/FindIlmBase.cmake
|
||||
cmake/FindLog4cplus.cmake
|
||||
cmake/FindOpenEXR.cmake
|
||||
cmake/FindOpenVDB.cmake
|
||||
@@ -329,7 +291,7 @@ if(OPENVDB_INSTALL_CMAKE_MODULES)
|
||||
cmake/OpenVDBMayaSetup.cmake
|
||||
cmake/OpenVDBUtils.cmake
|
||||
)
|
||||
install(FILES ${OPENVDB_CMAKE_MODULES} DESTINATION ${OPENVDB_INSTALL_LIBDIR}/cmake/OpenVDB)
|
||||
install(FILES ${OPENVDB_CMAKE_MODULES} DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenVDB)
|
||||
endif()
|
||||
|
||||
# Configure component dependencies by loading the Houdini/Maya setup
|
||||
@@ -378,7 +340,8 @@ endif()
|
||||
if(USE_CCACHE)
|
||||
find_program(CCACHE_PATH ccache)
|
||||
if(CCACHE_PATH)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PATH})
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
message(STATUS "Using ccache: ${CCACHE_PATH}")
|
||||
endif()
|
||||
endif()
|
||||
@@ -391,32 +354,39 @@ include(cmake/config/OpenVDBCXX.cmake)
|
||||
|
||||
#########################################################################
|
||||
|
||||
# Configure malloc library. Use Jemalloc if available, tbbmalloc otherwise
|
||||
# Configure malloc library. Use Jemalloc for Linux and non-Maya, otherwise Tbbmalloc.
|
||||
# * On Mac OSX, linking against Jemalloc < 4.3.0 seg-faults with this error:
|
||||
# malloc: *** malloc_zone_unregister() failed for 0xaddress
|
||||
# Houdini 17.5 and older ships with Jemalloc 3.6.0, so we make Tbbmalloc the default
|
||||
# on Mac OSX (https://github.com/jemalloc/jemalloc/issues/420). Later versions of
|
||||
# Jemalloc are thought to work, but haven't been tested.
|
||||
# * On Windows, we follow SideFX's example in using Tbbmalloc due to the challenges
|
||||
# of injecting into the Windows runtime to replace the system allocator.
|
||||
|
||||
if(CONCURRENT_MALLOC STREQUAL "Auto")
|
||||
find_package(Jemalloc QUIET)
|
||||
if(NOT TARGET Jemalloc::jemalloc)
|
||||
message(WARNING "Unable to find Jemalloc, attempting to fall back to TBB malloc.
|
||||
It is recommended to use Jemalloc for optimum performance.")
|
||||
if((OPENVDB_BUILD_BINARIES OR OPENVDB_BUILD_UNITTESTS) AND CONCURRENT_MALLOC STREQUAL "Auto")
|
||||
if(WIN32 OR APPLE OR USE_MAYA)
|
||||
set(CONCURRENT_MALLOC "Tbbmalloc")
|
||||
else()
|
||||
set(CONCURRENT_MALLOC "Jemalloc")
|
||||
find_package(Jemalloc QUIET)
|
||||
if(NOT TARGET Jemalloc::jemalloc)
|
||||
message(WARNING "Unable to find Jemalloc, attempting to fall back to TBB malloc.
|
||||
It is recommended to use Jemalloc for optimum performance.")
|
||||
set(CONCURRENT_MALLOC "Tbbmalloc")
|
||||
else()
|
||||
set(CONCURRENT_MALLOC "Jemalloc")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Configure SIMD. AVX implies SSE 4.2.
|
||||
|
||||
if(OPENVDB_SIMD STREQUAL "AVX")
|
||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx>")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
|
||||
endif()
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx>")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
|
||||
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_AVX>")
|
||||
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_SSE42>")
|
||||
elseif(OPENVDB_SIMD STREQUAL "SSE42")
|
||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
|
||||
endif()
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
|
||||
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_SSE42>")
|
||||
endif()
|
||||
|
||||
@@ -427,6 +397,7 @@ endif()
|
||||
if(USE_STATIC_DEPENDENCIES)
|
||||
set(BLOSC_USE_STATIC_LIBS ON)
|
||||
set(OPENEXR_USE_STATIC_LIBS ON)
|
||||
set(ILMBASE_USE_STATIC_LIBS ON)
|
||||
set(TBB_USE_STATIC_LIBS ON)
|
||||
set(LOG4CPLUS_USE_STATIC_LIBS ON)
|
||||
set(JEMALLOC_USE_STATIC_LIBS ON)
|
||||
@@ -482,44 +453,6 @@ if(NOT OPENVDB_BUILD_NANOVDB AND
|
||||
find_package(OpenVDB REQUIRED COMPONENTS nanovdb)
|
||||
endif()
|
||||
|
||||
# Locate Python and nanobind if necessary
|
||||
if(OPENVDB_BUILD_PYTHON_MODULE OR (OPENVDB_BUILD_NANOVDB AND NANOVDB_BUILD_PYTHON_MODULE))
|
||||
|
||||
find_package(Python ${MINIMUM_PYTHON_VERSION} REQUIRED COMPONENTS Development Interpreter)
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_PYTHON_VERSION)
|
||||
if(Python_VERSION VERSION_LESS ${FUTURE_MINIMUM_PYTHON_VERSION})
|
||||
message(DEPRECATION "Support for Python versions < ${FUTURE_MINIMUM_GLFW_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(nanobind REQUIRED CONFIG)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(nanobind
|
||||
FOUND_VAR nanobind_FOUND
|
||||
REQUIRED_VARS NB_DIR
|
||||
VERSION_VAR nanobind_VERSION)
|
||||
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_NANOBIND_VERSION)
|
||||
if(nanobind_VERSION VERSION_LESS ${FUTURE_MINIMUM_NANOBIND_VERSION})
|
||||
message(DEPRECATION "Support for nanobind versions < ${FUTURE_MINIMUM_NANOBIND_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED VDB_PYTHON_INSTALL_DIRECTORY)
|
||||
if(DEFINED Python_SITELIB)
|
||||
get_filename_component(Python_PACKAGES_DIR ${Python_SITELIB} NAME)
|
||||
else()
|
||||
set(Python_PACKAGES_DIR "site-packages")
|
||||
endif()
|
||||
set(VDB_PYTHON_INSTALL_DIRECTORY
|
||||
${CMAKE_INSTALL_LIBDIR}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/${Python_PACKAGES_DIR}
|
||||
CACHE STRING "The directory to install the openvdb and nanovdb Python modules."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
# Validate the OpenVDB ABI Version. If OpenVDB_ABI is not set, we're either building
|
||||
# the core library OR the ABI hasn't been deduced from a VDB installation. Use the
|
||||
@@ -550,14 +483,14 @@ if(OpenVDB_ABI LESS MINIMUM_OPENVDB_ABI_VERSION)
|
||||
"no longer supported.")
|
||||
endif()
|
||||
|
||||
if(OpenVDB_ABI IN_LIST OPENVDB_DEPRECATED_ABI_LIST)
|
||||
if(FUTURE_MINIMUM_OPENVDB_ABI_VERSION AND OpenVDB_ABI LESS FUTURE_MINIMUM_OPENVDB_ABI_VERSION)
|
||||
if(NOT OPENVDB_USE_DEPRECATED_ABI_${OpenVDB_ABI})
|
||||
message(FATAL_ERROR "OpenVDB ABI versions earlier than ${OpenVDB_MAJOR_VERSION} "
|
||||
message(FATAL_ERROR "OpenVDB ABI versions earlier than ${FUTURE_MINIMUM_OPENVDB_ABI_VERSION} "
|
||||
"are deprecated. Set CMake option OPENVDB_USE_DEPRECATED_ABI_${OpenVDB_ABI} to ON to "
|
||||
"suppress this error.")
|
||||
endif()
|
||||
|
||||
message(DEPRECATION "OpenVDB ABI versions earlier than ${OpenVDB_MAJOR_VERSION} "
|
||||
message(DEPRECATION "OpenVDB ABI versions earlier than ${FUTURE_MINIMUM_OPENVDB_ABI_VERSION} "
|
||||
"are deprecated and will soon be removed.")
|
||||
# global target definition
|
||||
add_definitions(-DOPENVDB_USE_DEPRECATED_ABI_${OpenVDB_ABI})
|
||||
@@ -594,6 +527,10 @@ if(OPENVDB_BUILD_AX)
|
||||
add_subdirectory(openvdb_ax/openvdb_ax)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_BUILD_AX_UNITTESTS)
|
||||
add_subdirectory(openvdb_ax/openvdb_ax/test)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_BUILD_PYTHON_MODULE)
|
||||
add_subdirectory(openvdb/openvdb/python)
|
||||
endif()
|
||||
@@ -606,11 +543,6 @@ if(OPENVDB_BUILD_UNITTESTS)
|
||||
add_subdirectory(openvdb/openvdb/unittest)
|
||||
endif()
|
||||
|
||||
# Tests the vdb_ax binary so needs to come after openvdb_cmd
|
||||
if(OPENVDB_BUILD_AX_UNITTESTS)
|
||||
add_subdirectory(openvdb_ax/openvdb_ax/test)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_BUILD_HOUDINI_PLUGIN)
|
||||
add_subdirectory(openvdb_houdini/openvdb_houdini)
|
||||
endif()
|
||||
|
||||
+17
-20
@@ -10,7 +10,7 @@ The contributor role is the starting role for anyone participating in the projec
|
||||
|
||||
### Process for becoming a contributor
|
||||
|
||||
* Review the [coding standards](https://www.openvdb.org/documentation/doxygen/codingStyle.html) to ensure your contribution is in line with the project's coding and styling guidelines.
|
||||
* Review the [coding standards](https://academysoftwarefoundation.github.io/openvdb/codingStyle.html) to ensure your contribution is in line with the project's coding and styling guidelines.
|
||||
* Have a signed CLA on file ( see [below](#contributor-license-agreements) )
|
||||
* Submit your code as a PR with the appropriate [DCO sign-off](#commit-sign-off).
|
||||
* Have your submission approved by the [committer(s)](#committer) and merged into the codebase.
|
||||
@@ -22,7 +22,7 @@ open source software best practice policies of the Linux Foundation.
|
||||
|
||||
#### License
|
||||
|
||||
OpenVDB is licensed under the [Apache License, version 2.0](LICENSE.md)
|
||||
OpenVDB is licensed under the [Mozilla Public License, version 2.0](LICENSE.md)
|
||||
license. Contributions to OpenVDB should abide by that standard
|
||||
license.
|
||||
|
||||
@@ -54,23 +54,21 @@ Every commit must be signed off. That is, every commit log message
|
||||
must include a “`Signed-off-by`” line (generated, for example, with
|
||||
“`git commit --signoff`”), indicating that the committer wrote the
|
||||
code and has the right to release it under the
|
||||
[Apache License, version 2.0](LICENSE.md)
|
||||
[Mozilla Public License, version 2.0](LICENSE.md)
|
||||
license. See the [TAC documentation on contribution sign off](https://github.com/AcademySoftwareFoundation/tac/blob/master/process/contributing.md#contribution-sign-off) for more information on this requirement.
|
||||
|
||||
## Maintainer
|
||||
## Committer
|
||||
|
||||
The maintainer role is the equivalent of the "Committer" role in the charter.
|
||||
The committer role enables the participant to commit code directly to the repository, but also comes with the obligation to be a responsible leader in the community.
|
||||
|
||||
This role enables the participant to commit code directly to the repository, but also comes with the obligation to be a responsible leader in the community.
|
||||
|
||||
### Process for becoming a maintainer
|
||||
### Process for becoming a committer
|
||||
|
||||
* Show your experience with the codebase through contributions and engagement on the community channels.
|
||||
* Request to become a maintainer.
|
||||
* Have the majority of maintainers approve you becoming a maintainer.
|
||||
* Request to become a committer.
|
||||
* Have the majority of committers approve you becoming a committer.
|
||||
* Your name and email is added to the MAINTAINERS.md file for the project.
|
||||
|
||||
### Maintainer responsibilities
|
||||
### Committer responsibilities
|
||||
|
||||
* Monitor email aliases.
|
||||
* Monitor Slack (delayed response is perfectly acceptable).
|
||||
@@ -78,29 +76,28 @@ This role enables the participant to commit code directly to the repository, but
|
||||
* Make sure that ongoing PRs are moving forward at the right pace or close them.
|
||||
* Remain an active contributor to the project in general and the code base in particular.
|
||||
|
||||
### When does a maintainer lose maintainer status?
|
||||
### When does a committer lose committer status?
|
||||
|
||||
If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they
|
||||
If a committer is no longer interested or cannot perform the committer duties listed above, they
|
||||
should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of
|
||||
the maintainers per the voting process below.
|
||||
the committers per the voting process below.
|
||||
|
||||
## Technical Steering Committee (TSC) member
|
||||
|
||||
The Technical Steering Committee (TSC) oversees the overall technical direction of OpenVDB, as defined in the [charter](charter.md).
|
||||
|
||||
TSC voting members consist of maintainers that have been nominated by the TSC, with a supermajority of voting members required to have a maintainer elected to be a TSC voting member. TSC voting members term and succession is defined in the [charter](charter.md).
|
||||
TSC voting members consist of committers that have been nominated by the committers, with a supermajority of voting members required to have a committer elected to be a TSC voting member. TSC voting members term and succession is defined in the [charter](charter.md).
|
||||
|
||||
All meetings of the TSC are open to participation by any member of the OpenVDB community. Meeting times are listed in the [ASWF technical community calendar](https://lists.aswf.io/g/tac/calendar).
|
||||
|
||||
## Current TSC members
|
||||
|
||||
* Ken Museth (Chair), Nvidia
|
||||
* Andre Pradhana, Nvidia
|
||||
* Ken Museth, Chair / NVIDIA
|
||||
* Andre Pradhana, DreamWorks
|
||||
* Jeff Lait, SideFX
|
||||
* Nick Avramoussis, WETA FX
|
||||
* Nick Avramoussis, WETA
|
||||
* Dan Bailey, ILM
|
||||
* Richard Jones, ILM
|
||||
* Gregory Hurst, United Therapeutics
|
||||
* Richard Jones, DNEG
|
||||
|
||||
# Release Process
|
||||
|
||||
|
||||
@@ -1,176 +1,373 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1. Definitions.
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
2.1. Grants
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
2.2. Effective Date
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
|
||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||
---------------------------------------------------------
|
||||
|
||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
defined by the Mozilla Public License, v. 2.0.
|
||||
|
||||
+2
-4
@@ -12,7 +12,5 @@ The current OpenVDB maintainers are:
|
||||
| Dan Bailey | danbailey@ilm.com
|
||||
| Nick Avramoussis | navramoussis@wetafx.co.nz
|
||||
| Ken Museth | ken.museth@gmail.com
|
||||
| Andre Pradhana | andre.pradhana@gmail.com
|
||||
| Richard Jones | richardj@ilm.com
|
||||
| Gregory Hurst | tbd
|
||||
| Jonathan Swartz | tbd
|
||||
| Andre Pradhana | andre.pradhana@dreamworks.com
|
||||
| Richard Jones | rhj@dneg.com
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
The following copyright holders agree that all of their contributions
|
||||
originally submitted to this project under the Mozilla Public License
|
||||
Version 2.0, are hereby relicensed to the Apache License, Version 2.0,
|
||||
and are submitted pursuant to the Developer Certificate of Origin, version 1.1:
|
||||
|
||||
Ken Museth
|
||||
Mehdi Chinoune
|
||||
DreamWorks Animation
|
||||
Side Effects Software Inc.
|
||||
Blender Foundation
|
||||
NVIDIA Corporation
|
||||
United Therapeutics Corporation
|
||||
Digital Domain 3.0, Inc.
|
||||
Double Negative
|
||||
Ubisoft Entertainment SA
|
||||
Adobe Inc.
|
||||
Mathieu Malaterre
|
||||
Brecht Sanders
|
||||
Ignacio Vizzo
|
||||
Ben FrantzDale
|
||||
Sebastian Gaida
|
||||
Alessio Quaglino
|
||||
Benedikt Mersch
|
||||
David Aguilar
|
||||
Brian Sharpe
|
||||
Kartik Shrivastava
|
||||
Michael Lackner
|
||||
Lucas Baraya
|
||||
Kuba Roth
|
||||
Tom Cnops
|
||||
Walt Disney Pictures (Walt Disney Animation Studios)
|
||||
The Linux Foundation
|
||||
Industrial Light & Magic (ILM)
|
||||
@@ -1,76 +1,50 @@
|
||||

|
||||

|
||||
|
||||
| OpenVDB | AX | Nano | Houdini | License | CII |
|
||||
| :----: | :----: | :----: | :----: | :-----: | :-: |
|
||||
| [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/build.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/ax.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/nanovdb.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/houdini.yml) | [](LICENSE) | [](https://bestpractices.coreinfrastructure.org/projects/2774) |
|
||||
[](LICENSE)
|
||||
[](https://bestpractices.coreinfrastructure.org/projects/2774)
|
||||
[](https://slack.aswf.io/)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
| OpenVDB | AX | Nano | Houdini |
|
||||
| :----: | :----: | :----: | :----: |
|
||||
| [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/build.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/ax.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/nanovdb.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/houdini.yml) |
|
||||
|
||||
[Website](https://www.openvdb.org) |
|
||||
[Discussion Forum](https://github.com/AcademySoftwareFoundation/openvdb/discussions) |
|
||||
[Documentation](https://www.openvdb.org/documentation/doxygen) |
|
||||
[Releases](https://github.com/AcademySoftwareFoundation/openvdb/releases) |
|
||||
[License](https://www.apache.org/licenses/LICENSE-2.0) |
|
||||
[Slack](https://slack.aswf.io/)
|
||||
[Documentation](https://academysoftwarefoundation.github.io/openvdb)
|
||||
|
||||
OpenVDB is an open source C++ library comprising a novel hierarchical data structure and a large suite of tools for the efficient storage and manipulation of sparse volumetric data discretized on three-dimensional grids. It was developed by DreamWorks Animation for use in volumetric applications typically encountered in feature film production.
|
||||
|
||||
OpenVDB is an open source C++ library comprising a novel hierarchical data
|
||||
structure and a large suite of tools for the efficient storage and manipulation
|
||||
of sparse volumetric data discretized on three-dimensional grids. It was
|
||||
developed by DreamWorks Animation for use in volumetric applications typically
|
||||
encountered in feature film production.
|
||||
|
||||
### Development Repository
|
||||
|
||||
This GitHub repository hosts the trunk of the OpenVDB development. This implies
|
||||
that it is the newest public version with the latest features and bug fixes.
|
||||
However, it also means that it has not undergone a lot of testing and is
|
||||
generally less stable than the [production releases](https://github.com/AcademySoftwareFoundation/openvdb/releases).
|
||||
This GitHub repository hosts the trunk of the OpenVDB development. This implies that it is the newest public version with the latest features and bug fixes. However, it also means that it has not undergone a lot of testing and is generally less stable than the [production releases](https://github.com/AcademySoftwareFoundation/openvdb/releases).
|
||||
|
||||
|
||||
### License
|
||||
|
||||
OpenVDB is released under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0),
|
||||
which is a free, open source software license developed and maintained by the
|
||||
Apache Software Foundation.
|
||||
OpenVDB is released under the [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/), which is a free, open source software license developed and maintained by the Mozilla Foundation.
|
||||
|
||||
The trademarks of any contributor to this project may not be used in
|
||||
association with the project without the contributor's express permission.
|
||||
|
||||
NOTE: OpenVDB has completed re-licensing from [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/) to [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). Please see the file RE-LICENSE_NOTE.txt for more details.
|
||||
The trademarks of any contributor to this project may not be used in association with the project without the contributor's express permission.
|
||||
|
||||
### Contributing
|
||||
|
||||
OpenVDB welcomes contributions to the OpenVDB project. Please refer to the
|
||||
[contribution guidelines](CONTRIBUTING.md) for details on how to make a
|
||||
contribution.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
OpenVDB welcomes contributions to the OpenVDB project. Please refer to the [contribution guidelines](CONTRIBUTING.md) for details on how to make a contribution.
|
||||
|
||||
### Developer Quick Start
|
||||
|
||||
The following provides basic installation examples for the core OpenVDB library.
|
||||
Other components, such as the python module, OpenVDB AX, NanoVDB and various
|
||||
executables, may require additional dependencies. See the
|
||||
[build documentation](https://www.openvdb.org/documentation/doxygen/build.html)
|
||||
for help with installations.
|
||||
The following provides basic installation examples for the core OpenVDB library. Other components, such as the python module, OpenVDB AX, NanoVDB and various executables, may require additional dependencies. See the [build documentation](https://academysoftwarefoundation.github.io/openvdb/build.html) for help with installations.
|
||||
|
||||
##### Linux/MacOS
|
||||
#### Linux
|
||||
##### Installing Dependencies (Boost, TBB, Blosc)
|
||||
|
||||
```bash
|
||||
# Linux
|
||||
# @note If your distribution does not have required versions, consider using
|
||||
# apt pinning. See the dependency documentation for more details.
|
||||
apt-get install -y libboost-iostreams-dev
|
||||
apt-get install -y libtbb-dev
|
||||
apt-get install -y libblosc-dev
|
||||
|
||||
# MacOS
|
||||
# @note We are using homebrew in this example to install requried dependencies
|
||||
# https://brew.sh/
|
||||
brew install boost
|
||||
brew install tbb
|
||||
brew install c-blosc
|
||||
```
|
||||
|
||||
##### Building OpenVDB
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
@@ -79,16 +53,30 @@ cd build
|
||||
cmake ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
##### Windows
|
||||
#### macOS
|
||||
##### Installing Dependencies (Boost, TBB, Blosc)
|
||||
```bash
|
||||
brew install boost
|
||||
brew install tbb
|
||||
brew install c-blosc
|
||||
```
|
||||
##### Building OpenVDB
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make -j4 && make install
|
||||
```
|
||||
#### Windows
|
||||
##### Installing Dependencies (Boost, TBB, Blosc)
|
||||
|
||||
Note that the following commands have only been tested for 64bit systems/libraries.
|
||||
It is recommended to set the `VCPKG_DEFAULT_TRIPLET` environment variable to
|
||||
`x64-windows` to use 64-bit libraries by default. You will also require
|
||||
[Visual Studio](https://visualstudio.microsoft.com/downloads/) (for the MSVC C++
|
||||
runtime and compiler toolchains), [CMake](https://cmake.org/download/) and optionally
|
||||
[vcpkg](https://github.com/microsoft/vcpkg) for the installation of OpenVDB's
|
||||
dependencies.
|
||||
[Git](https://git-scm.com/downloads), [vcpkg](https://github.com/microsoft/vcpkg)
|
||||
and [CMake](https://cmake.org/download/) to be installed.
|
||||
|
||||
```bash
|
||||
vcpkg install zlib:x64-windows
|
||||
@@ -97,9 +85,10 @@ vcpkg install tbb:x64-windows
|
||||
vcpkg install boost-iostreams:x64-windows
|
||||
vcpkg install boost-any:x64-windows
|
||||
vcpkg install boost-algorithm:x64-windows
|
||||
vcpkg install boost-uuid:x64-windows
|
||||
vcpkg install boost-interprocess:x64-windows
|
||||
```
|
||||
|
||||
##### Building OpenVDB
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
@@ -109,19 +98,42 @@ cmake -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_VCPKG>\scripts\buildsystems\vcpkg.cmake -D
|
||||
cmake --build . --parallel 4 --config Release --target install
|
||||
```
|
||||
|
||||
#### Building OpenVDB AX and NanoVDB
|
||||
#### Building OpenVDB AX
|
||||
|
||||
OpenVDB AX depends on the core OpenVDB library. NanoVDB can be built with and
|
||||
without OpenVDB support. Note that NanoVDB has its own build instructions, see
|
||||
the [NanoVDB build documentation](https://www.openvdb.org/documentation/doxygen/NanoVDB_HowToBuild.html)
|
||||
for details.
|
||||
OpenVDB AX depends on the core OpenVDB library. See the [build documentation](https://academysoftwarefoundation.github.io/openvdb/build.html) for all available AX component options:
|
||||
|
||||
The following variables can be passed to the `cmake` configure command. There
|
||||
are more optional VDB components, see the [build documentation](https://www.openvdb.org/documentation/doxygen/build.html)
|
||||
for a complete list.
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DOPENVDB_BUILD_AX=ON ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
| Option | Details |
|
||||
| :---- | :----- |
|
||||
| `-D OPENVDB_BUILD_AX=ON` | to enable OpenVDB AX |
|
||||
| `-D OPENVDB_BUILD_NANOVDB=ON` | to enable NanoVDB |
|
||||
| `-D NANOVDB_USE_OPENVDB=ON` | to use OpenVDB in NanoVDB |
|
||||
#### Building NanoVDB
|
||||
|
||||
NanoVDB can be built with and without OpenVDB support. To see full build instructions
|
||||
see the [NanoVDB build documentation](https://academysoftwarefoundation.github.io/openvdb/NanoVDB_HowToBuild.html)
|
||||
|
||||
#### Building Without OpenVDB Support
|
||||
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb/nanovdb/nanovdb # Build from the subdirectory
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
#### Building With OpenVDB Support
|
||||
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DOPENVDB_BUILD_NANOVDB=ON ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
+12
-48
@@ -1,11 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -e
|
||||
|
||||
CI_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
||||
|
||||
# print versions
|
||||
bash --version
|
||||
if [ ! -z "$CXX" ]; then $CXX -v; fi
|
||||
@@ -31,33 +27,16 @@ declare -A PARMS
|
||||
PARMS[--components]=core,bin
|
||||
PARMS[--target]=install
|
||||
PARMS[--build-dir]=build
|
||||
|
||||
if [[ $RUNNER_NAME == *"8c-32g-300h"* ]]; then
|
||||
if [[ $CXX == "g++" ]]; then
|
||||
# GCC hits memory limits on runners, reduce threads
|
||||
PARMS[-j]=6
|
||||
else
|
||||
# ASWF github actions runners have 8 threads
|
||||
PARMS[-j]=8
|
||||
fi
|
||||
else
|
||||
# Github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
if [[ $CXX == "g++" ]]; then
|
||||
# GCC hits memory limits on runners, build in serial
|
||||
PARMS[-j]=1
|
||||
else
|
||||
PARMS[-j]=2
|
||||
fi
|
||||
fi
|
||||
# github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
PARMS[-j]=2
|
||||
|
||||
# Available options for --components
|
||||
declare -A COMPONENTS
|
||||
COMPONENTS['core']='OPENVDB_BUILD_CORE'
|
||||
COMPONENTS['python']='OPENVDB_BUILD_PYTHON_MODULE'
|
||||
COMPONENTS['test']='OPENVDB_BUILD_UNITTESTS'
|
||||
# @todo split out vdb tool from this...
|
||||
COMPONENTS['bin']='OPENVDB_BUILD_VDB_PRINT,OPENVDB_BUILD_VDB_LOD,OPENVDB_BUILD_VDB_TOOL,OPENVDB_BUILD_VDB_TOOL_UNITTESTS'
|
||||
COMPONENTS['bin']='OPENVDB_BUILD_BINARIES'
|
||||
COMPONENTS['view']='OPENVDB_BUILD_VDB_VIEW'
|
||||
COMPONENTS['render']='OPENVDB_BUILD_VDB_RENDER'
|
||||
COMPONENTS['hou']='OPENVDB_BUILD_HOUDINI_PLUGIN'
|
||||
@@ -129,15 +108,7 @@ if HAS_PARM -v || HAS_PARM --verbose; then
|
||||
# support older versions of CMake.
|
||||
CMAKE_EXTRA+=("-DCMAKE_VERBOSE_MAKEFILE=ON")
|
||||
fi
|
||||
if HAS_PARM --build-type; then
|
||||
CMAKE_EXTRA+=("-DCMAKE_BUILD_TYPE=${PARMS[--build-type]}")
|
||||
build_type="${PARMS[--build-type]}"
|
||||
debug="Debug"
|
||||
# Ignore case - if the build-type is Debug, we enable asserts
|
||||
if [ "${build_type,,}" = "${debug,,}" ]; then
|
||||
CMAKE_EXTRA+=("-DOPENVDB_ENABLE_ASSERTS=ON")
|
||||
fi
|
||||
fi
|
||||
if HAS_PARM --build-type; then CMAKE_EXTRA+=("-DCMAKE_BUILD_TYPE=${PARMS[--build-type]}"); fi
|
||||
|
||||
# Available components. If a component is not provided it is
|
||||
# explicitly set to OFF.
|
||||
@@ -156,16 +127,12 @@ for comp in "${!COMPONENTS[@]}"; do
|
||||
setting="ON"; break
|
||||
fi
|
||||
done
|
||||
OPENVDB_TOGGLES="${COMPONENTS[$comp]}"
|
||||
OPENVDB_TOGGLES=(${OPENVDB_TOGGLES//,/ })
|
||||
for toggle in "${!OPENVDB_TOGGLES[@]}"; do
|
||||
CMAKE_EXTRA+=("-D${OPENVDB_TOGGLES[$toggle]}=$setting")
|
||||
done
|
||||
CMAKE_EXTRA+=("-D${COMPONENTS[$comp]}=$setting")
|
||||
done
|
||||
|
||||
################################################
|
||||
|
||||
# github actions runners have 8 threads
|
||||
# github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
export CMAKE_BUILD_PARALLEL_LEVEL=${PARMS[-j]}
|
||||
echo "Build using ${CMAKE_BUILD_PARALLEL_LEVEL} threads"
|
||||
@@ -192,15 +159,12 @@ cd ${BUILD_DIR}
|
||||
set -x
|
||||
|
||||
# Note:
|
||||
# - OPENVDB_BUILD_BINARIES is always ON, but each binary will be toggled depending on the provided comps
|
||||
# - always enabled the python tests with OPENVDB_BUILD_PYTHON_UNITTESTS if the python module is in use,
|
||||
# regardless of the 'test' component being enabled or not (see the OPENVDB_BUILD_PYTHON_UNITTESTS option).
|
||||
# - print and lod binary options are always on and can be toggles with: OPENVDB_BUILD_BINARIES=ON/OFF
|
||||
cmake \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_10=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_11=ON \
|
||||
-DOPENVDB_TOOL_USE_NANO=OFF \
|
||||
-DOPENVDB_BUILD_BINARIES=ON \
|
||||
-DOPENVDB_BUILD_PYTHON_UNITTESTS=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_7=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_8=ON \
|
||||
-DOPENVDB_BUILD_VDB_PRINT=ON \
|
||||
-DOPENVDB_BUILD_VDB_LOD=ON \
|
||||
-DMSVC_MP_THREAD_COUNT=${PARMS[-j]} \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
Executable → Regular
+37
-87
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
#!/usr/local/bin/python
|
||||
#
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
# Python script to download the latest Houdini builds
|
||||
# using the SideFX download API:
|
||||
@@ -19,16 +19,16 @@ import base64
|
||||
import requests
|
||||
import hashlib
|
||||
import os
|
||||
import argparse
|
||||
import copy
|
||||
|
||||
# For progress bar printing
|
||||
try:
|
||||
from tqdm import tqdm
|
||||
has_tqdm = True
|
||||
except:
|
||||
has_tqdm = False
|
||||
pass
|
||||
# this argument is for the major.minor version of Houdini to download (such as 15.0, 15.5, 16.0)
|
||||
version = sys.argv[1]
|
||||
only_production = True if sys.argv[2] == 'ON' else False
|
||||
user_client_id = os.getenv('HOUDINI_CLIENT_ID')
|
||||
user_client_secret_key = os.getenv('HOUDINI_SECRET_KEY')
|
||||
|
||||
if not re.match('[0-9][0-9]\.[0-9]$', version):
|
||||
raise IOError('Invalid Houdini Version "%s", expecting in the form "major.minor" such as "16.0"' % version)
|
||||
|
||||
|
||||
# Code that provides convenient Python wrappers to call into the API:
|
||||
|
||||
@@ -94,7 +94,7 @@ def get_access_token_and_expiry_time(
|
||||
),
|
||||
})
|
||||
if response.status_code != 200:
|
||||
raise AuthorizationError(response.status_code, response.text)
|
||||
raise AuthorizationError(response.status_code, reponse.text)
|
||||
|
||||
response_json = response.json()
|
||||
access_token_expiry_time = time.time() - 2 + response_json["expires_in"]
|
||||
@@ -138,83 +138,33 @@ class APIError(Exception):
|
||||
self.http_code = http_code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
service = service(
|
||||
access_token_url="https://www.sidefx.com/oauth2/application_token",
|
||||
client_id=user_client_id,
|
||||
client_secret_key=user_client_secret_key,
|
||||
endpoint_url="https://www.sidefx.com/api/",
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser(description='Download a Houdini Installation')
|
||||
parser.add_argument('version', type=str, help='Major.Minor version of Houdini to download')
|
||||
parser.add_argument('platform', type=str, help='Platform target')
|
||||
parser.add_argument('--prod', action='store_true', help='Only download production builds')
|
||||
parser.add_argument('--list', action='store_true', help='Just list the available builds and exit.')
|
||||
args = parser.parse_args()
|
||||
releases_list = service.download.get_daily_builds_list(
|
||||
product='houdini', version=version, platform='linux', only_production=only_production)
|
||||
|
||||
version = args.version
|
||||
platform = args.platform
|
||||
only_production = args.prod
|
||||
latest_release = service.download.get_daily_build_download(
|
||||
product='houdini', version=version, platform='linux', build=releases_list[0]['build'])
|
||||
|
||||
user_client_id = os.getenv('HOUDINI_CLIENT_ID')
|
||||
user_client_secret_key = os.getenv('HOUDINI_SECRET_KEY')
|
||||
|
||||
if not re.match('[0-9][0-9]\.[0-9]$', version):
|
||||
raise IOError('Invalid Houdini Version "%s", expecting in the form "major.minor" such as "16.0"' % version)
|
||||
|
||||
service = service(
|
||||
access_token_url="https://www.sidefx.com/oauth2/application_token",
|
||||
client_id=user_client_id,
|
||||
client_secret_key=user_client_secret_key,
|
||||
endpoint_url="https://www.sidefx.com/api/",
|
||||
)
|
||||
|
||||
releases_list = service.download.get_daily_builds_list(
|
||||
product='houdini', version=version, platform=platform, only_production=only_production)
|
||||
|
||||
print('Available builds:')
|
||||
for rel in releases_list:
|
||||
rel = copy.deepcopy(rel)
|
||||
if 'third_party_libraries' in rel:
|
||||
# Don't print these
|
||||
del rel['third_party_libraries']
|
||||
print(rel)
|
||||
|
||||
if args.list:
|
||||
sys.exit(0)
|
||||
|
||||
print('Selecting build: ' + releases_list[0]['build'])
|
||||
|
||||
latest_release = service.download.get_daily_build_download(
|
||||
product='houdini', version=version, platform=platform, build=releases_list[0]['build'])
|
||||
print(latest_release)
|
||||
|
||||
# Can't do this procedurally as latest_release['filename'] can contain
|
||||
# multiple periods and may have multiple trailing extensions...
|
||||
extension = ''
|
||||
if 'linux' in platform: extension = 'tar.gz'
|
||||
elif 'macos' in platform: extension = 'dmg'
|
||||
elif 'win64' in platform: extension = 'exe'
|
||||
assert(extension in latest_release['filename'])
|
||||
|
||||
# Download the file and save it as hou.extension
|
||||
local_filename = 'hou.' + extension
|
||||
print('Writing to "' + local_filename + '"')
|
||||
|
||||
response = requests.get(latest_release['download_url'], stream=True)
|
||||
if response.status_code == 200:
|
||||
# Download the file as hou.tar.gz
|
||||
local_filename = 'hou.tar.gz'
|
||||
response = requests.get(latest_release['download_url'], stream=True)
|
||||
if response.status_code == 200:
|
||||
with open(local_filename, 'wb') as f:
|
||||
response.raw.decode_content = True
|
||||
if has_tqdm:
|
||||
file_size = int(response.headers.get('Content-Length', 0))
|
||||
desc = "(Unknown total file size)" if file_size == 0 else ""
|
||||
with tqdm.wrapattr(response.raw, "read", total=file_size, desc=desc) as r_raw:
|
||||
with open(local_filename, 'wb') as f:
|
||||
shutil.copyfileobj(r_raw, f)
|
||||
else:
|
||||
with open(local_filename, 'wb') as f:
|
||||
shutil.copyfileobj(response.raw, f)
|
||||
else:
|
||||
raise Exception('Error downloading file!')
|
||||
shutil.copyfileobj(response.raw, f)
|
||||
else:
|
||||
raise Exception('Error downloading file!')
|
||||
|
||||
# Verify the file checksum is matching
|
||||
file_hash = hashlib.md5()
|
||||
with open(local_filename, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(4096), b''):
|
||||
file_hash.update(chunk)
|
||||
if file_hash.hexdigest() != latest_release['hash']:
|
||||
raise Exception('Checksum does not match!')
|
||||
# Verify the file checksum is matching
|
||||
file_hash = hashlib.md5()
|
||||
with open(local_filename, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(4096), b''):
|
||||
file_hash.update(chunk)
|
||||
if file_hash.hexdigest() != latest_release['hash']:
|
||||
raise Exception('Checksum does not match!')
|
||||
|
||||
+37
-113
@@ -1,130 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
HOUDINI_MAJOR="$1"
|
||||
PLATFORM="$2"
|
||||
OTHER_ARGS="$3"
|
||||
GOLD="$2"
|
||||
|
||||
if [[ $PLATFORM =~ "linux" ]]; then
|
||||
pip3 install --user requests
|
||||
elif [[ $PLATFORM =~ "macos" ]]; then
|
||||
# Tell the homebrew install of pip3 that we don't care about installing directly through pip3
|
||||
pip3 install --user requests --break-system-packages
|
||||
fi
|
||||
pip install --user requests
|
||||
|
||||
python3 ci/download_houdini.py $HOUDINI_MAJOR $PLATFORM $OTHER_ARGS
|
||||
python ci/download_houdini.py $HOUDINI_MAJOR $GOLD
|
||||
|
||||
if [[ $PLATFORM =~ "linux" ]]; then
|
||||
# create dir hierarchy
|
||||
mkdir -p hou/bin
|
||||
mkdir -p hou/houdini
|
||||
mkdir -p hou/toolkit
|
||||
mkdir -p hou/dsolib
|
||||
# create dir hierarchy
|
||||
mkdir -p hou/bin
|
||||
mkdir -p hou/houdini
|
||||
mkdir -p hou/toolkit
|
||||
mkdir -p hou/dsolib
|
||||
|
||||
# unpack hou.tar.gz and cleanup
|
||||
tar -xzf hou.tar.gz
|
||||
rm -rf hou.tar.gz
|
||||
cd houdini*
|
||||
tar -xzf houdini.tar.gz
|
||||
# unpack hou.tar.gz and cleanup
|
||||
tar -xzf hou.tar.gz
|
||||
rm -rf hou.tar.gz
|
||||
cd houdini*
|
||||
tar -xzf houdini.tar.gz
|
||||
|
||||
# copy required files into hou dir
|
||||
cp houdini_setup* ../hou/.
|
||||
# copy required files into hou dir
|
||||
cp houdini_setup* ../hou/.
|
||||
cp -r toolkit/cmake ../hou/toolkit/.
|
||||
cp -r toolkit/include ../hou/toolkit/.
|
||||
cp -r dsolib/libHoudini* ../hou/dsolib/.
|
||||
cp -r dsolib/libopenvdb_sesi* ../hou/dsolib/.
|
||||
cp -r dsolib/libblosc* ../hou/dsolib/.
|
||||
cp -r dsolib/libhboost* ../hou/dsolib/.
|
||||
cp -r dsolib/libz* ../hou/dsolib/.
|
||||
cp -r dsolib/libbz2* ../hou/dsolib/.
|
||||
cp -r dsolib/libtbb* ../hou/dsolib/.
|
||||
cp -r dsolib/libHalf* ../hou/dsolib/.
|
||||
cp -r dsolib/libjemalloc* ../hou/dsolib/.
|
||||
cp -r dsolib/liblzma* ../hou/dsolib/.
|
||||
cp -r dsolib/libIex* ../hou/dsolib/.
|
||||
cp -r dsolib/libImath* ../hou/dsolib/.
|
||||
cp -r dsolib/libIlmThread* ../hou/dsolib/.
|
||||
cp -r dsolib/libIlmImf* ../hou/dsolib/.
|
||||
|
||||
# report library names
|
||||
ls -al dsolib/
|
||||
|
||||
# copy required libraries
|
||||
mv toolkit/cmake ../hou/toolkit/.
|
||||
mv toolkit/include ../hou/toolkit/.
|
||||
mv dsolib/libHoudini* ../hou/dsolib/.
|
||||
mv dsolib/libopenvdb_sesi* ../hou/dsolib/.
|
||||
mv dsolib/libblosc* ../hou/dsolib/.
|
||||
mv dsolib/libhboost* ../hou/dsolib/.
|
||||
mv dsolib/libz* ../hou/dsolib/.
|
||||
mv dsolib/libbz2* ../hou/dsolib/.
|
||||
mv dsolib/libtbb* ../hou/dsolib/.
|
||||
mv dsolib/libjemalloc* ../hou/dsolib/.
|
||||
mv dsolib/liblzma* ../hou/dsolib/.
|
||||
mv dsolib/libIex* ../hou/dsolib/.
|
||||
mv dsolib/libImath* ../hou/dsolib/.
|
||||
mv dsolib/libIlmThread* ../hou/dsolib/.
|
||||
cd ..
|
||||
|
||||
elif [[ $PLATFORM =~ "macos" ]]; then
|
||||
# Exract files by mounting the downloaded dmg (we only really want to
|
||||
# expand Houdini.framework)
|
||||
hdiutil attach hou.dmg
|
||||
pkgutil --expand-full /Volumes/Houdini/Houdini.pkg Houdini
|
||||
hdiutil detach /Volumes/Houdini
|
||||
rm hou.dmg
|
||||
|
||||
# Move the required Frameworks and delete the extracted src
|
||||
mkdir -p hou/Frameworks
|
||||
mv Houdini/Framework.pkg/Payload/Houdini.framework hou/Frameworks/Houdini.framework
|
||||
rm -rf Houdini
|
||||
|
||||
# Report library names
|
||||
ls -al hou/Frameworks/Houdini.framework/Libraries
|
||||
|
||||
# Remove unused resources
|
||||
cd hou/Frameworks/Houdini.framework/Resources/
|
||||
rm -rf $(ls | grep -e toolkit -v)
|
||||
cd -
|
||||
|
||||
# Handle libraries. On some versions of MacOS with older versions of ld,
|
||||
# ld will complain (error) if shared libraries contain missing files which
|
||||
# are referenced with LC_LOAD_DYLIB or LC_RPATH entries (even though they
|
||||
# are not explicitly required at link time). We still want to delete these
|
||||
# unused libs as they occupt ~1-2GB. To handle this, we generate a unique
|
||||
# list of libs that our direct dependencies reference and create an empty
|
||||
# shared dylib in their place.
|
||||
cd hou/Frameworks/Houdini.framework/Libraries
|
||||
# Remove any folders here, they aren't needed
|
||||
rm -rf $(ls -p | grep /)
|
||||
# Remove any library that does not match the -e patterns (inverse grep with -v)
|
||||
unused_libraries=$(ls | \
|
||||
grep -e libHoudini \
|
||||
-e libopenvdb_sesi \
|
||||
-e libblosc \
|
||||
-e libhboost \
|
||||
-e libz \
|
||||
-e libbz2 \
|
||||
-e libtbb \
|
||||
-e libjemalloc \
|
||||
-e liblzma \
|
||||
-e libIex \
|
||||
-e libImath \
|
||||
-e libIlmThread \
|
||||
-v)
|
||||
rm -rf ${unused_libraries}
|
||||
|
||||
# Create an empty valid shared lib
|
||||
echo '' | clang -x c -shared -o libempty.dylib -
|
||||
|
||||
# Generate a unique list of libs that our remaining libs reference
|
||||
for i in $(ls); do otool -LX $i >> libnames; done
|
||||
sort -u libnames | grep @rpath | cut -f1 -d' ' | xargs > rpaths
|
||||
|
||||
# Recreate unused libraries that have been deleted as empty shared dylibs
|
||||
# to keep ld happy
|
||||
for libpath in $(cat rpaths); do
|
||||
libpath=${libpath#"@rpath/"}
|
||||
echo "Checking $libpath"
|
||||
if [ ! -f $libpath ]; then
|
||||
echo "Creating empty library at $libpath"
|
||||
mkdir -p $(dirname $libpath)
|
||||
cp libempty.dylib $libpath
|
||||
fi
|
||||
done
|
||||
|
||||
rm libempty.dylib
|
||||
cd -
|
||||
# needed for < H18.0 (due to sesitag)
|
||||
if [ "$HOUDINI_MAJOR" == "17.0" ] || [ "$HOUDINI_MAJOR" == "17.5" ]; then
|
||||
cp -r bin/app_init* ../hou/bin/.
|
||||
cp -r bin/sesitag* ../hou/bin/.
|
||||
cp -r dsolib/lib* ../hou/dsolib/.
|
||||
fi
|
||||
|
||||
# write hou into hou.tar.gz and cleanup
|
||||
cd ..
|
||||
tar -czvf hou.tar.gz hou
|
||||
|
||||
# move hou.tar.gz into hou subdirectory
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#################################################################################
|
||||
# This script extracts all code blocks from AX documentation which are NOT #
|
||||
# marked as cpp/sh/unparsed and attempts to parse or compile them through the #
|
||||
|
||||
+1
-3
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
@@ -34,5 +32,5 @@ cmake \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
make -j8
|
||||
make -j4
|
||||
make install
|
||||
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
CMAKE_VERSION="$1"
|
||||
CMAKE_PACKAGE=cmake-${CMAKE_VERSION}-Linux-x86_64
|
||||
|
||||
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_PACKAGE}.tar.gz
|
||||
|
||||
tar -xf ${CMAKE_PACKAGE}.tar.gz
|
||||
cp ${CMAKE_PACKAGE}/bin/* /usr/local/bin/
|
||||
cp -r ${CMAKE_PACKAGE}/share/* /usr/local/share/
|
||||
|
||||
rm -rf ${CMAKE_PACKAGE}
|
||||
rm -rf ${CMAKE_PACKAGE}.tar.gz
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
CURL_VERSION="$1"
|
||||
|
||||
wget -O cppunit.tar.gz https://dev-www.libreoffice.org/src/cppunit-${CURL_VERSION}.tar.gz
|
||||
|
||||
tar -xzf cppunit.tar.gz
|
||||
|
||||
cd cppunit-${CURL_VERSION}
|
||||
|
||||
./configure
|
||||
|
||||
make -j8
|
||||
make install
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
@@ -15,6 +13,6 @@ fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ../.
|
||||
make -j8
|
||||
cmake ../.
|
||||
make -j4
|
||||
make install
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
EXR_VERSION="$1"
|
||||
|
||||
git clone https://github.com/AcademySoftwareFoundation/openexr.git
|
||||
cd openexr
|
||||
|
||||
if [ "$EXR_VERSION" != "latest" ]; then
|
||||
git checkout tags/${EXR_VERSION} -b ${EXR_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
GLFW_VERSION="$1"
|
||||
|
||||
git clone https://github.com/glfw/glfw.git
|
||||
cd glfw
|
||||
|
||||
if [ "$GLFW_VERSION" != "latest" ]; then
|
||||
git checkout tags/${GLFW_VERSION} -b ${GLFW_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j8
|
||||
make install
|
||||
+5
-8
@@ -1,21 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
GTEST_VERSION="$1"
|
||||
|
||||
git clone https://github.com/google/googletest.git
|
||||
cd googletest
|
||||
|
||||
if [ "$GTEST_VERSION" != "latest" ]; then
|
||||
git checkout tags/${GTEST_VERSION} -b ${GTEST_VERSION}
|
||||
git checkout release-${GTEST_VERSION} -b v${GTEST_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
cmake ../.
|
||||
make -j4
|
||||
make install
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
IMATH_VERSION="$1"
|
||||
|
||||
git clone https://github.com/AcademySoftwareFoundation/Imath.git
|
||||
cd Imath
|
||||
|
||||
if [ "$IMATH_VERSION" != "latest" ]; then
|
||||
git checkout tags/${IMATH_VERSION} -b ${IMATH_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
@@ -1,58 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
LLVM_VER="$1"
|
||||
LLVM_CRT="$2"
|
||||
LLVM_CRT="$1"
|
||||
|
||||
# Legacy define for older versions of LLVM
|
||||
LLVM_LEGACY_CRT_DEFINE=""
|
||||
if [[ "${LLVM_CRT}" == "MultiThreaded" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MT"
|
||||
elif [[ "${LLVM_CRT}" == "MultiThreadedDebug" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MTd"
|
||||
elif [[ "${LLVM_CRT}" == "MultiThreadedDLL" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MD"
|
||||
elif [[ "${LLVM_CRT}" == "MultiThreadedDebugDLL" ]]; then
|
||||
LLVM_LEGACY_CRT_DEFINE="MDd"
|
||||
fi
|
||||
|
||||
git clone -b llvmorg-${LLVM_VER} --depth 1 https://github.com/llvm/llvm-project.git llvm
|
||||
git clone -b llvmorg-12.0.0 --depth 1 https://github.com/llvm/llvm-project.git llvm
|
||||
cd llvm
|
||||
|
||||
mkdir .build
|
||||
cd .build
|
||||
|
||||
cmake -B . -S ../llvm -A x64 -G "Visual Studio 17 2022" -Thost=x64 \
|
||||
# @note currently only test static builds with MT
|
||||
cmake -S ../llvm -A x64 -G "Visual Studio 16 2019" -Thost=x64 \
|
||||
-DCMAKE_INSTALL_PREFIX="${HOME}/llvm_install" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DLLVM_ENABLE_ASSERTIONS=OFF \
|
||||
-DLLVM_ENABLE_PROJECTS="" \
|
||||
-DLLVM_ENABLE_RUNTIMES="" \
|
||||
-DLLVM_ENABLE_UNWIND_TABLES=OFF \
|
||||
-DLLVM_TARGETS_TO_BUILD="host" \
|
||||
-DLLVM_BUILD_TOOLS=OFF \
|
||||
-DLLVM_INCLUDE_BENCHMARKS=OFF \
|
||||
-DLLVM_INCLUDE_EXAMPLES=OFF \
|
||||
-DLLVM_INCLUDE_TESTS=OFF \
|
||||
-DLLVM_INCLUDE_DOCS=OFF \
|
||||
-DLLVM_INCLUDE_TOOLS=OFF \
|
||||
-DLLVM_INCLUDE_UTILS=OFF \
|
||||
-DLLVM_BUILD_BENCHMARKS=OFF \
|
||||
-DLLVM_BUILD_EXAMPLES=OFF \
|
||||
-DLLVM_BUILD_TESTS=OFF \
|
||||
-DLLVM_BUILD_DOCS=OFF \
|
||||
-DLLVM_BUILD_TOOLS=OFF \
|
||||
-DLLVM_BUILD_UTILS=OFF \
|
||||
-DLLVM_ENABLE_BINDINGS=OFF \
|
||||
-DLLVM_ENABLE_OCAMLDOC=OFF \
|
||||
-DLLVM_PARALLEL_COMPILE_JOBS=4 \
|
||||
-DLLVM_PARALLEL_LINK_JOBS=4 \
|
||||
-DCMAKE_MSVC_RUNTIME_LIBRARY=${LLVM_CRT} \
|
||||
-DLLVM_USE_CRT_RELEASE=${LLVM_LEGACY_CRT_DEFINE}
|
||||
-DLLVM_USE_CRT_RELEASE=${LLVM_CRT} \
|
||||
..
|
||||
|
||||
cmake --build . --parallel 4 --config Release --target install
|
||||
cmake --build . --config Release --target install
|
||||
|
||||
cd ..
|
||||
|
||||
|
||||
+16
-31
@@ -1,52 +1,37 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -x
|
||||
|
||||
# Remove Python3 symlinks in /usr/local/bin as workaround to brew update issues
|
||||
# https://github.com/actions/setup-python/issues/577
|
||||
rm /usr/local/bin/2to3* || :
|
||||
rm /usr/local/bin/idle3* || :
|
||||
rm /usr/local/bin/pydoc* || :
|
||||
rm /usr/local/bin/python3* || :
|
||||
|
||||
brew update
|
||||
brew install bash gnu-getopt # for CI scripts
|
||||
brew install boost
|
||||
brew install c-blosc
|
||||
brew install cmake
|
||||
brew install ilmbase
|
||||
brew install openexr@2
|
||||
brew install boost
|
||||
brew install boost-python3 # also installs the dependent python version
|
||||
brew install tbb@2020
|
||||
brew install zlib
|
||||
brew install glfw
|
||||
brew install googletest
|
||||
brew install jq # for trivial parsing of brew json
|
||||
brew install openexr
|
||||
brew install nanobind # also installs the dependent python version
|
||||
brew install robin-map # required for nanobind
|
||||
brew install numpy # only for python tests
|
||||
brew install zlib
|
||||
brew install jemalloc
|
||||
|
||||
# Alias python version installed by nanobind to path
|
||||
py_version=$(brew info nanobind --json | \
|
||||
# Alias python version installed by boost-python3 to path
|
||||
py_version=$(brew info boost-python3 --json | \
|
||||
jq -cr '.[].dependencies[] | select(. | startswith("python"))')
|
||||
echo "Using python $py_version"
|
||||
# export for subsequent action steps (note, not exported for this env)
|
||||
echo "Python_ROOT_DIR=/usr/local/opt/$py_version" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/$py_version/bin" >> $GITHUB_PATH
|
||||
|
||||
# use bash
|
||||
echo "/usr/local/opt/bash/bin" >> $GITHUB_PATH
|
||||
echo "/opt/homebrew/opt/bash/bin" >> $GITHUB_PATH
|
||||
# Export OpenEXR paths which are no longer installed to /usr/local (as v2.x is deprecated)
|
||||
echo "IlmBase_ROOT=/usr/local/opt/ilmbase" >> $GITHUB_ENV
|
||||
echo "OpenEXR_ROOT=/usr/local/opt/openexr@2" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/openexr@2/bin" >> $GITHUB_PATH
|
||||
|
||||
# Export TBB paths which are no longer installed to /usr/local (as v2020 is deprecated)
|
||||
echo "TBB_ROOT=/usr/local/opt/tbb@2020" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/tbb@2020/bin" >> $GITHUB_PATH
|
||||
|
||||
# use gnu-getopt
|
||||
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
echo "/opt/homebrew/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
|
||||
LLVM_VERSION=$1
|
||||
if [ ! -z "$LLVM_VERSION" ]; then
|
||||
if [ "$LLVM_VERSION" == "latest" ]; then
|
||||
brew install llvm
|
||||
else
|
||||
brew install llvm@$LLVM_VERSION
|
||||
fi
|
||||
fi
|
||||
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Download and install deps from homebrew on macos
|
||||
|
||||
LLVM_VERSION=$1
|
||||
if [ -z $LLVM_VERSION ]; then
|
||||
echo "No LLVM version provided for LLVM installation"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
brew update
|
||||
brew install bash gnu-getopt # for CI scripts
|
||||
brew install cmake
|
||||
brew install boost
|
||||
brew install cppunit
|
||||
brew install c-blosc
|
||||
brew install tbb@2020
|
||||
brew install llvm@$LLVM_VERSION
|
||||
brew install zlib
|
||||
|
||||
# Export TBB paths which are no longer installed to /usr/local (as v2020 is deprecated)
|
||||
echo "TBB_ROOT=/usr/local/opt/tbb@2020" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/tbb@2020/bin" >> $GITHUB_PATH
|
||||
|
||||
# use gnu-getopt
|
||||
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
PYBIND11_VERSION="$1"
|
||||
INSTALL_ROOT="$2"
|
||||
CMAKE_EXTRA=()
|
||||
if [ ! -z "${INSTALL_ROOT}" ]; then
|
||||
CMAKE_EXTRA+=("-DCMAKE_INSTALL_PREFIX=${INSTALL_ROOT}")
|
||||
fi
|
||||
|
||||
git clone --recurse-submodules https://github.com/wjakob/nanobind.git
|
||||
cd nanobind
|
||||
|
||||
if [ "$PYBIND11_VERSION" != "latest" ]; then
|
||||
git checkout tags/v${PYBIND11_VERSION} -b v${PYBIND11_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake \
|
||||
-DNB_TEST=OFF \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
make -j8
|
||||
sudo make install
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -x
|
||||
|
||||
brew update
|
||||
brew install tbb
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
# Download the TeX Live installer
|
||||
wget https://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
|
||||
|
||||
# Extract
|
||||
tar xzf install-tl-unx.tar.gz
|
||||
rm install-tl-unx.tar.gz
|
||||
cd install-tl-*
|
||||
|
||||
# Run the installer with no docs or source installation
|
||||
./install-tl --no-interaction --no-doc-install --no-src-install --scheme=minimal
|
||||
|
||||
# Export the texlive PATH to GITHUB_PATH
|
||||
TEXLIVE_PATH=/usr/local/texlive/2025/bin/x86_64-linux
|
||||
export PATH=${TEXLIVE_PATH}:${PATH}
|
||||
echo "${TEXLIVE_PATH}" >> $GITHUB_PATH
|
||||
|
||||
# Install the required packages
|
||||
tlmgr install latex-bin dvips collection-fontsrecommended collection-latexrecommended
|
||||
|
||||
# Validate that installing dvips and latex has been successful
|
||||
dvips --version
|
||||
latex --version
|
||||
@@ -1,40 +0,0 @@
|
||||
# Enable verbose and stop on error
|
||||
$ErrorActionPreference = "Stop"
|
||||
$VerbosePreference = "Continue"
|
||||
|
||||
# Required dependencies
|
||||
$vcpkgPackages = @(
|
||||
"zlib",
|
||||
"libpng",
|
||||
"openexr",
|
||||
"tbb",
|
||||
"gtest",
|
||||
"cppunit",
|
||||
"blosc",
|
||||
"glfw3",
|
||||
"glew",
|
||||
"python3",
|
||||
"jemalloc",
|
||||
"boost-iostreams",
|
||||
"boost-interprocess",
|
||||
"boost-algorithm",
|
||||
"nanobind"
|
||||
)
|
||||
|
||||
# Update vcpkg
|
||||
vcpkg update
|
||||
|
||||
# Allow the vcpkg command to fail once so we can retry with the latest
|
||||
try {
|
||||
vcpkg install $vcpkgPackages
|
||||
} catch {
|
||||
Write-Host "vcpkg install failed, retrying with latest ports..."
|
||||
# Retry the installation with updated ports
|
||||
Push-Location $env:VCPKG_INSTALLATION_ROOT
|
||||
git pull
|
||||
Pop-Location
|
||||
vcpkg update
|
||||
vcpkg install $vcpkgPackages
|
||||
}
|
||||
|
||||
Write-Host "vcpkg install completed successfully"
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
vcpkg update
|
||||
vcpkg install zlib libpng openexr tbb gtest blosc glfw3 glew \
|
||||
boost-iostreams boost-any boost-uuid boost-interprocess boost-algorithm
|
||||
@@ -25,14 +25,11 @@ $CUDA_KNOWN_URLS = @{
|
||||
"11.2.0" = "https://developer.download.nvidia.com/compute/cuda/11.2.0/network_installers/cuda_11.2.0_win10_network.exe";
|
||||
"11.2.1" = "https://developer.download.nvidia.com/compute/cuda/11.2.1/network_installers/cuda_11.2.1_win10_network.exe";
|
||||
"11.2.2" = "https://developer.download.nvidia.com/compute/cuda/11.2.2/network_installers/cuda_11.2.2_win10_network.exe";
|
||||
"11.3.0" = "https://developer.download.nvidia.com/compute/cuda/11.3.0/network_installers/cuda_11.3.0_win10_network.exe";
|
||||
"11.6.2" = "https://developer.download.nvidia.com/compute/cuda/11.6.2/network_installers/cuda_11.6.2_windows_network.exe";
|
||||
"12.4.0" = "https://developer.download.nvidia.com/compute/cuda/12.4.0/network_installers/cuda_12.4.0_windows_network.exe"
|
||||
"11.3.0" = "https://developer.download.nvidia.com/compute/cuda/11.3.0/network_installers/cuda_11.3.0_win10_network.exe"
|
||||
}
|
||||
|
||||
# @todo - change this to be based on _MSC_VER intead, or invert it to be CUDA keyed instead?
|
||||
$VISUAL_STUDIO_MIN_CUDA = @{
|
||||
"2022" = "12.4";
|
||||
"2019" = "10.1";
|
||||
"2017" = "10.0"; # Depends on which version of 2017! 9.0 to 10.0 depending on version
|
||||
"2015" = "8.0"; # might support older, unsure.
|
||||
@@ -46,7 +43,6 @@ $CUDA_PACKAGES_IN = @(
|
||||
"curand_dev";
|
||||
"nvrtc_dev";
|
||||
"cudart";
|
||||
"thrust";
|
||||
)
|
||||
|
||||
|
||||
|
||||
+1
-3
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
set -e
|
||||
|
||||
# Various tests to test the FindOpenVDB CMake modules and
|
||||
@@ -10,7 +8,7 @@ set -e
|
||||
# the expected VDB installation
|
||||
|
||||
cmakelists="
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
project(TestInstall LANGUAGES CXX)
|
||||
find_package(OpenVDB REQUIRED COMPONENTS openvdb)
|
||||
add_executable(test_vdb_print \"../openvdb_cmd/vdb_print/main.cc\")
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
|
||||
|
||||
set(CPM_DOWNLOAD_VERSION 0.40.2)
|
||||
set(CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d")
|
||||
|
||||
if(CPM_SOURCE_CACHE)
|
||||
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
else()
|
||||
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
endif()
|
||||
|
||||
# Expand relative path. This is important if the provided path contains a tilde (~)
|
||||
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
|
||||
|
||||
file(DOWNLOAD
|
||||
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
|
||||
)
|
||||
|
||||
include(${CPM_DOWNLOAD_LOCATION})
|
||||
+24
-70
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -88,7 +88,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
mark_as_advanced(
|
||||
@@ -188,6 +188,20 @@ list(APPEND _BLOSC_LIBRARYDIR_SEARCH_DIRS
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Library suffix handling
|
||||
|
||||
set(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
if(MSVC)
|
||||
if(BLOSC_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
||||
endif()
|
||||
else()
|
||||
if(BLOSC_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(Blosc_LIB_COMPONENTS "")
|
||||
# NOTE: Search for debug version first (see vcpkg hack)
|
||||
list(APPEND BLOSC_BUILD_TYPES DEBUG RELEASE)
|
||||
@@ -230,6 +244,11 @@ foreach(BUILD_TYPE ${BLOSC_BUILD_TYPES})
|
||||
set(CMAKE_IGNORE_PATH ${_BLOSC_CMAKE_IGNORE_PATH})
|
||||
endforeach()
|
||||
|
||||
# Reset library suffix
|
||||
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
unset(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
|
||||
if(Blosc_LIBRARY_DEBUG AND Blosc_LIBRARY_RELEASE)
|
||||
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||
# single-config generators, set optimized and debug libraries
|
||||
@@ -357,74 +376,9 @@ if(NOT TARGET Blosc::blosc)
|
||||
set_target_properties(Blosc::blosc PROPERTIES
|
||||
INTERFACE_LINK_DIRECTORIES
|
||||
"\$<\$<CONFIG:Release>:${Blosc_RELEASE_LIBRARY_DIRS}>;\$<\$<CONFIG:Debug>:${Blosc_DEBUG_LIBRARY_DIRS}>")
|
||||
|
||||
set(BLOSC_EXTERNAL_LIBRARIES lz4 snappy zlib zstd)
|
||||
|
||||
foreach(BLOSC_EXTERNAL_LIB ${BLOSC_EXTERNAL_LIBRARIES})
|
||||
|
||||
foreach(BUILD_TYPE ${BLOSC_BUILD_TYPES})
|
||||
set(_BLOSC_CMAKE_IGNORE_PATH ${CMAKE_IGNORE_PATH})
|
||||
|
||||
if(VCPKG_TOOLCHAIN)
|
||||
if(BUILD_TYPE STREQUAL RELEASE)
|
||||
list(APPEND CMAKE_IGNORE_PATH ${Blosc_DEBUG_LIBRARY_DIRS})
|
||||
else()
|
||||
list(APPEND CMAKE_IGNORE_PATH ${Blosc_RELEASE_LIBRARY_DIRS})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_library(${BLOSC_EXTERNAL_LIB}_LIBRARY_${BUILD_TYPE} ${BLOSC_EXTERNAL_LIB}
|
||||
${_FIND_BLOSC_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_BLOSC_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
|
||||
if(NOT ${BLOSC_EXTERNAL_LIB}_LIBRARY_${BUILD_TYPE})
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
find_library(${BLOSC_EXTERNAL_LIB}_LIBRARY_${BUILD_TYPE} "${BLOSC_EXTERNAL_LIB}d"
|
||||
${_FIND_BLOSC_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_BLOSC_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(CMAKE_IGNORE_PATH ${_BLOSC_CMAKE_IGNORE_PATH})
|
||||
endforeach()
|
||||
|
||||
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG AND ${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE)
|
||||
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||
# single-config generators, set optimized and debug libraries
|
||||
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(_isMultiConfig OR CMAKE_BUILD_TYPE)
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY optimized ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE} debug ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
else()
|
||||
# For single-config generators where CMAKE_BUILD_TYPE has no value,
|
||||
# just use the release libraries
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
# FIXME: This probably should be set for both cases
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARIES optimized ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE} debug ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# if only the release version was found, set the debug variable also to the release version
|
||||
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE AND NOT ${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG)
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARIES ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
|
||||
# if only the debug version was found, set the release variable also to the debug version
|
||||
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG AND NOT ${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE)
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARIES ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
target_link_libraries(Blosc::blosc INTERFACE
|
||||
$<$<CONFIG:Release>:${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE}>
|
||||
$<$<CONFIG:Debug>:${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG}>)
|
||||
|
||||
endforeach()
|
||||
target_link_libraries(Blosc::blosc INTERFACE
|
||||
$<$<CONFIG:Release>:lz4;snappy;zlib;zstd>
|
||||
$<$<CONFIG:Debug>:lz4d;snappyd;zlibd;zstd>)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
|
||||
@@ -0,0 +1,320 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
FindCppUnit
|
||||
-----------
|
||||
|
||||
Find CppUnit include dirs and libraries
|
||||
|
||||
Use this module by invoking find_package with the form::
|
||||
|
||||
find_package(CppUnit
|
||||
[version] [EXACT] # Minimum or EXACT version
|
||||
[REQUIRED] # Fail with error if CppUnit is not found
|
||||
)
|
||||
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``CppUnit::cppunit``
|
||||
This module defines IMPORTED target CppUnit::cppunit, if CppUnit has been
|
||||
found.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This will define the following variables:
|
||||
|
||||
``CppUnit_FOUND``
|
||||
True if the system has the CppUnit library.
|
||||
``CppUnit_VERSION``
|
||||
The version of the CppUnit library which was found.
|
||||
``CppUnit_INCLUDE_DIRS``
|
||||
Include directories needed to use CppUnit.
|
||||
``CppUnit_RELEASE_LIBRARIES``
|
||||
Libraries needed to link to the release version of CppUnit.
|
||||
``CppUnit_RELEASE_LIBRARY_DIRS``
|
||||
CppUnit release library directories.
|
||||
``CppUnit_DEBUG_LIBRARIES``
|
||||
Libraries needed to link to the debug version of CppUnit.
|
||||
``CppUnit_DEBUG_LIBRARY_DIRS``
|
||||
CppUnit debug library directories.
|
||||
|
||||
Deprecated - use [RELEASE|DEBUG] variants:
|
||||
|
||||
``CppUnit_LIBRARIES``
|
||||
Libraries needed to link to CppUnit.
|
||||
``CppUnit_LIBRARY_DIRS``
|
||||
CppUnit library directories.
|
||||
|
||||
Cache Variables
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The following cache variables may also be set:
|
||||
|
||||
``CppUnit_INCLUDE_DIR``
|
||||
The directory containing ``cppunit/Portability.h``.
|
||||
``CppUnit_LIBRARY``
|
||||
The path to the CppUnit library.
|
||||
|
||||
Hints
|
||||
^^^^^
|
||||
|
||||
Instead of explicitly setting the cache variables, the following variables
|
||||
may be provided to tell this module where to look.
|
||||
|
||||
``CppUnit_ROOT``
|
||||
Preferred installation prefix.
|
||||
``CPPUNIT_INCLUDEDIR``
|
||||
Preferred include directory e.g. <prefix>/include
|
||||
``CPPUNIT_LIBRARYDIR``
|
||||
Preferred library directory e.g. <prefix>/lib
|
||||
``CPPUNIT_DEBUG_SUFFIX``
|
||||
Suffix of the debug version of CppUnit libs. Defaults to "_d".
|
||||
``SYSTEM_LIBRARY_PATHS``
|
||||
Global list of library paths intended to be searched by and find_xxx call
|
||||
``CPPUNIT_USE_STATIC_LIBS``
|
||||
Only search for static cppunit libraries
|
||||
``DISABLE_CMAKE_SEARCH_PATHS``
|
||||
Disable CMakes default search paths for find_xxx calls in this module
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
mark_as_advanced(
|
||||
CppUnit_INCLUDE_DIR
|
||||
CppUnit_LIBRARY
|
||||
)
|
||||
|
||||
set(_FIND_CPPUNIT_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
set(_FIND_CPPUNIT_ADDITIONAL_OPTIONS NO_DEFAULT_PATH)
|
||||
endif()
|
||||
|
||||
# Set _CPPUNIT_ROOT based on a user provided root var. Xxx_ROOT and ENV{Xxx_ROOT}
|
||||
# are prioritised over the legacy capitalized XXX_ROOT variables for matching
|
||||
# CMake 3.12 behaviour
|
||||
# @todo deprecate -D and ENV CPPUNIT_ROOT from CMake 3.12
|
||||
if(CppUnit_ROOT)
|
||||
set(_CPPUNIT_ROOT ${CppUnit_ROOT})
|
||||
elseif(DEFINED ENV{CppUnit_ROOT})
|
||||
set(_CPPUNIT_ROOT $ENV{CppUnit_ROOT})
|
||||
elseif(CPPUNIT_ROOT)
|
||||
set(_CPPUNIT_ROOT ${CPPUNIT_ROOT})
|
||||
elseif(DEFINED ENV{CPPUNIT_ROOT})
|
||||
set(_CPPUNIT_ROOT $ENV{CPPUNIT_ROOT})
|
||||
endif()
|
||||
|
||||
# Additionally try and use pkconfig to find cppunit
|
||||
if(USE_PKGCONFIG)
|
||||
if(NOT DEFINED PKG_CONFIG_FOUND)
|
||||
find_package(PkgConfig)
|
||||
endif()
|
||||
pkg_check_modules(PC_CppUnit QUIET cppunit)
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for CppUnit include DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
set(_CPPUNIT_INCLUDE_SEARCH_DIRS "")
|
||||
list(APPEND _CPPUNIT_INCLUDE_SEARCH_DIRS
|
||||
${CPPUNIT_INCLUDEDIR}
|
||||
${_CPPUNIT_ROOT}
|
||||
${PC_CppUnit_INCLUDEDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Look for a standard cppunit header file.
|
||||
find_path(CppUnit_INCLUDE_DIR cppunit/Portability.h
|
||||
${_FIND_CPPUNIT_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_CPPUNIT_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
|
||||
if(EXISTS "${CppUnit_INCLUDE_DIR}/cppunit/Portability.h")
|
||||
file(STRINGS "${CppUnit_INCLUDE_DIR}/cppunit/Portability.h"
|
||||
_cppunit_version_string REGEX "#define CPPUNIT_VERSION "
|
||||
)
|
||||
string(REGEX REPLACE "#define CPPUNIT_VERSION +\"(.+)\".*$" "\\1"
|
||||
_cppunit_version_string "${_cppunit_version_string}"
|
||||
)
|
||||
string(STRIP "${_cppunit_version_string}" CppUnit_VERSION)
|
||||
unset(_cppunit_version_string )
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for CppUnit lib DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(NOT DEFINED CPPUNIT_DEBUG_SUFFIX)
|
||||
set(CPPUNIT_DEBUG_SUFFIX "d")
|
||||
endif()
|
||||
|
||||
set(_CPPUNIT_LIBRARYDIR_SEARCH_DIRS "")
|
||||
list(APPEND _CPPUNIT_LIBRARYDIR_SEARCH_DIRS
|
||||
${CPPUNIT_LIBRARYDIR}
|
||||
${_CPPUNIT_ROOT}
|
||||
${PC_CppUnit_LIBDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Library suffix handling
|
||||
|
||||
set(_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
if(MSVC)
|
||||
if(CPPUNIT_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
||||
else()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "_dll.lib")
|
||||
endif()
|
||||
else()
|
||||
if(CPPUNIT_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
list(APPEND CPPUNIT_BUILD_TYPES RELEASE DEBUG)
|
||||
|
||||
foreach(BUILD_TYPE ${CPPUNIT_BUILD_TYPES})
|
||||
set(_CPPUNIT_LIB_NAME cppunit)
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
set(_CPPUNIT_LIB_NAME "${_CPPUNIT_LIB_NAME}${CPPUNIT_DEBUG_SUFFIX}")
|
||||
endif()
|
||||
|
||||
# Find the lib
|
||||
find_library(CppUnit_LIBRARY_${BUILD_TYPE} ${_CPPUNIT_LIB_NAME}
|
||||
${_FIND_CPPUNIT_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_CPPUNIT_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
|
||||
)
|
||||
endforeach()
|
||||
|
||||
# Reset library suffix
|
||||
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
unset(_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
|
||||
if(CppUnit_LIBRARY_DEBUG AND CppUnit_LIBRARY_RELEASE)
|
||||
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||
# single-config generators, set optimized and debug libraries
|
||||
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(_isMultiConfig OR CMAKE_BUILD_TYPE)
|
||||
set(CppUnit_LIBRARY optimized ${CppUnit_LIBRARY_RELEASE} debug ${CppUnit_LIBRARY_DEBUG})
|
||||
else()
|
||||
# For single-config generators where CMAKE_BUILD_TYPE has no value,
|
||||
# just use the release libraries
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE})
|
||||
endif()
|
||||
# FIXME: This probably should be set for both cases
|
||||
set(CppUnit_LIBRARIES optimized ${CppUnit_LIBRARY_RELEASE} debug ${CppUnit_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# if only the release version was found, set the debug variable also to the release version
|
||||
if(CppUnit_LIBRARY_RELEASE AND NOT CppUnit_LIBRARY_DEBUG)
|
||||
set(CppUnit_LIBRARY_DEBUG ${CppUnit_LIBRARY_RELEASE})
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE})
|
||||
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_RELEASE})
|
||||
endif()
|
||||
|
||||
# if only the debug version was found, set the release variable also to the debug version
|
||||
if(CppUnit_LIBRARY_DEBUG AND NOT CppUnit_LIBRARY_RELEASE)
|
||||
set(CppUnit_LIBRARY_RELEASE ${CppUnit_LIBRARY_DEBUG})
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_DEBUG})
|
||||
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# If the debug & release library ends up being the same, omit the keywords
|
||||
if("${CppUnit_LIBRARY_RELEASE}" STREQUAL "${CppUnit_LIBRARY_DEBUG}")
|
||||
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE} )
|
||||
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_RELEASE} )
|
||||
endif()
|
||||
|
||||
if(CppUnit_LIBRARY)
|
||||
set(CppUnit_FOUND TRUE)
|
||||
else()
|
||||
set(CppUnit_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Cache and set CppUnit_FOUND
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(CppUnit
|
||||
FOUND_VAR CppUnit_FOUND
|
||||
REQUIRED_VARS
|
||||
CppUnit_LIBRARY
|
||||
CppUnit_INCLUDE_DIR
|
||||
VERSION_VAR CppUnit_VERSION
|
||||
)
|
||||
|
||||
if(NOT CppUnit_FOUND)
|
||||
if(CppUnit_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Unable to find CppUnit")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Partition release/debug lib vars
|
||||
|
||||
set(CppUnit_RELEASE_LIBRARIES ${CppUnit_LIBRARY_RELEASE})
|
||||
get_filename_component(CppUnit_RELEASE_LIBRARY_DIRS ${CppUnit_RELEASE_LIBRARIES} DIRECTORY)
|
||||
set(CppUnit_DEBUG_LIBRARIES ${CppUnit_LIBRARY_DEBUG})
|
||||
get_filename_component(CppUnit_DEBUG_LIBRARY_DIRS ${CppUnit_DEBUG_LIBRARIES} DIRECTORY)
|
||||
set(CppUnit_LIBRARIES ${CppUnit_RELEASE_LIBRARIES})
|
||||
set(CppUnit_LIBRARY_DIRS ${CppUnit_RELEASE_LIBRARY_DIRS})
|
||||
set(CppUnit_INCLUDE_DIRS ${CppUnit_INCLUDE_DIR})
|
||||
|
||||
# Configure lib type. If XXX_USE_STATIC_LIBS, we always assume a static
|
||||
# lib is in use. If win32, we can't mark the import .libs as shared, so
|
||||
# these are always marked as UNKNOWN. Otherwise, infer from extension.
|
||||
set(CPPUNIT_LIB_TYPE UNKNOWN)
|
||||
if(CPPUNIT_USE_STATIC_LIBS)
|
||||
set(CPPUNIT_LIB_TYPE STATIC)
|
||||
elseif(UNIX)
|
||||
get_filename_component(_CPPUNIT_EXT ${CppUnit_LIBRARY_RELEASE} EXT)
|
||||
if(_CPPUNIT_EXT STREQUAL ".a")
|
||||
set(CPPUNIT_LIB_TYPE STATIC)
|
||||
elseif(_CPPUNIT_EXT STREQUAL ".so" OR
|
||||
_CPPUNIT_EXT STREQUAL ".dylib")
|
||||
set(CPPUNIT_LIB_TYPE SHARED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET CppUnit::cppunit)
|
||||
add_library(CppUnit::cppunit ${CPPUNIT_LIB_TYPE} IMPORTED)
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
INTERFACE_COMPILE_OPTIONS "${PC_CppUnit_CFLAGS_OTHER}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CppUnit_INCLUDE_DIRS}")
|
||||
|
||||
# Standard location
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${CppUnit_LIBRARY}")
|
||||
|
||||
# Release location
|
||||
if(EXISTS "${CppUnit_LIBRARY_RELEASE}")
|
||||
set_property(TARGET CppUnit::cppunit APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
|
||||
IMPORTED_LOCATION_RELEASE "${CppUnit_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
# Debug location
|
||||
if(EXISTS "${CppUnit_LIBRARY_DEBUG}")
|
||||
set_property(TARGET CppUnit::cppunit APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(CppUnit::cppunit PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
|
||||
IMPORTED_LOCATION_DEBUG "${CppUnit_LIBRARY_DEBUG}")
|
||||
endif()
|
||||
endif()
|
||||
@@ -0,0 +1,447 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
FindIlmBase
|
||||
-----------
|
||||
|
||||
Find IlmBase include dirs and libraries
|
||||
|
||||
Use this module by invoking find_package with the form::
|
||||
|
||||
find_package(IlmBase
|
||||
[version] [EXACT] # Minimum or EXACT version
|
||||
[REQUIRED] # Fail with error if IlmBase is not found
|
||||
[COMPONENTS <libs>...] # IlmBase libraries by their canonical name
|
||||
# e.g. "Half" for "libHalf"
|
||||
)
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``IlmBase::Half``
|
||||
The Half library target.
|
||||
``IlmBase::Iex``
|
||||
The Iex library target.
|
||||
``IlmBase::IexMath``
|
||||
The IexMath library target.
|
||||
``IlmBase::IlmThread``
|
||||
The IlmThread library target.
|
||||
``IlmBase::Imath``
|
||||
The Imath library target.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This will define the following variables:
|
||||
|
||||
``IlmBase_FOUND``
|
||||
True if the system has the IlmBase library.
|
||||
``IlmBase_VERSION``
|
||||
The version of the IlmBase library which was found.
|
||||
``IlmBase_INCLUDE_DIRS``
|
||||
Include directories needed to use IlmBase.
|
||||
``IlmBase_RELEASE_LIBRARIES``
|
||||
Libraries needed to link to the release version of IlmBase.
|
||||
``IlmBase_RELEASE_LIBRARY_DIRS``
|
||||
IlmBase release library directories.
|
||||
``IlmBase_DEBUG_LIBRARIES``
|
||||
Libraries needed to link to the debug version of IlmBase.
|
||||
``IlmBase_DEBUG_LIBRARY_DIRS``
|
||||
IlmBase debug library directories.
|
||||
``IlmBase_{COMPONENT}_FOUND``
|
||||
True if the system has the named IlmBase component.
|
||||
|
||||
Deprecated - use [RELEASE|DEBUG] variants:
|
||||
|
||||
``IlmBase_LIBRARIES``
|
||||
Libraries needed to link to IlmBase.
|
||||
``IlmBase_LIBRARY_DIRS``
|
||||
IlmBase library directories.
|
||||
|
||||
Cache Variables
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The following cache variables may also be set:
|
||||
|
||||
``IlmBase_INCLUDE_DIR``
|
||||
The directory containing ``IlmBase/config-auto.h``.
|
||||
``IlmBase_{COMPONENT}_LIBRARY``
|
||||
Individual component libraries for IlmBase. may include target_link_libraries() debug/optimized keywords.
|
||||
``IlmBase_{COMPONENT}_LIBRARY_RELEASE``
|
||||
Individual component libraries for IlmBase release
|
||||
``IlmBase_{COMPONENT}_LIBRARY_DEBUG``
|
||||
Individual component libraries for IlmBase debug
|
||||
|
||||
Hints
|
||||
^^^^^
|
||||
|
||||
Instead of explicitly setting the cache variables, the following variables
|
||||
may be provided to tell this module where to look.
|
||||
|
||||
``IlmBase_ROOT``
|
||||
Preferred installation prefix.
|
||||
``ILMBASE_INCLUDEDIR``
|
||||
Preferred include directory e.g. <prefix>/include
|
||||
``ILMBASE_LIBRARYDIR``
|
||||
Preferred library directory e.g. <prefix>/lib
|
||||
``ILMBASE_DEBUG_SUFFIX``
|
||||
Suffix of the debug version of ilmbase libs. Defaults to "_d".
|
||||
``SYSTEM_LIBRARY_PATHS``
|
||||
Global list of library paths intended to be searched by and find_xxx call
|
||||
``ILMBASE_USE_STATIC_LIBS``
|
||||
Only search for static ilmbase libraries
|
||||
``DISABLE_CMAKE_SEARCH_PATHS``
|
||||
Disable CMakes default search paths for find_xxx calls in this module
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
mark_as_advanced(
|
||||
IlmBase_INCLUDE_DIR
|
||||
IlmBase_LIBRARY
|
||||
)
|
||||
|
||||
set(_FIND_ILMBASE_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
set(_FIND_ILMBASE_ADDITIONAL_OPTIONS NO_DEFAULT_PATH)
|
||||
endif()
|
||||
|
||||
set(_ILMBASE_COMPONENT_LIST
|
||||
Half
|
||||
Iex
|
||||
IexMath
|
||||
IlmThread
|
||||
Imath
|
||||
)
|
||||
|
||||
if(IlmBase_FIND_COMPONENTS)
|
||||
set(ILMBASE_COMPONENTS_PROVIDED TRUE)
|
||||
set(_IGNORED_COMPONENTS "")
|
||||
foreach(COMPONENT ${IlmBase_FIND_COMPONENTS})
|
||||
if(NOT ${COMPONENT} IN_LIST _ILMBASE_COMPONENT_LIST)
|
||||
list(APPEND _IGNORED_COMPONENTS ${COMPONENT})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(_IGNORED_COMPONENTS)
|
||||
message(STATUS "Ignoring unknown components of IlmBase:")
|
||||
foreach(COMPONENT ${_IGNORED_COMPONENTS})
|
||||
message(STATUS " ${COMPONENT}")
|
||||
endforeach()
|
||||
list(REMOVE_ITEM IlmBase_FIND_COMPONENTS ${_IGNORED_COMPONENTS})
|
||||
endif()
|
||||
else()
|
||||
set(ILMBASE_COMPONENTS_PROVIDED FALSE)
|
||||
set(IlmBase_FIND_COMPONENTS ${_ILMBASE_COMPONENT_LIST})
|
||||
endif()
|
||||
|
||||
# Set _ILMBASE_ROOT based on a user provided root var. Xxx_ROOT and ENV{Xxx_ROOT}
|
||||
# are prioritised over the legacy capitalized XXX_ROOT variables for matching
|
||||
# CMake 3.12 behaviour
|
||||
# @todo deprecate -D and ENV ILMBASE_ROOT from CMake 3.12
|
||||
if(IlmBase_ROOT)
|
||||
set(_ILMBASE_ROOT ${IlmBase_ROOT})
|
||||
elseif(DEFINED ENV{IlmBase_ROOT})
|
||||
set(_ILMBASE_ROOT $ENV{IlmBase_ROOT})
|
||||
elseif(ILMBASE_ROOT)
|
||||
set(_ILMBASE_ROOT ${ILMBASE_ROOT})
|
||||
elseif(DEFINED ENV{ILMBASE_ROOT})
|
||||
set(_ILMBASE_ROOT $ENV{ILMBASE_ROOT})
|
||||
endif()
|
||||
|
||||
# Additionally try and use pkconfig to find IlmBase
|
||||
if(USE_PKGCONFIG)
|
||||
if(NOT DEFINED PKG_CONFIG_FOUND)
|
||||
find_package(PkgConfig)
|
||||
endif()
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PC_IlmBase QUIET ilmbase)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for IlmBase include DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
set(_ILMBASE_INCLUDE_SEARCH_DIRS "")
|
||||
list(APPEND _ILMBASE_INCLUDE_SEARCH_DIRS
|
||||
${ILMBASE_INCLUDEDIR}
|
||||
${_ILMBASE_ROOT}
|
||||
${PC_IlmBase_INCLUDEDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Look for a standard IlmBase header file.
|
||||
find_path(IlmBase_INCLUDE_DIR IlmBaseConfig.h
|
||||
${_FIND_ILMBASE_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_ILMBASE_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR}/OpenEXR include/OpenEXR OpenEXR
|
||||
)
|
||||
|
||||
if(EXISTS "${IlmBase_INCLUDE_DIR}/IlmBaseConfig.h")
|
||||
# Get the ILMBASE version information from the config header
|
||||
file(STRINGS "${IlmBase_INCLUDE_DIR}/IlmBaseConfig.h"
|
||||
_ilmbase_version_major_string REGEX "#define ILMBASE_VERSION_MAJOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define ILMBASE_VERSION_MAJOR" ""
|
||||
_ilmbase_version_major_string "${_ilmbase_version_major_string}"
|
||||
)
|
||||
string(STRIP "${_ilmbase_version_major_string}" IlmBase_VERSION_MAJOR)
|
||||
|
||||
file(STRINGS "${IlmBase_INCLUDE_DIR}/IlmBaseConfig.h"
|
||||
_ilmbase_version_minor_string REGEX "#define ILMBASE_VERSION_MINOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define ILMBASE_VERSION_MINOR" ""
|
||||
_ilmbase_version_minor_string "${_ilmbase_version_minor_string}"
|
||||
)
|
||||
string(STRIP "${_ilmbase_version_minor_string}" IlmBase_VERSION_MINOR)
|
||||
|
||||
unset(_ilmbase_version_major_string)
|
||||
unset(_ilmbase_version_minor_string)
|
||||
|
||||
set(IlmBase_VERSION ${IlmBase_VERSION_MAJOR}.${IlmBase_VERSION_MINOR})
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for ILMBASE lib DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(NOT DEFINED ILMBASE_DEBUG_SUFFIX)
|
||||
set(ILMBASE_DEBUG_SUFFIX _d)
|
||||
endif()
|
||||
|
||||
set(_ILMBASE_LIBRARYDIR_SEARCH_DIRS "")
|
||||
|
||||
# Append to _ILMBASE_LIBRARYDIR_SEARCH_DIRS in priority order
|
||||
|
||||
list(APPEND _ILMBASE_LIBRARYDIR_SEARCH_DIRS
|
||||
${ILMBASE_LIBRARYDIR}
|
||||
${_ILMBASE_ROOT}
|
||||
${PC_IlmBase_LIBDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
set(IlmBase_LIB_COMPONENTS "")
|
||||
list(APPEND ILM_BUILD_TYPES RELEASE DEBUG)
|
||||
|
||||
foreach(COMPONENT ${IlmBase_FIND_COMPONENTS})
|
||||
foreach(BUILD_TYPE ${ILM_BUILD_TYPES})
|
||||
|
||||
set(_TMP_SUFFIX "")
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
set(_TMP_SUFFIX ${ILMBASE_DEBUG_SUFFIX})
|
||||
endif()
|
||||
|
||||
set(_IlmBase_Version_Suffix "-${IlmBase_VERSION_MAJOR}_${IlmBase_VERSION_MINOR}")
|
||||
set(_ILMBASE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
if(WIN32)
|
||||
if(ILMBASE_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_TMP_SUFFIX}.lib")
|
||||
endif()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.lib")
|
||||
else()
|
||||
if(ILMBASE_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_TMP_SUFFIX}.a")
|
||||
else()
|
||||
if(APPLE)
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.dylib")
|
||||
else()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.so")
|
||||
endif()
|
||||
endif()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.a")
|
||||
endif()
|
||||
|
||||
# Find the lib
|
||||
find_library(IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${COMPONENT}
|
||||
${_FIND_ILMBASE_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_ILMBASE_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
|
||||
)
|
||||
|
||||
if(EXISTS ${IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
|
||||
list(APPEND IlmBase_LIB_COMPONENTS ${IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
|
||||
list(APPEND IlmBase_LIB_COMPONENTS_${BUILD_TYPE} ${IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
|
||||
endif()
|
||||
|
||||
# Reset library suffix
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_ILMBASE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
unset(_ILMBASE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
unset(_IlmBase_Version_Suffix)
|
||||
unset(_TMP_SUFFIX)
|
||||
endforeach()
|
||||
|
||||
if(IlmBase_${COMPONENT}_LIBRARY_DEBUG AND IlmBase_${COMPONENT}_LIBRARY_RELEASE)
|
||||
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||
# single-config generators, set optimized and debug libraries
|
||||
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(_isMultiConfig OR CMAKE_BUILD_TYPE)
|
||||
set(IlmBase_${COMPONENT}_LIBRARY optimized ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} debug ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
else()
|
||||
# For single-config generators where CMAKE_BUILD_TYPE has no value,
|
||||
# just use the release libraries
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
# FIXME: This probably should be set for both cases
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES optimized ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} debug ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# if only the release version was found, set the debug variable also to the release version
|
||||
if(IlmBase_${COMPONENT}_LIBRARY_RELEASE AND NOT IlmBase_${COMPONENT}_LIBRARY_DEBUG)
|
||||
set(IlmBase_${COMPONENT}_LIBRARY_DEBUG ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
|
||||
# if only the debug version was found, set the release variable also to the debug version
|
||||
if(IlmBase_${COMPONENT}_LIBRARY_DEBUG AND NOT IlmBase_${COMPONENT}_LIBRARY_RELEASE)
|
||||
set(IlmBase_${COMPONENT}_LIBRARY_RELEASE ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# If the debug & release library ends up being the same, omit the keywords
|
||||
if("${IlmBase_${COMPONENT}_LIBRARY_RELEASE}" STREQUAL "${IlmBase_${COMPONENT}_LIBRARY_DEBUG}")
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} )
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} )
|
||||
endif()
|
||||
|
||||
if(IlmBase_${COMPONENT}_LIBRARY)
|
||||
set(IlmBase_${COMPONENT}_FOUND TRUE)
|
||||
else()
|
||||
set(IlmBase_${COMPONENT}_FOUND FALSE)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Cache and set ILMBASE_FOUND
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(IlmBase
|
||||
FOUND_VAR IlmBase_FOUND
|
||||
REQUIRED_VARS
|
||||
IlmBase_INCLUDE_DIR
|
||||
IlmBase_LIB_COMPONENTS
|
||||
VERSION_VAR IlmBase_VERSION
|
||||
HANDLE_COMPONENTS
|
||||
)
|
||||
|
||||
if(NOT IlmBase_FOUND)
|
||||
if(IlmBase_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Unable to find IlmBase")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Partition release/debug lib vars
|
||||
|
||||
set(IlmBase_RELEASE_LIBRARIES "")
|
||||
set(IlmBase_RELEASE_LIBRARY_DIRS "")
|
||||
set(IlmBase_DEBUG_LIBRARIES "")
|
||||
set(IlmBase_DEBUG_LIBRARY_DIRS "")
|
||||
foreach(LIB ${IlmBase_LIB_COMPONENTS_RELEASE})
|
||||
get_filename_component(_ILM_LIBDIR ${LIB} DIRECTORY)
|
||||
list(APPEND IlmBase_RELEASE_LIBRARIES ${LIB})
|
||||
list(APPEND IlmBase_RELEASE_LIBRARY_DIRS ${_ILM_LIBDIR})
|
||||
endforeach()
|
||||
|
||||
foreach(LIB ${IlmBase_LIB_COMPONENTS_DEBUG})
|
||||
get_filename_component(_ILM_LIBDIR ${LIB} DIRECTORY)
|
||||
list(APPEND IlmBase_DEBUG_LIBRARIES ${LIB})
|
||||
list(APPEND IlmBase_DEBUG_LIBRARY_DIRS ${_ILM_LIBDIR})
|
||||
endforeach()
|
||||
|
||||
list(REMOVE_DUPLICATES IlmBase_RELEASE_LIBRARY_DIRS)
|
||||
list(REMOVE_DUPLICATES IlmBase_DEBUG_LIBRARY_DIRS)
|
||||
|
||||
set(IlmBase_LIBRARIES ${IlmBase_RELEASE_LIBRARIES})
|
||||
set(IlmBase_LIBRARY_DIRS ${IlmBase_RELEASE_LIBRARY_DIRS})
|
||||
|
||||
# We have to add both include and include/OpenEXR to the include
|
||||
# path in case OpenEXR and IlmBase are installed separately.
|
||||
#
|
||||
# Make sure we get the absolute path to avoid issues where
|
||||
# /usr/include/OpenEXR/../ is picked up and passed to gcc from cmake
|
||||
# which won't correctly compute /usr/include as an implicit system
|
||||
# dir if the path is relative:
|
||||
#
|
||||
# https://github.com/AcademySoftwareFoundation/openvdb/issues/632
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129
|
||||
|
||||
set(_IlmBase_Parent_Dir "")
|
||||
get_filename_component(_IlmBase_Parent_Dir
|
||||
${IlmBase_INCLUDE_DIR}/../ ABSOLUTE)
|
||||
|
||||
set(IlmBase_INCLUDE_DIRS)
|
||||
list(APPEND IlmBase_INCLUDE_DIRS
|
||||
${_IlmBase_Parent_Dir}
|
||||
${IlmBase_INCLUDE_DIR}
|
||||
)
|
||||
unset(_IlmBase_Parent_Dir)
|
||||
|
||||
# Configure imported targets
|
||||
|
||||
foreach(COMPONENT ${IlmBase_FIND_COMPONENTS})
|
||||
# Configure lib type. If XXX_USE_STATIC_LIBS, we always assume a static
|
||||
# lib is in use. If win32, we can't mark the import .libs as shared, so
|
||||
# these are always marked as UNKNOWN. Otherwise, infer from extension.
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE UNKNOWN)
|
||||
if(ILMBASE_USE_STATIC_LIBS)
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE STATIC)
|
||||
elseif(UNIX)
|
||||
get_filename_component(_ILMBASE_${COMPONENT}_EXT ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} EXT)
|
||||
if(${_ILMBASE_${COMPONENT}_EXT} STREQUAL ".a")
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE STATIC)
|
||||
elseif(${_ILMBASE_${COMPONENT}_EXT} STREQUAL ".so" OR
|
||||
${_ILMBASE_${COMPONENT}_EXT} STREQUAL ".dylib")
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE SHARED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(IlmBase_${COMPONENT}_DEFINITIONS)
|
||||
|
||||
# Add the OPENEXR_DLL define if the library is not static on WIN32
|
||||
if(WIN32)
|
||||
if(NOT ILMBASE_${COMPONENT}_LIB_TYPE STREQUAL STATIC)
|
||||
list(APPEND IlmBase_${COMPONENT}_DEFINITIONS OPENEXR_DLL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET IlmBase::${COMPONENT})
|
||||
add_library(IlmBase::${COMPONENT} ${ILMBASE_${COMPONENT}_LIB_TYPE} IMPORTED)
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
INTERFACE_COMPILE_OPTIONS "${PC_IlmBase_CFLAGS_OTHER}"
|
||||
INTERFACE_COMPILE_DEFINITIONS "${IlmBase_${COMPONENT}_DEFINITIONS}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}")
|
||||
|
||||
# Standard location
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${IlmBase_${COMPONENT}_LIBRARY}")
|
||||
|
||||
# Release location
|
||||
if(EXISTS "${IlmBase_${COMPONENT}_LIBRARY_RELEASE}")
|
||||
set_property(TARGET IlmBase::${COMPONENT} APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
|
||||
IMPORTED_LOCATION_RELEASE "${IlmBase_${COMPONENT}_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
# Debug location
|
||||
if(EXISTS "${IlmBase_${COMPONENT}_LIBRARY_DEBUG}")
|
||||
set_property(TARGET IlmBase::${COMPONENT} APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
|
||||
IMPORTED_LOCATION_DEBUG "${IlmBase_${COMPONENT}_LIBRARY_DEBUG}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -64,7 +64,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -87,7 +87,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
include (FindPackageHandleStandardArgs)
|
||||
|
||||
if(NCCL_ROOT)
|
||||
set(_NCCL_ROOT ${NCCL_ROOT})
|
||||
elseif(DEFINED ENV{NCCL_ROOT})
|
||||
set(_NCCL_ROOT $ENV{NCCL_ROOT})
|
||||
endif()
|
||||
|
||||
set(_NCCL_INCLUDE_SEARCH_DIRS "")
|
||||
list(APPEND _NCCL_INCLUDE_SEARCH_DIRS
|
||||
${_NCCL_ROOT}/include
|
||||
)
|
||||
find_path(NCCL_INCLUDE_DIR
|
||||
NAMES nccl.h
|
||||
PATHS ${_NCCL_INCLUDE_SEARCH_DIRS}
|
||||
)
|
||||
|
||||
set(_NCCL_LIBRARY_SEARCH_DIRS "")
|
||||
list(APPEND _NCCL_LIBRARY_SEARCH_DIRS
|
||||
${_NCCL_ROOT}/bin
|
||||
)
|
||||
find_library(NCCL_LIBRARY
|
||||
NAMES nccl
|
||||
PATHS ${_NCCL_LIBRARY_SEARCH_DIRS}
|
||||
)
|
||||
|
||||
find_package_handle_standard_args(NCCL REQUIRED_VARS NCCL_INCLUDE_DIR NCCL_LIBRARY)
|
||||
|
||||
if (NCCL_FOUND)
|
||||
mark_as_advanced(NCCL_INCLUDE_DIR)
|
||||
mark_as_advanced(NCCL_LIBRARY)
|
||||
endif()
|
||||
|
||||
if (NCCL_FOUND AND NOT TARGET NCCL::NCCL)
|
||||
add_library(NCCL::NCCL SHARED IMPORTED)
|
||||
if(MSVC)
|
||||
string(REPLACE ".lib" ".dll" NCCL_DLL ${NCCL_LIBRARY})
|
||||
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_LOCATION ${NCCL_DLL})
|
||||
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_IMPLIB ${NCCL_LIBRARY})
|
||||
else()
|
||||
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_LOCATION ${NCCL_LIBRARY})
|
||||
endif()
|
||||
target_include_directories(NCCL::NCCL INTERFACE ${NCCL_INCLUDE_DIR})
|
||||
endif()
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -93,7 +93,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
+61
-32
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -64,8 +64,6 @@ This will define the following variables:
|
||||
True if the OpenVDB Library has been built with log4cplus support
|
||||
``OpenVDB_USES_IMATH_HALF``
|
||||
True if the OpenVDB Library has been built with Imath half support
|
||||
``OpenVDB_USES_DELAYED_LOADING``
|
||||
True if the OpenVDB Library has been built with delayed-loading
|
||||
``OpenVDB_ABI``
|
||||
Set if this module was able to determine the ABI number the located
|
||||
OpenVDB Library was built against. Unset otherwise.
|
||||
@@ -109,7 +107,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
@@ -334,8 +332,10 @@ set(_OPENVDB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
set(OPENVDB_PYTHON_PATH_SUFFIXES
|
||||
lib64/python
|
||||
lib64/python2.7
|
||||
lib64/python3
|
||||
lib/python
|
||||
lib/python2.7
|
||||
lib/python3
|
||||
)
|
||||
|
||||
@@ -392,9 +392,6 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
||||
elseif(${COMPONENT} STREQUAL "openvdb_je")
|
||||
# alias to the result of openvdb which should be handled first
|
||||
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_openvdb_LIBRARY})
|
||||
elseif(${COMPONENT} STREQUAL "nanovdb")
|
||||
# alias to the result of openvdb which should be handled first
|
||||
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_openvdb_LIBRARY})
|
||||
else()
|
||||
find_library(OpenVDB_${COMPONENT}_LIBRARY ${LIB_NAME}
|
||||
${_FIND_OPENVDB_ADDITIONAL_OPTIONS}
|
||||
@@ -490,10 +487,46 @@ endif()
|
||||
|
||||
find_package(TBB REQUIRED COMPONENTS tbb)
|
||||
|
||||
if(NOT OPENVDB_USE_STATIC_LIBS AND NOT Boost_USE_STATIC_LIBS)
|
||||
# @note Both of these must be set for Boost 1.70 (VFX2020) to link against
|
||||
# boost shared libraries (more specifically libraries built with -fPIC).
|
||||
# http://boost.2283326.n4.nabble.com/CMake-config-scripts-broken-in-1-70-td4708957.html
|
||||
# https://github.com/boostorg/boost_install/commit/160c7cb2b2c720e74463865ef0454d4c4cd9ae7c
|
||||
set(BUILD_SHARED_LIBS ON)
|
||||
set(Boost_USE_STATIC_LIBS OFF)
|
||||
endif()
|
||||
|
||||
find_package(Boost REQUIRED COMPONENTS iostreams)
|
||||
|
||||
# Add deps for pyopenvdb
|
||||
# @todo track for numpy
|
||||
|
||||
if(pyopenvdb IN_LIST OpenVDB_FIND_COMPONENTS)
|
||||
find_package(Python REQUIRED)
|
||||
|
||||
# Boost python handling - try and find both python and pythonXx (version suffixed).
|
||||
# Prioritize the version suffixed library, failing if neither exist.
|
||||
|
||||
find_package(Boost ${MINIMUM_BOOST_VERSION}
|
||||
QUIET COMPONENTS python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}
|
||||
)
|
||||
|
||||
if(TARGET Boost::python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR})
|
||||
set(BOOST_PYTHON_LIB "python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
|
||||
message(STATUS "Found boost_python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
|
||||
else()
|
||||
find_package(Boost ${MINIMUM_BOOST_VERSION} QUIET COMPONENTS python)
|
||||
if(TARGET Boost::python)
|
||||
set(BOOST_PYTHON_LIB "python")
|
||||
message(STATUS "Found non-suffixed boost_python, assuming to be python version "
|
||||
"\"${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}\" compatible"
|
||||
)
|
||||
else()
|
||||
message(FATAL_ERROR "Unable to find boost_python or "
|
||||
"boost_python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add deps for openvdb_ax
|
||||
@@ -522,7 +555,6 @@ set(OpenVDB_USES_BLOSC ${USE_BLOSC})
|
||||
set(OpenVDB_USES_ZLIB ${USE_ZLIB})
|
||||
set(OpenVDB_USES_LOG4CPLUS ${USE_LOG4CPLUS})
|
||||
set(OpenVDB_USES_IMATH_HALF ${USE_IMATH_HALF})
|
||||
set(OpenVDB_USES_DELAYED_LOADING ${OPENVDB_USE_DELAYED_LOADING})
|
||||
set(OpenVDB_DEFINITIONS)
|
||||
|
||||
if(WIN32)
|
||||
@@ -555,7 +587,6 @@ if(_OPENVDB_HAS_NEW_VERSION_HEADER)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_IMATH_HALF" OpenVDB_USES_IMATH_HALF)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_BLOSC" OpenVDB_USES_BLOSC)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_ZLIB" OpenVDB_USES_ZLIB)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_DELAYED_LOADING" OpenVDB_USES_DELAYED_LOADING)
|
||||
elseif(NOT OPENVDB_USE_STATIC_LIBS)
|
||||
# Use GetPrerequisites to see which libraries this OpenVDB lib has linked to
|
||||
# which we can query for optional deps. This basically runs ldd/otoll/objdump
|
||||
@@ -602,11 +633,6 @@ elseif(NOT OPENVDB_USE_STATIC_LIBS)
|
||||
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||
set(OpenVDB_USES_IMATH_HALF ON)
|
||||
endif()
|
||||
|
||||
string(FIND ${PREREQUISITE} "boost_iostreams" _HAS_DEP)
|
||||
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||
set(OpenVDB_USES_DELAYED_LOADING ON)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
unset(_OPENVDB_PREREQUISITE_LIST)
|
||||
@@ -625,11 +651,19 @@ if(OpenVDB_USES_LOG4CPLUS)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_IMATH_HALF)
|
||||
find_package(Imath REQUIRED CONFIG)
|
||||
endif()
|
||||
find_package(Imath CONFIG)
|
||||
if (NOT TARGET Imath::Imath)
|
||||
find_package(IlmBase REQUIRED COMPONENTS Half)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_DELAYED_LOADING)
|
||||
find_package(Boost REQUIRED COMPONENTS iostreams)
|
||||
if(WIN32)
|
||||
# @note OPENVDB_OPENEXR_STATICLIB is old functionality and should be removed
|
||||
if(OPENEXR_USE_STATIC_LIBS OR
|
||||
("${ILMBASE_LIB_TYPE}" STREQUAL "STATIC_LIBRARY") OR
|
||||
("${IMATH_LIB_TYPE}" STREQUAL "STATIC_LIBRARY"))
|
||||
list(APPEND OpenVDB_DEFINITIONS OPENVDB_OPENEXR_STATICLIB)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
@@ -637,19 +671,14 @@ if(UNIX)
|
||||
endif()
|
||||
|
||||
# Set deps. Note that the order here is important. If we're building against
|
||||
# Houdini we must include Imath deps first to ensure the users chosen
|
||||
# Houdini 17.5 we must include IlmBase deps first to ensure the users chosen
|
||||
# namespaced headers are correctly prioritized. Otherwise other include paths
|
||||
# from shared installs (including houdini) may pull in the wrong headers
|
||||
|
||||
set(_OPENVDB_VISIBLE_DEPENDENCIES "")
|
||||
|
||||
if(OpenVDB_USES_DELAYED_LOADING)
|
||||
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES Boost::iostreams)
|
||||
list(APPEND OpenVDB_DEFINITIONS OPENVDB_USE_DELAYED_LOADING)
|
||||
endif()
|
||||
set(_OPENVDB_VISIBLE_DEPENDENCIES Boost::iostreams)
|
||||
|
||||
if(OpenVDB_USES_IMATH_HALF)
|
||||
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES Imath::Imath)
|
||||
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES $<TARGET_NAME_IF_EXISTS:IlmBase::Half> $<TARGET_NAME_IF_EXISTS:Imath::Imath>)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_LOG4CPLUS)
|
||||
@@ -720,7 +749,7 @@ if(NOT TARGET OpenVDB::openvdb)
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_INCLUDE_DIR}"
|
||||
IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps
|
||||
INTERFACE_LINK_LIBRARIES "${_OPENVDB_VISIBLE_DEPENDENCIES}" # visible deps (headers)
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -742,8 +771,8 @@ if(OpenVDB_pyopenvdb_LIBRARY)
|
||||
set_target_properties(OpenVDB::pyopenvdb PROPERTIES
|
||||
IMPORTED_LOCATION "${OpenVDB_pyopenvdb_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_pyopenvdb_INCLUDE_DIR};${PYTHON_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;${PYTHON_LIBRARIES}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;Boost::${BOOST_PYTHON_LIB};${PYTHON_LIBRARIES}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -757,7 +786,7 @@ if(OpenVDB_openvdb_houdini_LIBRARY)
|
||||
IMPORTED_LOCATION "${OpenVDB_openvdb_houdini_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_openvdb_houdini_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;Houdini"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -787,7 +816,7 @@ if(OpenVDB_openvdb_ax_LIBRARY)
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_openvdb_ax_INCLUDE_DIR}"
|
||||
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIRS}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;${LLVM_LIBS}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -801,7 +830,7 @@ if(OpenVDB_nanovdb_LIBRARY)
|
||||
IMPORTED_LOCATION "${OpenVDB_nanovdb_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_nanovdb_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
+31
-68
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -34,7 +34,7 @@ This will define the following variables:
|
||||
|
||||
``Tbb_FOUND``
|
||||
True if the system has the Tbb library.
|
||||
``Tbb_VERSION`` ``TBB_VERSION``
|
||||
``Tbb_VERSION``
|
||||
The version of the Tbb library which was found.
|
||||
``Tbb_INCLUDE_DIRS``
|
||||
Include directories needed to use Tbb.
|
||||
@@ -93,7 +93,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
@@ -162,72 +162,51 @@ list(APPEND _TBB_INCLUDE_SEARCH_DIRS
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
if(NOT Tbb_INCLUDE_DIR)
|
||||
# Look for a legacy tbb header file.
|
||||
find_path(Tbb_LEGACY_INCLUDE_DIR tbb/tbb_stddef.h
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
else()
|
||||
set(Tbb_LEGACY_INCLUDE_DIR ${Tbb_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
# Look for a new tbb header installation
|
||||
# From TBB 2021, tbb_stddef is removed and the directory include/tbb is
|
||||
# simply an alias for include/oneapi/tbb. Try and find the version header
|
||||
# in oneapi/tbb
|
||||
find_path(Tbb_INCLUDE_DIR oneapi/tbb/version.h
|
||||
# Look for a standard tbb header file.
|
||||
find_path(Tbb_INCLUDE_DIR tbb/tbb_stddef.h
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
|
||||
set(_tbb_legacy_version_file "${Tbb_LEGACY_INCLUDE_DIR}/tbb/tbb_stddef.h")
|
||||
set(_tbb_version_file "${Tbb_INCLUDE_DIR}/oneapi/tbb/version.h")
|
||||
set(_tbb_version_file "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h")
|
||||
|
||||
if(EXISTS ${_tbb_legacy_version_file})
|
||||
if(EXISTS ${_tbb_version_file})
|
||||
message(WARNING "
|
||||
FindTBB located both an old and new tbb installation.
|
||||
old: ${_tbb_legacy_version_file}
|
||||
new: ${_tbb_version_file}
|
||||
The NEWER versioned installation will be used. You can set TBB_INCLUDEDIR
|
||||
to control FindTBB.cmake search, or explicitly set Tbb_INCLUDE_DIR to the
|
||||
desired location.
|
||||
")
|
||||
else()
|
||||
set(_tbb_version_file "${_tbb_legacy_version_file}")
|
||||
set(Tbb_INCLUDE_DIR ${Tbb_LEGACY_INCLUDE_DIR} CACHE STRING "" FORCE)
|
||||
endif()
|
||||
if(NOT EXISTS ${_tbb_version_file})
|
||||
# From TBB 2021, tbb_stddef is removed and the directory include/tbb is
|
||||
# simply an alias for include/oneapi/tbb. Try and find the version header
|
||||
# in oneapi/tbb
|
||||
find_path(Tbb_INCLUDE_DIR oneapi/tbb/version.h
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
set(_tbb_version_file "${Tbb_INCLUDE_DIR}/oneapi/tbb/version.h")
|
||||
endif()
|
||||
|
||||
|
||||
if(EXISTS ${_tbb_version_file})
|
||||
file(STRINGS ${_tbb_version_file} _tbb_version_major_string REGEX "#define TBB_VERSION_MAJOR " )
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MAJOR" "" _tbb_version_major_string "${_tbb_version_major_string}")
|
||||
file(STRINGS ${_tbb_version_file}
|
||||
_tbb_version_major_string REGEX "#define TBB_VERSION_MAJOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MAJOR" ""
|
||||
_tbb_version_major_string "${_tbb_version_major_string}"
|
||||
)
|
||||
string(STRIP "${_tbb_version_major_string}" Tbb_VERSION_MAJOR)
|
||||
|
||||
file(STRINGS ${_tbb_version_file} _tbb_version_minor_string REGEX "#define TBB_VERSION_MINOR ")
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MINOR" "" _tbb_version_minor_string "${_tbb_version_minor_string}")
|
||||
file(STRINGS ${_tbb_version_file}
|
||||
_tbb_version_minor_string REGEX "#define TBB_VERSION_MINOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MINOR" ""
|
||||
_tbb_version_minor_string "${_tbb_version_minor_string}"
|
||||
)
|
||||
string(STRIP "${_tbb_version_minor_string}" Tbb_VERSION_MINOR)
|
||||
|
||||
file(STRINGS ${_tbb_version_file} _tbb_binary_version_string REGEX "#define __TBB_BINARY_VERSION ")
|
||||
string(REGEX REPLACE "#define __TBB_BINARY_VERSION" "" _tbb_binary_version_string "${_tbb_binary_version_string}")
|
||||
string(STRIP "${_tbb_binary_version_string}" Tbb_BINARY_VERSION)
|
||||
|
||||
unset(_tbb_version_major_string)
|
||||
unset(_tbb_version_minor_string)
|
||||
unset(_tbb_binary_version_string)
|
||||
|
||||
# Set both for compatibility reasons, TBB's CONFIG files only set the latter
|
||||
set(Tbb_VERSION ${Tbb_VERSION_MAJOR}.${Tbb_VERSION_MINOR})
|
||||
set(TBB_VERSION ${Tbb_VERSION})
|
||||
endif()
|
||||
|
||||
unset(_tbb_version_file)
|
||||
unset(_tbb_legacy_version_file)
|
||||
unset(Tbb_LEGACY_INCLUDE_DIR)
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for TBB lib DIR
|
||||
@@ -276,22 +255,8 @@ foreach(COMPONENT ${TBB_FIND_COMPONENTS})
|
||||
find_library(Tbb_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${_TBB_LIB_NAME}
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
|
||||
# If we didn't find the library, prepend Tbb_BINARY_VERSION to each possible
|
||||
# component name and try again. As of TBB 2021, TBB decides to version some
|
||||
# of its libraries on some of its platforms...
|
||||
if(NOT Tbb_${COMPONENT}_LIBRARY_${BUILD_TYPE} AND Tbb_BINARY_VERSION)
|
||||
set(_TBB_LIB_NAME "${COMPONENT}${Tbb_BINARY_VERSION}")
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
set(_TBB_LIB_NAME "${_TBB_LIB_NAME}${TBB_DEBUG_SUFFIX}")
|
||||
endif()
|
||||
|
||||
find_library(Tbb_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${_TBB_LIB_NAME}
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
endif()
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
|
||||
)
|
||||
|
||||
# On Unix, TBB sometimes uses linker scripts instead of symlinks, so parse the linker script
|
||||
# and correct the library name if so
|
||||
@@ -461,9 +426,7 @@ foreach(COMPONENT ${TBB_FIND_COMPONENTS})
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(TBB::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
|
||||
IMPORTED_LOCATION_RELEASE "${Tbb_${COMPONENT}_LIBRARY_RELEASE}"
|
||||
MAP_IMPORTED_CONFIG_MINSIZEREL Release
|
||||
MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release)
|
||||
IMPORTED_LOCATION_RELEASE "${Tbb_${COMPONENT}_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
# Debug location
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -47,7 +47,7 @@ The following variables may be provided to tell this module where to look.
|
||||
# Find the glfw3 installation and use glfw's CMake to initialize
|
||||
# the glfw lib
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
set(_FIND_GLFW3_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
@@ -109,11 +109,16 @@ endif()
|
||||
set(glfw3_FIND_VERSION ${MINIMUM_GLFW_VERSION})
|
||||
find_package(glfw3 ${MINIMUM_GLFW_VERSION} REQUIRED)
|
||||
|
||||
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_GLFW_VERSION)
|
||||
if(glfw3_VERSION VERSION_LESS ${FUTURE_MINIMUM_GLFW_VERSION})
|
||||
message(DEPRECATION "Support for GLFW versions < ${FUTURE_MINIMUM_GLFW_VERSION} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
# We only use find_package_handle_standard_args to verify and print
|
||||
# appropriate messages. This now explicitly errors in 3.19...
|
||||
# @todo Improve this entire GLFW3 search
|
||||
# https://gitlab.kitware.com/cmake/cmake/-/issues/21505
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.19)
|
||||
find_package(PackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(glfw3
|
||||
REQUIRED_VARS glfw3_DIR glfw3_FOUND
|
||||
VERSION_VAR glfw3_VERSION
|
||||
)
|
||||
endif()
|
||||
|
||||
unset(glfw3_FIND_VERSION)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -49,6 +49,8 @@ overwrite user provided values.
|
||||
``ZLIB_LIBRARY``
|
||||
``OPENEXR_INCLUDEDIR``
|
||||
``OPENEXR_LIBRARYDIR``
|
||||
``ILMBASE_INCLUDEDIR``
|
||||
``ILMBASE_LIBRARYDIR``
|
||||
``TBB_INCLUDEDIR``
|
||||
``TBB_LIBRARYDIR``
|
||||
``BLOSC_INCLUDEDIR``
|
||||
@@ -73,7 +75,7 @@ may be provided to tell this module where to look.
|
||||
# Find the Houdini installation and use Houdini's CMake to initialize
|
||||
# the Houdini lib
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
# Include utility functions for version information
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake)
|
||||
@@ -288,11 +290,7 @@ endif()
|
||||
|
||||
# Jemalloc
|
||||
|
||||
# * On Mac OSX, linking against Jemalloc < 4.3.0 seg-faults with this error:
|
||||
# malloc: *** malloc_zone_unregister() failed for 0xaddress
|
||||
# As of Houdini 20, it still ships with Jemalloc 3.6.0, so don't expose it
|
||||
# on Mac OSX (https://github.com/jemalloc/jemalloc/issues/420).
|
||||
if(NOT APPLE AND NOT JEMALLOC_LIBRARYDIR)
|
||||
if(NOT JEMALLOC_LIBRARYDIR)
|
||||
set(JEMALLOC_LIBRARYDIR ${HOUDINI_LIB_DIR})
|
||||
endif()
|
||||
|
||||
@@ -305,10 +303,21 @@ if(NOT OPENEXR_LIBRARYDIR)
|
||||
set(OPENEXR_LIBRARYDIR ${HOUDINI_LIB_DIR})
|
||||
endif()
|
||||
|
||||
# IlmBase
|
||||
|
||||
if(NOT ILMBASE_INCLUDEDIR)
|
||||
set(ILMBASE_INCLUDEDIR ${HOUDINI_INCLUDE_DIR})
|
||||
endif()
|
||||
if(NOT ILMBASE_LIBRARYDIR)
|
||||
set(ILMBASE_LIBRARYDIR ${HOUDINI_LIB_DIR})
|
||||
endif()
|
||||
|
||||
# Boost - currently must be provided as VDB is not fully configured to
|
||||
# use Houdini's namespaced hboost
|
||||
|
||||
# Versions of Houdini >= 17.5 have some namespaced libraries (IlmBase/OpenEXR).
|
||||
# Add the required suffix as part of the cmake lib suffix searches
|
||||
|
||||
if(APPLE)
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "_sidefx.dylib")
|
||||
elseif(UNIX)
|
||||
@@ -324,82 +333,87 @@ endif()
|
||||
# Explicitly configure the OpenVDB ABI version depending on the Houdini
|
||||
# version.
|
||||
|
||||
find_file(_houdini_openvdb_version_file "openvdb/version.h"
|
||||
PATHS ${HOUDINI_INCLUDE_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(_houdini_openvdb_version_file)
|
||||
OPENVDB_VERSION_FROM_HEADER("${_houdini_openvdb_version_file}"
|
||||
ABI OPENVDB_HOUDINI_ABI)
|
||||
endif()
|
||||
unset(_houdini_openvdb_version_file)
|
||||
if(NOT OPENVDB_HOUDINI_ABI)
|
||||
message(WARNING "Unknown version of Houdini, assuming OpenVDB ABI=${OpenVDB_MAJOR_VERSION}, "
|
||||
"but if this not correct, the CMake flag -DOPENVDB_HOUDINI_ABI=<N> can override this value.")
|
||||
set(OPENVDB_HOUDINI_ABI ${OpenVDB_MAJOR_VERSION})
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Configure libstc++ CXX11 ABI
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
# Assume we're using libstdc++
|
||||
message(STATUS "Configuring CXX11 ABI for Houdini compatibility...")
|
||||
|
||||
execute_process(COMMAND echo "#include <string>"
|
||||
COMMAND ${CMAKE_CXX_COMPILER} "-x" "c++" "-E" "-dM" "-"
|
||||
COMMAND grep "-F" "_GLIBCXX_USE_CXX11_ABI"
|
||||
TIMEOUT 10
|
||||
RESULT_VARIABLE QUERIED_GCC_CXX11_ABI_SUCCESS
|
||||
OUTPUT_VARIABLE _GCC_CXX11_ABI)
|
||||
|
||||
set(GLIBCXX_USE_CXX11_ABI "UNKNOWN")
|
||||
|
||||
if(NOT QUERIED_GCC_CXX11_ABI_SUCCESS)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 0" GCC_OLD_CXX11_ABI)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 1" GCC_NEW_CXX11_ABI)
|
||||
if(NOT (${GCC_OLD_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 0)
|
||||
endif()
|
||||
if(NOT (${GCC_NEW_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 1)
|
||||
endif()
|
||||
if(Houdini_VERSION_MAJOR_MINOR VERSION_EQUAL 18.5)
|
||||
set(OPENVDB_HOUDINI_ABI 7)
|
||||
else()
|
||||
find_file(_houdini_openvdb_version_file "openvdb/version.h"
|
||||
PATHS ${HOUDINI_INCLUDE_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(_houdini_openvdb_version_file)
|
||||
OPENVDB_VERSION_FROM_HEADER("${_houdini_openvdb_version_file}"
|
||||
ABI OPENVDB_HOUDINI_ABI)
|
||||
endif()
|
||||
unset(_houdini_openvdb_version_file)
|
||||
if(NOT OPENVDB_HOUDINI_ABI)
|
||||
message(WARNING "Unknown version of Houdini, assuming OpenVDB ABI=${OpenVDB_MAJOR_VERSION}, "
|
||||
"but if this not correct, the CMake flag -DOPENVDB_HOUDINI_ABI=<N> can override this value.")
|
||||
set(OPENVDB_HOUDINI_ABI ${OpenVDB_MAJOR_VERSION})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Try and query the Houdini CXX11 ABI. Allow it to be provided by users to
|
||||
# override this logic should Houdini's CMake ever change
|
||||
# ------------------------------------------------------------------------
|
||||
# Configure GCC CXX11 ABI
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(NOT DEFINED HOUDINI_CXX11_ABI)
|
||||
get_target_property(houdini_interface_compile_options
|
||||
Houdini INTERFACE_COMPILE_OPTIONS)
|
||||
set(HOUDINI_CXX11_ABI "UNKNOWN")
|
||||
if("-D_GLIBCXX_USE_CXX11_ABI=0" IN_LIST houdini_interface_compile_options)
|
||||
set(HOUDINI_CXX11_ABI 0)
|
||||
elseif("-D_GLIBCXX_USE_CXX11_ABI=1" IN_LIST houdini_interface_compile_options)
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
if((CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1) OR
|
||||
(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.1))
|
||||
message(STATUS "GCC >= 5.1 detected. Configuring GCC CXX11 ABI for Houdini compatibility...")
|
||||
|
||||
execute_process(COMMAND echo "#include <string>"
|
||||
COMMAND ${CMAKE_CXX_COMPILER} "-x" "c++" "-E" "-dM" "-"
|
||||
COMMAND grep "-F" "_GLIBCXX_USE_CXX11_ABI"
|
||||
TIMEOUT 10
|
||||
RESULT_VARIABLE QUERIED_GCC_CXX11_ABI_SUCCESS
|
||||
OUTPUT_VARIABLE _GCC_CXX11_ABI)
|
||||
|
||||
set(GLIBCXX_USE_CXX11_ABI "UNKNOWN")
|
||||
|
||||
if(NOT QUERIED_GCC_CXX11_ABI_SUCCESS)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 0" GCC_OLD_CXX11_ABI)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 1" GCC_NEW_CXX11_ABI)
|
||||
if(NOT (${GCC_OLD_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 0)
|
||||
endif()
|
||||
if(NOT (${GCC_NEW_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Try and query the Houdini CXX11 ABI. Allow it to be provided by users to
|
||||
# override this logic should Houdini's CMake ever change
|
||||
|
||||
if(NOT DEFINED HOUDINI_CXX11_ABI)
|
||||
get_target_property(houdini_interface_compile_options
|
||||
Houdini INTERFACE_COMPILE_OPTIONS)
|
||||
set(HOUDINI_CXX11_ABI "UNKNOWN")
|
||||
if("-D_GLIBCXX_USE_CXX11_ABI=0" IN_LIST houdini_interface_compile_options)
|
||||
set(HOUDINI_CXX11_ABI 0)
|
||||
elseif("-D_GLIBCXX_USE_CXX11_ABI=1" IN_LIST houdini_interface_compile_options)
|
||||
set(HOUDINI_CXX11_ABI 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
message(STATUS " GCC CXX11 ABI : ${GLIBCXX_USE_CXX11_ABI}")
|
||||
message(STATUS " Houdini CXX11 ABI : ${HOUDINI_CXX11_ABI}")
|
||||
|
||||
if(${HOUDINI_CXX11_ABI} STREQUAL "UNKNOWN")
|
||||
message(WARNING "Unable to determine Houdini CXX11 ABI. Assuming newer ABI "
|
||||
"has been used.")
|
||||
set(HOUDINI_CXX11_ABI 1)
|
||||
endif()
|
||||
|
||||
if(${GLIBCXX_USE_CXX11_ABI} EQUAL ${HOUDINI_CXX11_ABI})
|
||||
message(STATUS " Current CXX11 ABI matches Houdini configuration "
|
||||
"(_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}).")
|
||||
else()
|
||||
message(WARNING "A potential mismatch was detected between the CXX11 ABI "
|
||||
"of GCC and Houdini. The following ABI configuration will be used: "
|
||||
"-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}. See: "
|
||||
"https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html and "
|
||||
"https://vfxplatform.com/#footnote-gcc6 for more information.")
|
||||
endif()
|
||||
|
||||
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI})
|
||||
endif()
|
||||
|
||||
message(STATUS " GNU CXX11 ABI : ${GLIBCXX_USE_CXX11_ABI}")
|
||||
message(STATUS " Houdini CXX11 ABI : ${HOUDINI_CXX11_ABI}")
|
||||
|
||||
if(${HOUDINI_CXX11_ABI} STREQUAL "UNKNOWN")
|
||||
message(WARNING "Unable to determine Houdini CXX11 ABI. Assuming newer ABI "
|
||||
"has been used.")
|
||||
set(HOUDINI_CXX11_ABI 1)
|
||||
endif()
|
||||
|
||||
if(${GLIBCXX_USE_CXX11_ABI} EQUAL ${HOUDINI_CXX11_ABI})
|
||||
message(STATUS " Current CXX11 ABI matches Houdini configuration "
|
||||
"(_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}).")
|
||||
else()
|
||||
message(WARNING "A potential mismatch was detected between the CXX11 ABI "
|
||||
"of libstdc++ and Houdini. The following ABI configuration will be used: "
|
||||
"-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}. See: "
|
||||
"https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html and "
|
||||
"https://vfxplatform.com/#footnote-gcc6 for more information.")
|
||||
endif()
|
||||
|
||||
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI})
|
||||
endif()
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -51,7 +51,7 @@ variables may be provided to tell this module where to look.
|
||||
# Find the Maya installation and use Maya's CMake to initialize
|
||||
# the Maya lib
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
|
||||
set(_FIND_MAYA_ADDITIONAL_OPTIONS "")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -57,7 +57,7 @@ The following functions are provided:
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
|
||||
function(OPENVDB_GET_VERSION_DEFINE HEADER KEY VALUE)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -16,7 +16,7 @@ existing from a previous run of cmake.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt")
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -129,10 +129,6 @@ endif()
|
||||
|
||||
# Increase the number of sections that an object file can contain
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/bigobj>")
|
||||
# Enable MSVC options that make it behave like other compilers
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/Zc:throwingNew>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/Zc:inline>")
|
||||
# Excludes APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets
|
||||
add_compile_definitions("$<$<CXX_COMPILER_ID:MSVC>:WIN32_LEAN_AND_MEAN>")
|
||||
# Disable non-secure CRT library function warnings
|
||||
@@ -143,32 +139,9 @@ add_compile_definitions("$<$<CXX_COMPILER_ID:MSVC>:_CRT_SECURE_NO_WARNINGS>")
|
||||
# https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/
|
||||
# compiler-warning-level-3-c4996?view=vs-2019#posix-function-names
|
||||
add_compile_definitions("$<$<CXX_COMPILER_ID:MSVC>:_CRT_NONSTDC_NO_WARNINGS>")
|
||||
|
||||
# If a user has explicitly requested a parallel build, configure this during CMake
|
||||
if(MSVC_MP_THREAD_COUNT AND MSVC_MP_THREAD_COUNT GREATER 1)
|
||||
# If a user has explicitly requested a parallel build, configure this during CMake
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/MP${MSVC_MP_THREAD_COUNT}>")
|
||||
|
||||
# If building with multiple threads with MSVC, delay generation of PDB files
|
||||
# until the end of compilation to speed up their generation (invoke mspdbsrv once).
|
||||
# This assumes /Zi is being used to generate PDBs (CMakes default)
|
||||
add_compile_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/Zf>")
|
||||
endif()
|
||||
|
||||
if(MSVC_COMPRESS_PDB)
|
||||
# /Zi enables PDBs - CMake seems to default to creating PDBs as the defacto way
|
||||
# of handling debug symbols. As these PDBs can be very large, we attempt to compress
|
||||
# them here with various settings. This disable incremental linking and can make
|
||||
# stack traces more confusing.
|
||||
# https://devblogs.microsoft.com/cppblog/shrink-my-program-database-pdb-file/
|
||||
|
||||
# First, generate comdats to allow the linker to remove unused data
|
||||
add_compile_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/Gy>")
|
||||
# Remove unreferenced packaged functions and data from comdats
|
||||
add_link_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/OPT:REF>")
|
||||
# Fold duplicate comdat data (1 iteration)
|
||||
add_link_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/OPT:ICF>")
|
||||
# Generally compress the generated pdbs as they are being created
|
||||
add_link_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/PDBCOMPRESS>")
|
||||
endif()
|
||||
|
||||
if(OPENVDB_CXX_STRICT)
|
||||
@@ -178,29 +151,17 @@ if(OPENVDB_CXX_STRICT)
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wall>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wextra>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wconversion>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wnon-virtual-dtor>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wover-aligned>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wimplicit-fallthrough>")
|
||||
add_compile_options("$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,9.3.0>>:-Wimplicit-fallthrough>")
|
||||
# Only check global constructors for libraries (we should really check for
|
||||
# executables too but gtest relies on these types of constructors for its
|
||||
# framework). nanobind also incorporates these constructors so skip it as well.
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>>>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>>:-Wglobal-constructors>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wno-sign-conversion>")
|
||||
# GNU
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Werror>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wall>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wextra>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-pedantic>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wcast-align>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wcast-qual>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wconversion>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wdisabled-optimization>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Woverloaded-virtual>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wnon-virtual-dtor>")
|
||||
# Disable select warnings for the nanobind static library
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-pedantic>")
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wcast-qual>")
|
||||
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wconversion>")
|
||||
add_compile_options("$<$<AND:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wno-unused-variable>")
|
||||
add_compile_options("$<$<AND:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wno-unused-but-set-parameter>")
|
||||
else()
|
||||
# NO OPENVDB_CXX_STRICT, suppress some warnings
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
@@ -248,7 +209,7 @@ if(CMAKE_BUILD_TYPE EQUAL coverage)
|
||||
endif()
|
||||
|
||||
# Note that the thread, address and memory sanitizers are incompatible with each other
|
||||
set(EXTRA_BUILD_TYPES coverage tsan asan lsan msan ubsan abicheck)
|
||||
set(EXTRA_BUILD_TYPES coverage tsan asan lsan msan ubsan)
|
||||
|
||||
# Set all build flags to empty (unless they have been provided)
|
||||
|
||||
@@ -265,18 +226,7 @@ endforeach()
|
||||
# clang and GCC. Sanitizers are currently only configured for clang and GCC.
|
||||
|
||||
# Coverage
|
||||
# --coverage uses -fprofile-arcs -ftest-coverage (compiling) and -lgcov (linking)
|
||||
# @note consider -fprofile-abs-path from gcc 10
|
||||
# @todo consider using clang with source analysis: -fprofile-instr-generate -fcoverage-mapping.
|
||||
# https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
|
||||
# note that clang also works with gcov (--coverage)
|
||||
# @note Ideally we'd use no optimisations (-O0) with --coverage, but a complete
|
||||
# run of all unit tests takes upwards of a day without them. Thread usage also
|
||||
# impacts total runtime. -Og implies -O1 but without optimisations "that would
|
||||
# otherwise interfere with debugging". This still massively effects branch
|
||||
# coverage tracking compared to -O0 so we should look to improve the speed of
|
||||
# some of the unit tests and also experiment with clang.
|
||||
add_compile_options("$<$<AND:$<CONFIG:COVERAGE>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:--coverage;-Og>")
|
||||
add_compile_options("$<$<AND:$<CONFIG:COVERAGE>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:--coverage>")
|
||||
add_link_options("$<$<AND:$<CONFIG:COVERAGE>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:--coverage>")
|
||||
|
||||
# ThreadSanitizer
|
||||
@@ -307,57 +257,10 @@ add_link_options("$<$<AND:$<CONFIG:MSAN>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleCl
|
||||
add_compile_options("$<$<AND:$<CONFIG:UBSAN>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:-fsanitize=undefined>")
|
||||
add_link_options("$<$<AND:$<CONFIG:UBSAN>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:-fsanitize=undefined>")
|
||||
|
||||
# ABI Check. This build type is expected to work with the abi-dumper/abi-compliance-checker
|
||||
# binaries which expect specific debug information. In particular, for GCC versions >= 11
|
||||
# we have to explicitly select dwarf versions < 5 as the abi-dumper doesn't support dwarf5
|
||||
# and will always incorrectly report successful ABI checks
|
||||
# https://github.com/lvc/abi-dumper/issues/33
|
||||
add_compile_options("$<$<CONFIG:ABICHECK>:-gdwarf-4;-g3;-ggdb;-Og>")
|
||||
|
||||
# CMAKE_BUILD_TYPE is ignored for multi config generators i.e. MSVS
|
||||
|
||||
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(NOT _isMultiConfig)
|
||||
message(STATUS "CMake Build Type: ${CMAKE_BUILD_TYPE}")
|
||||
endif()
|
||||
if(OPENVDB_ENABLE_ASSERTS)
|
||||
message(STATUS "OpenVDB asserts are ENABLED")
|
||||
endif()
|
||||
|
||||
# Intialize extra build type targets where possible
|
||||
|
||||
if(NOT TARGET gcov_html)
|
||||
find_program(GCOVR_PATH gcovr)
|
||||
if(NOT GCOVR_PATH AND CMAKE_BUILD_TYPE STREQUAL "coverage")
|
||||
message(WARNING "Unable to initialize gcovr target. coverage build types will still generate gcno files.")
|
||||
elseif(GCOVR_PATH)
|
||||
# init gcov commands
|
||||
set(GCOVR_HTML_FOLDER_CMD ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/gcov_html)
|
||||
set(GCOVR_HTML_CMD
|
||||
${GCOVR_PATH} --html --html-details -r ${PROJECT_SOURCE_DIR} --object-directory=${PROJECT_BINARY_DIR}
|
||||
-o gcov_html/index.html
|
||||
)
|
||||
|
||||
# Add a custom target which converts .gcda files to a html report using gcovr.
|
||||
# Note that this target does NOT run ctest or any binaries - that is left to
|
||||
# the implementor of the gcov workflow. Typically, the order of operations
|
||||
# would be:
|
||||
# - run CMake with unit tests on
|
||||
# - ctest
|
||||
# - make gcov_html
|
||||
add_custom_target(gcov_html
|
||||
COMMAND ${GCOVR_HTML_FOLDER_CMD}
|
||||
COMMAND ${GCOVR_HTML_CMD}
|
||||
BYPRODUCTS ${PROJECT_BINARY_DIR}/gcov_html/index.html # report directory
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
VERBATIM
|
||||
COMMENT "Running gcovr to produce HTML code coverage report."
|
||||
)
|
||||
|
||||
# Show info where to find the report
|
||||
add_custom_command(TARGET gcov_html POST_BUILD
|
||||
COMMAND ;
|
||||
COMMENT "Open ./gcov_html/index.html in your browser to view the coverage report."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -8,78 +8,62 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
###############################################################################
|
||||
|
||||
# Configure minimum version requirements - some are treated specially and fall
|
||||
# outside of the DISABLE_DEPENDENCY_VERSION_CHECKS catch
|
||||
set(MINIMUM_CXX_STANDARD 17)
|
||||
set(MINIMUM_CXX_STANDARD 14)
|
||||
|
||||
# @note ABI always enforced so the correct deprecation messages are available.
|
||||
# OPENVDB_USE_DEPRECATED_ABI_<VERSION> should be used to circumvent this
|
||||
math(EXPR MINIMUM_OPENVDB_ABI_VERSION "${OpenVDB_MAJOR_VERSION}-2")
|
||||
math(EXPR FUTURE_OPENVDB_ABI_VERSION "${OpenVDB_MAJOR_VERSION}+1")
|
||||
|
||||
# List of deprecated but supported OpenVDB ABIs for this version of OpenVDB
|
||||
math(EXPR _PREV_ABI "${OpenVDB_MAJOR_VERSION}-1")
|
||||
set(OPENVDB_DEPRECATED_ABI_LIST ${MINIMUM_OPENVDB_ABI_VERSION} ${_PREV_ABI})
|
||||
unset(_PREV_ABI)
|
||||
set(MINIMUM_OPENVDB_ABI_VERSION 7)
|
||||
set(FUTURE_MINIMUM_OPENVDB_ABI_VERSION 9)
|
||||
set(FUTURE_OPENVDB_ABI_VERSION 10)
|
||||
|
||||
if(NOT DISABLE_DEPENDENCY_VERSION_CHECKS)
|
||||
# @note Currently tracking CY2024 of the VFX platform where available
|
||||
# (that is, our minimum requirements are for the current VFX platform)
|
||||
# minus 2 years to be able to build with legacy ABI)
|
||||
# @note Currently tracking CY2020 of the VFX platform where available
|
||||
set(MINIMUM_GCC_VERSION 6.3.1)
|
||||
set(MINIMUM_CLANG_VERSION 3.8)
|
||||
set(MINIMUM_ICC_VERSION 17)
|
||||
set(MINIMUM_MSVC_VERSION 19.10)
|
||||
|
||||
# @Note Compiler versions are not really a hard and fast rule, you just need
|
||||
# a compiler with complete support for our MINIMUM_CXX_STANDARD (currently 17).
|
||||
# What's usually important is that the version of libstdc++ and glibc in use
|
||||
# matches. Compilers other than GCC should provide options to ensure this
|
||||
# targetting e.g. --gcc-toolchain and -fgnuc-version with Clang.
|
||||
set(MINIMUM_GCC_VERSION 11.2.1)
|
||||
set(MINIMUM_CLANG_VERSION 5.0)
|
||||
set(MINIMUM_ICC_VERSION 19)
|
||||
set(MINIMUM_MSVC_VERSION 19.30) # 1928 (Visual Studio 2019 Version 16.8 + 16.9)
|
||||
|
||||
set(MINIMUM_BOOST_VERSION 1.82)
|
||||
set(MINIMUM_OPENEXR_VERSION 3.2)
|
||||
set(MINIMUM_IMATH_VERSION 3.2)
|
||||
set(MINIMUM_BOOST_VERSION 1.70)
|
||||
set(MINIMUM_ILMBASE_VERSION 2.4)
|
||||
set(MINIMUM_OPENEXR_VERSION 2.4)
|
||||
set(MINIMUM_ZLIB_VERSION 1.2.7)
|
||||
set(MINIMUM_TBB_VERSION 2020.3)
|
||||
set(MINIMUM_LLVM_VERSION 15.0.0)
|
||||
set(MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
set(MINIMUM_GLFW_VERSION 3.3)
|
||||
set(MINIMUM_TBB_VERSION 2019.0)
|
||||
set(MINIMUM_LLVM_VERSION 7.0.0)
|
||||
set(MINIMUM_BLOSC_VERSION 1.5.0)
|
||||
|
||||
set(MINIMUM_PYTHON_VERSION 3.11)
|
||||
set(MINIMUM_PYTHON_VERSION 2.7) # @warning should be 3.7.x, but H18.5+ can still be used with 2.7.x
|
||||
set(MINIMUM_NUMPY_VERSION 1.17.0)
|
||||
|
||||
set(MINIMUM_GOOGLETEST_VERSION 1.10)
|
||||
set(MINIMUM_LOG4CPLUS_VERSION 2.0)
|
||||
set(MINIMUM_HOUDINI_VERSION 20.5)
|
||||
set(MINIMUM_GLFW_VERSION 3.1)
|
||||
set(MINIMUM_LOG4CPLUS_VERSION 1.1.2)
|
||||
set(MINIMUM_HOUDINI_VERSION 18.5)
|
||||
|
||||
# These always promote warnings rather than errors
|
||||
set(MINIMUM_MAYA_VERSION 2017)
|
||||
set(MINIMUM_DOXYGEN_VERSION 1.8.8)
|
||||
endif()
|
||||
|
||||
# VFX 24 deprecations to transition to MINIMUM_* variables in OpenVDB 14.0.0
|
||||
# @note At the time of writing, any variables that are commented out don't
|
||||
# have target transitional versions.
|
||||
# VFX 21 deprecations to transition to MINIMUM_* variables in OpenVDB 10.0.0
|
||||
|
||||
# set(FUTURE_MINIMUM_GCC_VERSION 11.2.1)
|
||||
# set(FUTURE_MINIMUM_MSVC_VERSION 19.30)
|
||||
# set(FUTURE_MINIMUM_ICC_VERSION 19)
|
||||
set(FUTURE_MINIMUM_GCC_VERSION 9.3.1)
|
||||
set(FUTURE_MINIMUM_ICC_VERSION 19)
|
||||
# set(FUTURE_MINIMUM_MSVC_VERSION 19.10)
|
||||
|
||||
# set(FUTURE_MINIMUM_CXX_STANDARD 20)
|
||||
set(FUTURE_MINIMUM_CMAKE_VERSION 4.0)
|
||||
set(FUTURE_MINIMUM_OPENEXR_VERSION 3.3)
|
||||
set(FUTURE_MINIMUM_IMATH_VERSION 3.3)
|
||||
set(FUTURE_MINIMUM_TBB_VERSION 2021)
|
||||
set(FUTURE_MINIMUM_BOOST_VERSION 1.85)
|
||||
#set(FUTURE_MINIMUM_GLFW_VERSION 3.3)
|
||||
#set(FUTURE_MINIMUM_LOG4CPLUS_VERSION 2.0)
|
||||
set(FUTURE_MINIMUM_NANOBIND_VERSION 2.5.0)
|
||||
|
||||
# set(FUTURE_MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
# set(FUTURE_MINIMUM_PYTHON_VERSION 3.11)
|
||||
# set(FUTURE_MINIMUM_HOUDINI_VERSION 20.0)
|
||||
set(FUTURE_MINIMUM_LLVM_VERSION 18.0.0)
|
||||
set(FUTURE_MINIMUM_CXX_STANDARD 17)
|
||||
set(FUTURE_MINIMUM_CMAKE_VERSION 3.18)
|
||||
#set(FUTURE_MINIMUM_ILMBASE_VERSION 2.4) # Minimum is already 2.4
|
||||
#set(FUTURE_MINIMUM_OPENEXR_VERSION 2.4) # Minimum is already 2.4
|
||||
set(FUTURE_MINIMUM_BOOST_VERSION 1.73)
|
||||
set(FUTURE_MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
set(FUTURE_MINIMUM_TBB_VERSION 2020.2)
|
||||
set(FUTURE_MINIMUM_PYTHON_VERSION 3.7)
|
||||
set(FUTURE_MINIMUM_NUMPY_VERSION 1.19.0)
|
||||
set(FUTURE_MINIMUM_HOUDINI_VERSION 19.0)
|
||||
set(FUTURE_MINIMUM_LLVM_VERSION 10.0.0)
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#################################################################################
|
||||
## This file is loaded by the Leak/Address Sanitizer build for the unit tests. ##
|
||||
## It can be used to ignore various errors reported by the sanitizer. This is ##
|
||||
## especially useful with upstream issues (e.g. boost/tbb). For help defining ##
|
||||
## suppression rules, see: ##
|
||||
## https://clang.llvm.org/docs/AddressSanitizer.html ##
|
||||
## The build is configured with CMAKE_BUILD_TYPE=asan or lsan ##
|
||||
#################################################################################
|
||||
|
||||
##### Upstream #####
|
||||
|
||||
# Leaks from TBB init which occur due to tbb teardown issues
|
||||
# https://github.com/oneapi-src/oneTBB/issues/206
|
||||
# Should be fixed in oneTBB. Ignore them for now
|
||||
leak:tbb::internal::task_stream<3>::initialize*
|
||||
@@ -16,6 +16,9 @@ vptr:tbb/task.h
|
||||
|
||||
##### OpenVDB #####
|
||||
|
||||
# The sOn/sOff static bool data held on the LeaffBuff<bool> objects can be
|
||||
# initialised to arbitrary true/false values. See the note in LeafBuffer.h
|
||||
enum:openvdb/tools/Activate.h
|
||||
# Some 2s complement tests, ignore the negative shifts
|
||||
# @todo Should address these
|
||||
shift-base:TestMultiResGrid.cc
|
||||
|
||||
+6
-4
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
project(OpenVDBDocs LANGUAGES NONE)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -41,10 +41,8 @@ set(DOXY_FILES
|
||||
openvdb/openvdb/io
|
||||
openvdb/openvdb/math
|
||||
openvdb/openvdb/points
|
||||
openvdb/openvdb/points/impl
|
||||
openvdb/openvdb/python/pyopenvdb.h
|
||||
openvdb/openvdb/tools
|
||||
openvdb/openvdb/tools/impl
|
||||
openvdb/openvdb/tree
|
||||
openvdb/openvdb/util
|
||||
doc/build.txt
|
||||
@@ -217,6 +215,7 @@ if(OPENVDB_DOXYGEN_AX)
|
||||
doc/ax/doc.txt
|
||||
openvdb_ax/openvdb_ax
|
||||
openvdb_ax/openvdb_ax/ast
|
||||
openvdb_ax/openvdb_ax/cmd
|
||||
openvdb_ax/openvdb_ax/codegen
|
||||
openvdb_ax/openvdb_ax/compiler
|
||||
openvdb_ax/openvdb_ax/grammar
|
||||
@@ -236,6 +235,9 @@ if(OPENVDB_DOXYGEN_NANOVDB)
|
||||
doc/nanovdb/HelloWorld.md
|
||||
nanovdb/nanovdb
|
||||
nanovdb/nanovdb/util
|
||||
nanovdb/nanovdb/cmd/convert
|
||||
nanovdb/nanovdb/cmd/print
|
||||
nanovdb/nanovdb/cmd/validate
|
||||
nanovdb/nanovdb/examples/benchmark
|
||||
nanovdb/nanovdb/examples/ex_bump_pool_buffer
|
||||
nanovdb/nanovdb/examples/ex_collide_level_set
|
||||
|
||||
+5
-9
@@ -1165,11 +1165,10 @@ operations (if an operation is not listed, it is not supported):
|
||||
<tr style="text-align:center">
|
||||
<th>Left Operand Type</th><th>Binary Op(s)</th><th>Right Operand Type</th><th>Description</th>
|
||||
</tr>
|
||||
<tr style="text-align:center"><td rowspan="3">@ref axscalars "scalar"</td><td rowspan="1">`== != < > <= >=`</td><td>@ref axscalars "scalar"</td>
|
||||
<tr style="text-align:center"><td rowspan="3">@ref axscalars "scalar"</td><td rowspan="3">`== != < > <= >=`</td><td>@ref axscalars "scalar"</td>
|
||||
<td style="text-align:left">Returns the result of the scalar comparison.</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td rowspan="2">`== !=`</td>
|
||||
<td>@ref axvecmats "vector"</td>
|
||||
<td style="text-align:left" rowspan="2">
|
||||
Performs per component comparisons (after
|
||||
@@ -1196,12 +1195,11 @@ for (int i = 1; i < 3; ++i) c &= a[i] == b;
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td style="border-top-width: thick" rowspan="2">@ref axvecmats "vector"</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="1">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="2">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick">@ref axscalars "scalar"</td>
|
||||
<td style="border-top-width: thick;text-align:left">Same as `scalar op vector`</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td rowspan="1">`== !=`</td>
|
||||
<td>@ref axvecmats "vector"</td>
|
||||
<td style="text-align:left">
|
||||
Performs binary comparison operations (after
|
||||
@@ -1222,13 +1220,11 @@ for (int i = 1; i < 3; ++i) c &= a[i] == b[i];
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td style="border-top-width: thick" rowspan="2">@ref axvecmats "matrix"</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="1">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="2">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick">@ref axscalars "scalar"</td>
|
||||
<td style="border-top-width: thick;text-align:left">Same as `scalar op matrix`</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td rowspan="1">`== !=`</td>
|
||||
<td>@ref axvecmats "matrix"</td>
|
||||
<tr style="text-align:center"><td>@ref axvecmats "matrix"</td>
|
||||
<td style="text-align:left">
|
||||
Performs binary comparison operations (after
|
||||
@ref axtypeprecedence "implicit conversion") on each pair corresponding
|
||||
@@ -1797,7 +1793,7 @@ returned, otherwise @b `c` is evaluated and returned. In this case, @b `a` and @
|
||||
@anchor axvecmatinit
|
||||
@par Vector/Matrix Initializer
|
||||
@ref axvecmats "Vectors and matrices" can be represented as local variables (e.g.
|
||||
@b `vec3f`), external attributes or parameters (e.g. @b `vec3f\@attrib`) or as
|
||||
@b `vec3f`), external attributes or parameters (e.g. @b `vec3f@attrib`) or as
|
||||
temporary values using the vector/matrix initializer syntax. This operator has
|
||||
the form:
|
||||
@par
|
||||
|
||||
@@ -32,7 +32,7 @@ These examples demonstrate how to use AX on OpenVDB points grids.
|
||||
Below is a small example which demonstrates working with a few point attributes.
|
||||
The @ symbol is the identifier for an AX attribute. The type of each attribute
|
||||
is specified before the @ symbol and the name is specified afterwards. For
|
||||
example: @b `int\@count` would imply an @b integer attribute called @b count.
|
||||
example: @b `int@count` would imply an @b integer attribute called @b count.
|
||||
@par
|
||||
In this example there are three point attributes: a @b float attribute @b speed,
|
||||
a @b vec3f float attribute @b velocity and a @b vec3f float attribute @b colour.
|
||||
@@ -114,7 +114,7 @@ v@P += v@v * dt;
|
||||
@endcode
|
||||
@par
|
||||
The final AX command, `v@P += v@v * dt;` writes to the position attribute of
|
||||
the points @b `v\@P`. Whenever position is written to in this way, the AX
|
||||
the points @b `v@P`. Whenever position is written to in this way, the AX
|
||||
`PointExecutable` will move (re-bucket) points in PointDataGrids.
|
||||
|
||||
@subsection axexamplepointcurlnoise Curl Noise
|
||||
@@ -234,7 +234,7 @@ vec3f@vel += dt * massInverse * vec3f@force;
|
||||
@par
|
||||
Here we demonstrate how AX can be used to blend two volumes together. Note that
|
||||
only the volumes which are written to are executed over. In the below code,
|
||||
only @b `\@surface_a` is written to. This means that the final blended result,
|
||||
only @b `@surface_a` is written to. This means that the final blended result,
|
||||
stored in `surface_a`, will only be updated in `surface_a`'s topology. Should
|
||||
we want a combined blend of @b non @b overlapping areas of both surface a and b,
|
||||
we would need to activate a's topology with respect to b first.
|
||||
|
||||
+23
-19
@@ -87,7 +87,7 @@ given FindModule e.g. `FindBlosc.cmake`:
|
||||
- @b Xxx_ROOT - Preferred installation prefix. The given dependency is
|
||||
expected to follow a folder structure `Xxx_ROOT/include` and `Xxx_ROOT/lib`
|
||||
exist. Note that unlike the above, this is the case matching name of the
|
||||
find package .i.e. Blosc_ROOT, TBB_ROOT etc.
|
||||
find package .i.e. Blosc_ROOT, IlmBase_ROOT, TBB_ROOT etc.
|
||||
- @b XXX_INCLUDEDIR / @b XXX_LIBRARYDIR - Preferred include and library
|
||||
directories
|
||||
- @b SYSTEM_LIBRARY_PATHS - A list of paths appended to all include and lib
|
||||
@@ -238,8 +238,12 @@ it's a good idea to read the above section on
|
||||
|
||||
DCC | Supported Version | OpenVDB ABI |
|
||||
-------- | ----------------- | ----------- |
|
||||
Houdini | 20.5 | 11 |
|
||||
Houdini | 21.0 | 12 |
|
||||
Houdini | 18.0 | 6 |
|
||||
Houdini | 18.5 | 7 |
|
||||
Houdini | 19.0 | 8 |
|
||||
Maya | 2017 | Any |
|
||||
Maya | 2018 | Any |
|
||||
Maya | 2019 | Any |
|
||||
|
||||
@subsection buildBuildHou Building Against Houdini
|
||||
|
||||
@@ -254,16 +258,17 @@ OpenVDB components you wish to build.
|
||||
Package | Description | OpenVDB Components |
|
||||
-------------- | --------------------------------------------------------------- | ------------------ |
|
||||
CMake | Cross-platform family of tools designed to help build software | All |
|
||||
C++17 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams | All |
|
||||
C++14 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams, python, thread | All |
|
||||
GoogleTest | A unit testing framework module for C++ | Unit Tests |
|
||||
CppUnit | A unit testing framework module for C++ | Unit Tests (AX) |
|
||||
GLFW | Simple API for OpenGL development | OpenVDB View |
|
||||
Doxygen | Documentation generation from C++ | Documentation |
|
||||
Log4cplus | An optional dependency for improved OpenVDB Logging | Optional (All) |
|
||||
nanobind | C++/python bindings | Optional (Python) |
|
||||
NumPy | Scientific computing with Python | Optional (Python) |
|
||||
LLVM | Target-independent code generation | OpenVDB AX |
|
||||
|
||||
At a minimum a matching C++17 compiler and CMake will be required. See
|
||||
At a minimum, boost, a matching C++14 compiler and CMake will be required. See
|
||||
the full [dependency list](@ref dependencies) for help with downloading and
|
||||
installing the above software. Note that as Blosc and ZLib are provided as part
|
||||
of the Houdini installation `USE_BLOSC` and `USE_ZLIB` should be left `ON`.
|
||||
@@ -342,23 +347,24 @@ Supported versions of maya only ship with TBB.
|
||||
Package | Description | OpenVDB Components |
|
||||
-------------- | --------------------------------------------------------------- | -------------------------------- |
|
||||
CMake | Cross-platform family of tools designed to help build software | All |
|
||||
C++17 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams | All |
|
||||
C++14 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams, python, thread | All |
|
||||
ZLIB | Compression library for disk serialization compression | All |
|
||||
Blosc | Recommended dependency for improved disk compression | All* |
|
||||
GoogleTest | A unit testing framework module for C++ | Unit Tests |
|
||||
CppUnit | A unit testing framework module for C++ | Unit Tests (AX) |
|
||||
GLFW | Simple API for OpenGL development | OpenVDB View |
|
||||
Doxygen | Documentation generation from C++ | Documentation |
|
||||
OpenEXR | EXR serialization support | OpenVDB Render |
|
||||
Imath | Used half precision floating points and EXR serialization support | Optional (All) |
|
||||
IlmBase | Used half precision floating points and EXR serialization support | Optional (All) |
|
||||
Log4cplus | An optional dependency for improved OpenVDB Logging | Optional (All) |
|
||||
nanobind | C++/python bindings | Optional (Python) |
|
||||
NumPy | Scientific computing with Python | Optional (Python) |
|
||||
LLVM | Target-independent code generation | OpenVDB AX |
|
||||
|
||||
|
||||
* See [blosc support](@ref buildBloscSupport)
|
||||
|
||||
At a minimum, boost, a matching C++17 compiler, ZLIB, blosc and CMake will be
|
||||
At a minimum, boost, a matching C++14 compiler, ZLIB, blosc and CMake will be
|
||||
required. See the full [dependency list](@ref dependencies) for help with
|
||||
downloading and installing the above software.
|
||||
|
||||
@@ -388,12 +394,14 @@ Optional:
|
||||
install the Maya plugin to. Defaults to the value of `${CMAKE_INSTALL_PREFIX}/maya${Maya_VERSION}`
|
||||
- @b BOOST_ROOT =`/path/to/boost/install` # Path to boost. May not be required,
|
||||
CMake may find it automatically
|
||||
- @b IlmBase_ROOT =`/path/to/ilmbase/install` # Path to ilmbase.
|
||||
|
||||
For example on MacOS and where the build folder has been created inside the
|
||||
OpenVDB source root:
|
||||
|
||||
@code
|
||||
cmake -D BOOST_ROOT=/path/to/boost/install \
|
||||
-D IlmBase_ROOT=/path/to/ilmbase/install \
|
||||
-D Maya_ROOT=/Applications/Autodesk/maya2019/ \
|
||||
-D USE_MAYA=ON \
|
||||
../
|
||||
@@ -508,7 +516,7 @@ You can add the below CMake snippet to your main `CMakeLists.txt` to bring in
|
||||
OpenVDB as a dependency:
|
||||
|
||||
@code{.cmake}
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
list(APPEND CMAKE_MODULE_PATH "/location/of/openvdb/install/lib/cmake/OpenVDB")
|
||||
find_package(OpenVDB REQUIRED)
|
||||
target_link_libraries(myapp OpenVDB::openvdb)
|
||||
@@ -601,12 +609,8 @@ OpenVDB uses [imported targets](https://cmake.org/cmake/help/latest/command/add_
|
||||
for all its dependencies. For imported Boost compatibility, the following
|
||||
versions of CMake are required:
|
||||
|
||||
- Boost 1.82 requires CMake 3.27.0 or newer.
|
||||
- Boost 1.83 requires CMake 3.27.4 or newer.
|
||||
- Boost 1.84 requires CMake 3.28.2 or newer.
|
||||
- Boost 1.85 requires CMake 3.29.3 or newer.
|
||||
- Boost 1.86 requires CMake 3.30.6, 3.31.1, or newer.
|
||||
- Boost 1.87 requires CMake 3.31.4 or newer.
|
||||
- Boost 1.68, 1.69 require CMake 3.13 or newer.
|
||||
- Boost 1.70 requires CMake 3.14 or newer.
|
||||
|
||||
Use the above list to identify the version of CMake you require for your version
|
||||
of Boost. Note that this may be implemented into the OpenVDB CMake in the future.
|
||||
|
||||
+44
-885
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -7,7 +7,7 @@
|
||||
This document details the coding practices that are used in the OpenVDB
|
||||
codebase. Contributed code should conform to these guidelines to maintain
|
||||
consistency and maintainability. If there is a rule that you would like
|
||||
clarified, changed, or added, please send a note to openvdb-dev@lists.aswf.io.
|
||||
clarified, changed, or added, please send a note to openvdb@gmail.com.
|
||||
|
||||
|
||||
@section sStyleContents Contents
|
||||
|
||||
+81
-64
@@ -9,6 +9,7 @@
|
||||
- @ref depInstallingDependencies
|
||||
- @ref depUsingAptGet
|
||||
- @ref depUsingHomebrew
|
||||
- @ref depManInstall
|
||||
<!-- - @ref depContents -->
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@@ -34,21 +35,21 @@ Reference Platform, but for those that do, their specified versions are
|
||||
|
||||
@section depComponents OpenVDB Components
|
||||
|
||||
Component | Requirements | Optional
|
||||
----------------------- | ----------------------------------------------- | --------
|
||||
OpenVDB Core Library | CMake, C++17 compiler, TBB::tbb | Blosc, ZLib, Log4cplus, Imath::Imath, Boost::iostream
|
||||
OpenVDB Print | Core Library dependencies | -
|
||||
OpenVDB LOD | Core Library dependencies | -
|
||||
OpenVDB Render | Core Library dependencies | OpenEXR, Imath::Imath, libpng
|
||||
OpenVDB View | Core Library dependencies, OpenGL, GLFW3, GLEW* | -
|
||||
OpenVDB Python | Core Library dependencies, Python, nanobind | -
|
||||
OpenVDB AX | Core Library dependencies, LLVM | Bison, Flex
|
||||
NanoVDB | - | Core Library, CUDA, TBB, Blosc, ZLib
|
||||
OpenVDB UnitTests | Core Library dependencies, GoogleTest, numpy* | -
|
||||
OpenVDB Documentation | Doxygen | -
|
||||
Component | Requirements | Optional
|
||||
----------------------- | ------------------------------------------------- | --------
|
||||
OpenVDB Core Library | CMake, C++14 compiler, TBB::tbb, Boost::iostream | Blosc, ZLib, Log4cplus, IlmBase::Half
|
||||
OpenVDB Print | Core Library dependencies | -
|
||||
OpenVDB LOD | Core Library dependencies | -
|
||||
OpenVDB Render | Core Library dependencies | OpenEXR, IlmBase, libpng
|
||||
OpenVDB View | Core Library dependencies, OpenGL, GLFW3, GLEW* | -
|
||||
OpenVDB Python | Core Library dependencies, Python, Boost::python | Boost::numpy, NumPy
|
||||
OpenVDB AX | Core Library dependencies, LLVM | Bison, Flex
|
||||
NanoVDB | - | Core Library, CUDA, TBB, Blosc, ZLib
|
||||
OpenVDB UnitTests | Core Library dependencies, GoogleTest | CppUnit**
|
||||
OpenVDB Documentation | Doxygen | -
|
||||
|
||||
- @b * GLEW is only required for building the vdb_view binary on Windows.
|
||||
- @b * numpy only required for python binding unit tests
|
||||
- @b ** CppUnit is only required for building the AX unit tests.
|
||||
- @b Note - Bison and Flex are only required for re-generation of the AX
|
||||
grammar which is not typically necessary for the majority of users.
|
||||
|
||||
@@ -56,49 +57,57 @@ OpenVDB Documentation | Doxygen | -
|
||||
|
||||
Package | Minimum | Recommended | Description | apt-get | Homebrew | Source
|
||||
-------------- | ------- | ----------- | ----------------------------------------------------------------- | ------- | -------- | ------
|
||||
CMake | 3.24 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
|
||||
GCC | 11.2.1 | 11.2.1 | C++ 17 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
|
||||
Clang | 5.0 | Latest | C++ 17 Compiler: A C language family frontend for LLVM | Y | Y | https://clang.llvm.org
|
||||
Intel ICC | 19 | Latest | C++ 17 Compiler: Intels C++ Compiler | Y | Y | https://software.intel.com/en-us/c-compilers
|
||||
MSVC | 19.30 | 19.30 | C++ 17 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
|
||||
Imath | 3.2 | >= 3.3 | Half precision floating points | Y | Y | http://www.openexr.com
|
||||
OpenEXR | 3.2 | >= 3.3 | EXR serialization support | Y | Y | http://www.openexr.com
|
||||
TBB | 2020.3 | >= 2021 | Threading Building Blocks - template library for task parallelism | Y | Y | https://www.threadingbuildingblocks.org
|
||||
CMake | 3.12 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
|
||||
GCC | 6.3.1 | 6.3.1 | C++ 14 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
|
||||
Clang | 3.8 | Latest | C++ 14 Compiler: A C language family frontend for LLVM | Y | Y | https://clang.llvm.org
|
||||
Intel ICC | 17 | Latest | C++ 14 Compiler: Intels C++ Compiler | Y | Y | https://software.intel.com/en-us/c-compilers
|
||||
MSVC | 19.10 | Latest | C++ 14 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
|
||||
IlmBase | 2.2** | 2.3 | Used half precision floating points and EXR serialization support | Y | Y | http://www.openexr.com
|
||||
OpenEXR | 2.2** | 2.3 | EXR serialization support | Y | Y | http://www.openexr.com
|
||||
TBB | 2018 | 2018 | Threading Building Blocks - template library for task parallelism | Y | Y | https://www.threadingbuildingblocks.org
|
||||
ZLIB | 1.2.7 | Latest | Compression library for disk serialization compression | Y | Y | https://www.zlib.net
|
||||
Boost | 1.82 | >= 1.85 | Components: iostreams | Y | Y | https://www.boost.org
|
||||
LLVM | 15.0.0* | 18.0.0 | Target-independent code generation | Y | Y | https://llvm.org/
|
||||
Bison | 3.7.0 | 3.7.0 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
|
||||
Flex | 2.6.4 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
|
||||
Python | 3.10 | 3.11 | The python interpreter and libraries | Y | Y | https://www.python.org
|
||||
nanobind** | 2.0.0 | >= 2.5.0 | C++/python bindings | Y | Y | https://nanobind.readthedocs.io
|
||||
Boost | 1.66 | 1.66 | Components: iostreams, python, numpy | Y | Y | https://www.boost.org
|
||||
LLVM | 6.0.0 | 8.0.0 | Target-independent code generation | Y | Y | https://llvm.org/
|
||||
Bison | 3.0.0 | 3.0.5 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
|
||||
Flex | 2.6 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
|
||||
Python | 2.7 | 2.7 | The python interpreter and libraries for C++/python bindings | Y | Y | https://www.python.org
|
||||
NumPy | 1.14.0 | 1.14.0 | Scientific computing with Python | Y | Y | http://www.numpy.org
|
||||
GoogleTest | 1.10 | Latest | A unit testing framework module for C++ | Y | Y | https://github.com/google/googletest
|
||||
Blosc | 1.17.0* | Latest | Recommended dependency for improved disk compression | Y | Y | https://github.com/Blosc/c-blosc/releases
|
||||
CppUnit | 1.10 | Latest | A unit testing framework module for C++ | N | Y | https://freedesktop.org/wiki/Software/cppunit
|
||||
Blosc | 1.17.0* | 1.17.0 | Recommended dependency for improved disk compression | Y | Y | https://github.com/Blosc/c-blosc/releases
|
||||
Log4cplus | 1.1.2 | Latest | An optional dependency for improved OpenVDB Logging | Y | Y | https://github.com/log4cplus/log4cplus
|
||||
libpng | - | Latest | Library for manipulating PNG images | Y | Y | http://www.libpng.org/pub/png/libpng.html
|
||||
GLFW | 3.3 | Latest | Simple API for OpenGL development | Y | Y | https://www.glfw.org
|
||||
GLFW | 3.1 | Latest | Simple API for OpenGL development | Y | Y | https://www.glfw.org
|
||||
OpenGL | 3.2 | Latest | Environment for developing portable graphics applications | Y | Y | https://www.opengl.org
|
||||
GLEW | 1.0.0 | Latest | A cross-platform OpenGL extension loading library. | Y | Y | http://glew.sourceforge.net
|
||||
CUDA | - | Latest | Parallel computing platform for graphical processing units. | Y | N | https://developer.nvidia.com/cuda-downloads
|
||||
Doxygen | 1.8.8 | 1.8.11 | Documentation generation from C++ | Y | Y | http://www.doxygen.nl
|
||||
|
||||
- @b * See the note in [known issues](@ref depKnownIssues) regarding supported blosc/llvm versions.
|
||||
- @b ** See the note in [known issues](@ref depKnownIssues) regarding supported nanobind build issues.
|
||||
- @b * See the note in [known issues](@ref depKnownIssues) regarding supported blosc versions.
|
||||
|
||||
- @b ** IlmBase/OpenEXR 2.2 is supported as Houdini 18.0 is shipped with
|
||||
VFX Reference Platform 2019, except for using older versions of these
|
||||
libraries.
|
||||
|
||||
@subsection depKnownIssues Known Issues
|
||||
|
||||
- @b On Linux, LLVM == 17 has symbol issues which makes it incompatible when
|
||||
used with the OpenVDB Python plugin. LLVM versions greater than 18 should be
|
||||
preferred.
|
||||
|
||||
- @b GLFW: Crash with GLFW 3.2.1 when used with EGL on Linux. OpenVDB View may
|
||||
segfault on closure. Fixed in GLFW 3.3
|
||||
|
||||
- @b Boost 1.66/1.67 + @b Python3 + @b NumPy: Known issue on UNIX systems
|
||||
which can cause the below python runtime error. Consider updating to Boost 1.68
|
||||
if you require both Python3 and NumPy support:
|
||||
|
||||
@code{.sh}
|
||||
RuntimeError: FATAL: module compiled as little endian, but detected different endianness at runtime.
|
||||
@endcode
|
||||
|
||||
- @b Blosc: OpenVDB has historically used an old version of blosc (1.5.0) to
|
||||
serialize .vdb files. OpenVDB has moved to a new blosc version minimum of
|
||||
1.17.0. We have tested a range of blosc versions and found that the following
|
||||
versions are NOT compatible with OpenVDB caches written using blosc 1.5.0.
|
||||
Additionally these versions of blosc may generally not be compatible with OpenVDB
|
||||
itself. Avoid using these versions and upgrade to the new minimum of 1.17.0 where
|
||||
serialize .vdb files. OpenVDB is moving to a new blosc version minimum of 1.17.0.
|
||||
We have tested a range of blosc versions and found that the following versions
|
||||
are NOT compatible with OpenVDB caches written using blosc 1.5.0. Additionally
|
||||
these versions of blosc may generally not be compatible with OpenVDB itself.
|
||||
Avoid using these versions and upgrade to the new minimum of 1.17.0 where
|
||||
possible.
|
||||
|
||||
- All versions from 1.11.0 through to, but excluding, 1.14.0.
|
||||
@@ -110,11 +119,6 @@ Doxygen | 1.8.8 | 1.8.11 | Documentation generation from C++
|
||||
- https://github.com/Blosc/c-blosc/issues/260
|
||||
- https://github.com/Blosc/c-blosc/issues/261
|
||||
|
||||
- @b nanobind: Nanobind requires a fast-hash-map implementation library called
|
||||
tsl-robin-map. If you're installing nanobind through homebrew, this library
|
||||
may not be installed correctly and OpenVDB's CMake will only produce a warning.
|
||||
Make sure to also: `brew install robin-map`.
|
||||
|
||||
@section depInstallingDependencies Installing Dependencies
|
||||
|
||||
This section details a number of ways to get you up and running with the
|
||||
@@ -122,22 +126,8 @@ required OpenVDB dependencies.
|
||||
|
||||
@subsection depUsingAptGet Using UNIX apt-get
|
||||
|
||||
You can use apt to automatically install required packages. Note that different
|
||||
Ubuntu distributions will have different versions available. You can use apt
|
||||
pinning to request newer versions of specific package from later distributions
|
||||
if the required version isn't available by default (see
|
||||
[man apt_preferences](https://linux.die.net/man/5/apt_preferences)). For
|
||||
example, the below settings will request TBB specifically from Ubuntu 22.04
|
||||
(Jammy).
|
||||
|
||||
@code{.sh}
|
||||
Package: libtbb-dev
|
||||
Pin: release n=jammy
|
||||
Pin-Priority: 990
|
||||
@endcode
|
||||
|
||||
Alternatively you can install any missing dependencies manually or through
|
||||
other package managers.
|
||||
@b Note:CppUnit is unavailable using apt-get. See the other package manager
|
||||
methods or the [manual installation](@ref depManInstall) options.
|
||||
|
||||
@code{.sh}
|
||||
#!/bin/bash
|
||||
@@ -148,12 +138,15 @@ apt-get install zlibc # zlib
|
||||
apt-get install libboost-iostreams-dev # Boost::iostream
|
||||
apt-get install libblosc-dev # Blosc
|
||||
# AX
|
||||
apt-get install llvm-15-dev # LLVM
|
||||
apt-get install llvm-8-dev # LLVM
|
||||
# Python
|
||||
apt-get install libboost-python-dev # Boost::python
|
||||
apt-get install libboost-numpy-dev # Boost::numpy
|
||||
apt-get install python-dev # Python
|
||||
pip install nanobind # nanobind
|
||||
apt-get install python-numpy # NumPy
|
||||
# Optional
|
||||
apt-get install libpng-dev # libpng
|
||||
apt-get install libilmbase-dev # IlmBase
|
||||
apt-get install libopenexr-dev # OpenEXR
|
||||
apt-get install liblog4cplus-dev # Log4cplus
|
||||
apt-get install googletest # GoogleTest
|
||||
@@ -181,17 +174,41 @@ brew install c-blosc # blosc
|
||||
# AX
|
||||
brew install llvm # LLVM
|
||||
# Python
|
||||
brew install boost-python # Boost-python
|
||||
brew install python # Python
|
||||
brew install nanobind robin-map # nanobind
|
||||
brew install numpy # NumPy
|
||||
# Unit Tests
|
||||
brew install gtest # GoogleTest
|
||||
brew install cppunit # CppUnit
|
||||
# vdb_view
|
||||
brew install glfw # GLFW
|
||||
# vdb_render
|
||||
brew install ilmbase # IlmBase
|
||||
brew install openexr # OpenEXR
|
||||
brew install libpng # libpng
|
||||
# Documentation
|
||||
brew install doxygen # Doxygen
|
||||
@endcode
|
||||
|
||||
@subsection depManInstall UNIX Manual Installations
|
||||
|
||||
Some dependencies may be unavailable using the above package manager methods.
|
||||
Below are manual installation methods for these packages. Note that you will
|
||||
have to provide your chosen installation locations to the OpenVDB CMake build
|
||||
system when building OpenVDB.
|
||||
|
||||
@b CppUnit (for AX Unit Tests)
|
||||
|
||||
@code{.sh}
|
||||
#!/bin/bash
|
||||
wget http://dev-www.libreoffice.org/src/cppunit-1.13.2.tar.gz
|
||||
tar -xvzf cppunit-1.13.2.tar.gz
|
||||
cd cppunit-1.13.2
|
||||
# Install to users home directory - you may customise this location
|
||||
mkdir -p $HOME/cppunit
|
||||
./configure --prefix=$HOME/cppunit
|
||||
make
|
||||
make install
|
||||
@endcode
|
||||
|
||||
*/
|
||||
|
||||
@@ -58,7 +58,6 @@ See @subpage NanoVDB_MainPage "NanoVDB" for the NanoVDB documentation.
|
||||
Contributors, please familiarize yourselves with our
|
||||
@subpage codingStyle "coding standards".
|
||||
|
||||
<a href="../code_coverage/index.html">Code Coverage</a>
|
||||
|
||||
|
||||
@page overview OpenVDB Overview
|
||||
|
||||
+7
-1
@@ -921,7 +921,7 @@ openvdb::Vec3SGrid::Ptr grid = ...;
|
||||
|
||||
// Construct the rotation matrix.
|
||||
openvdb::math::Mat3s rot45 =
|
||||
openvdb::math::rotation<openvdb::math::Mat3s>(openvdb::math::Y_AXIS, openvdb::math::pi<double>()/4.0);
|
||||
openvdb::math::rotation<openvdb::math::Mat3s>(openvdb::math::Y_AXIS, M_PI_4);
|
||||
|
||||
// Apply the functor to all active values.
|
||||
openvdb::tools::foreach(grid->beginValueOn(), MatMul(rot45));
|
||||
@@ -1199,6 +1199,7 @@ void processTypedGrid(openvdb::GridBase::Ptr grid, OpType& op)
|
||||
else if (grid->isType<openvdb::Vec3IGrid>()) CALL_OP(openvdb::Vec3IGrid);
|
||||
else if (grid->isType<openvdb::Vec3SGrid>()) CALL_OP(openvdb::Vec3SGrid);
|
||||
else if (grid->isType<openvdb::Vec3DGrid>()) CALL_OP(openvdb::Vec3DGrid);
|
||||
else if (grid->isType<openvdb::StringGrid>()) CALL_OP(openvdb::StringGrid);
|
||||
|
||||
#undef CALL_OP
|
||||
}
|
||||
@@ -1220,6 +1221,11 @@ struct PruneOp {
|
||||
{
|
||||
grid->tree().prune(typename GridType::ValueType(tolerance));
|
||||
}
|
||||
// Overload to handle string-valued grids
|
||||
void operator()(openvdb::StringGrid::Ptr grid) const
|
||||
{
|
||||
grid->tree().prune();
|
||||
}
|
||||
};
|
||||
|
||||
// Read all grids from a file.
|
||||
|
||||
+4
-4
@@ -40,10 +40,10 @@ details of VDB are described in the paper
|
||||
<a href="http://www.museth.org/Ken/Publications.html" target="_blank">"VDB: High-Resolution Sparse Volumes with Dynamic Topology"</a>.
|
||||
|
||||
@section sWhatLicense What license is OpenVDB distributed under?
|
||||
OpenVDB is released under the Apache License Version 2.0, which is a
|
||||
free, open source software license developed and maintained by the Apache Software
|
||||
Foundation. For more information about this license, see
|
||||
<a href="https://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License, Version 2</a>.
|
||||
OpenVDB is released under the Mozilla Public License Version 2.0, which is a
|
||||
free, open source software license developed and maintained by the Mozilla
|
||||
Foundation. For more information about this license, see the
|
||||
<a href="https://www.mozilla.org/en-US/MPL/" target="_blank">Mozilla FAQ</a>.
|
||||
|
||||
@section sWhatCLA Is there a Contributor License Agreement for OpenVDB?
|
||||
Yes, developers who wish to contribute code to be considered for inclusion
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 MiB |
+2
-2
@@ -78,7 +78,7 @@ openvdb::math::Transform::Ptr linearTransform =
|
||||
// Rotate the transform by 90 degrees about the X axis.
|
||||
// As a result the j-index will now map into the -z physical direction,
|
||||
// and the k-index will map to the +y physical direction.
|
||||
linearTransform->preRotate(openvdb::math::pi<double>()/2.0, openvdb::math::X_AXIS);
|
||||
linearTransform->preRotate(M_PI/2, openvdb::math::X_AXIS);
|
||||
@endcode
|
||||
|
||||
@subsection sFrustumTransforms Frustum Transforms
|
||||
@@ -302,7 +302,7 @@ convention of right-multiplication of the matrix against a vector:
|
||||
openvdb::math::Mat4d transform = openvdb::math::Mat4d::identity();
|
||||
transform.preScale(openvdb::math::Vec3d(2,3,2));
|
||||
transform.postTranslate(openvdb::math::Vec3d(1,0,0));
|
||||
transform.postRotate(openvdb::math::X_AXIS, openvdb::math::pi<double>()/3.0);
|
||||
transform.postRotate(openvdb::math::X_AXIS, M_PI/3.0);
|
||||
|
||||
// Location of a point in index space
|
||||
openvdb::math::Vec3d indexSpace(1,2,3);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
```cpp
|
||||
#include <openvdb/tools/LevelSetSphere.h> // replace with your own dependencies for generating the OpenVDB grid
|
||||
#include <nanovdb/util/CreateNanoGrid.h> // converter from OpenVDB to NanoVDB (includes NanoVDB.h and GridManager.h)
|
||||
#include <nanovdb/util/OpenToNanoVDB.h> // converter from OpenVDB to NanoVDB (includes NanoVDB.h and GridManager.h)
|
||||
#include <nanovdb/util/IO.h>
|
||||
|
||||
// Convert an openvdb level set sphere into a nanovdb, use accessors to print out multiple values from both
|
||||
@@ -17,7 +17,7 @@ int main()
|
||||
auto srcGrid = openvdb::tools::createLevelSetSphere<openvdb::FloatGrid>(100.0f, openvdb::Vec3f(0.0f), 1.0f);
|
||||
|
||||
// Convert the OpenVDB grid, srcGrid, into a NanoVDB grid handle.
|
||||
auto handle = nanovdb::createNanoGrid(*srcGrid);
|
||||
auto handle = nanovdb::openToNanoVDB(*srcGrid);
|
||||
|
||||
// Define a (raw) pointer to the NanoVDB grid on the host. Note we match the value type of the srcGrid!
|
||||
auto* dstGrid = handle.grid<float>();
|
||||
@@ -77,7 +77,7 @@ int main()
|
||||
|
||||
```cpp
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/util/cuda/CudaDeviceBuffer.h> // required for CUDA memory management
|
||||
#include <nanovdb/DefaultCudaAllocator.h> // required for CUDA memory management
|
||||
|
||||
extern "C" void launch_kernels(const nanovdb::NanoGrid<float>*,
|
||||
const nanovdb::NanoGrid<float>*,
|
||||
|
||||
+33
-167
@@ -5,174 +5,40 @@
|
||||
* [NanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/NanoVDB.h) C++11 implementation of the core data structure and its access methods.
|
||||
* [CNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/CNanoVDB.h) Incomplete but useable C99 implementation of the core data structure and its access methods. Designed in particular for use in OpenCL kernels. Note that this relies on zero-sized arrays for the _reserved padding, so will not work on all compilers (with MSVC being a particular example)
|
||||
* [PNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/PNanoVDB.h) C99 implementation of the core data structure and its access methods. More complete coverage than CNanoVDB. This version is pointer-less and supports virtually all graphics APIs.
|
||||
* [GridHandle.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/GridHandle.h) defines a handler for the memory allocated to a NanoVDB grid.
|
||||
* [io/IO.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/io/IO.h) implements I/O support.
|
||||
* [tools/CreateNanoGrid.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/tools/CreateNanoGrid.h) defines the converter from OpenVDB to NanoVDB and obviously depends on the OpenVDB library (as the only header file).
|
||||
* [math/Ray.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/Ray.h) Ray class.
|
||||
* [math/HDDA.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/HDDA.h) HDDA related.
|
||||
* [math/SampleFromVoxels.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/SampleFromVoxels.h) interpolation.
|
||||
* [util/GridHandle.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/GridHandle.h) defines a handler for the memory allocated to a NanoVDB grid.
|
||||
* [util/IO.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/IO.h) implements I/O support.
|
||||
* [util/OpenToNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/OpenToNanoVDB.h) defines the converter from OpenVDB to NanoVDB and obviously depends on the OpenVDB library (as the only header file).
|
||||
* [Ray.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/Ray.h) Ray class.
|
||||
* [HDDA.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/HDDA.h) HDDA related.
|
||||
* [SampleFromVoxels.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/SampleFromVoxels.h) interpolation.
|
||||
|
||||
```bash
|
||||
foo@bar:~$ tree
|
||||
.
|
||||
├── CMakeLists.txt
|
||||
├── cmd
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── convert
|
||||
│ │ └── nanovdb_convert.cc
|
||||
│ ├── print
|
||||
│ │ └── nanovdb_print.cc
|
||||
│ ├── updateFiles.sh
|
||||
│ └── validate
|
||||
│ └── nanovdb_validate.cc
|
||||
├── CNanoVDB.h
|
||||
├── cuda
|
||||
│ ├── DeviceBuffer.h
|
||||
│ ├── GridHandle.cuh
|
||||
│ └── NodeManager.cuh
|
||||
├── docs
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── codingstyle.txt
|
||||
│ └── doxygen-config
|
||||
├── examples
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── ex_bump_pool_buffer
|
||||
│ │ └── bump_pool_buffer.cc
|
||||
│ ├── ex_collide_level_set
|
||||
│ │ ├── common.h
|
||||
│ │ ├── main.cc
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_index_grid_cuda
|
||||
│ │ ├── index_grid_cuda.cc
|
||||
│ │ └── index_grid_cuda_kernel.cu
|
||||
│ ├── ex_make_custom_nanovdb
|
||||
│ │ └── make_custom_nanovdb.cc
|
||||
│ ├── ex_make_custom_nanovdb_cuda
|
||||
│ │ ├── make_custom_nanovdb_cuda.cc
|
||||
│ │ └── make_custom_nanovdb_cuda_kernel.cu
|
||||
│ ├── ex_make_funny_nanovdb
|
||||
│ │ └── make_funny_nanovdb.cc
|
||||
│ ├── ex_make_nanovdb_sphere
|
||||
│ │ └── make_nanovdb_sphere.cc
|
||||
│ ├── ex_make_typed_grids
|
||||
│ │ └── make_typed_grids.cc
|
||||
│ ├── ex_map_pool_buffer
|
||||
│ │ └── map_pool_buffer.cc
|
||||
│ ├── ex_modify_nanovdb_thrust
|
||||
│ │ ├── modify_nanovdb_thrust.cc
|
||||
│ │ └── modify_nanovdb_thrust.cu
|
||||
│ ├── ex_nodemanager_cuda
|
||||
│ │ ├── nodemanager_cuda.cc
|
||||
│ │ └── nodemanager_cuda_kernel.cu
|
||||
│ ├── ex_openvdb_to_nanovdb
|
||||
│ │ └── openvdb_to_nanovdb.cc
|
||||
│ ├── ex_openvdb_to_nanovdb_accessor
|
||||
│ │ └── openvdb_to_nanovdb_accessor.cc
|
||||
│ ├── ex_openvdb_to_nanovdb_cuda
|
||||
│ │ ├── openvdb_to_nanovdb_cuda.cc
|
||||
│ │ └── openvdb_to_nanovdb_cuda_kernel.cu
|
||||
│ ├── ex_raytrace_fog_volume
|
||||
│ │ ├── common.h
|
||||
│ │ ├── main.cc
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_raytrace_level_set
|
||||
│ │ ├── common.h
|
||||
│ │ ├── main.cc
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_read_nanovdb_sphere
|
||||
│ │ └── read_nanovdb_sphere.cc
|
||||
│ ├── ex_read_nanovdb_sphere_accessor
|
||||
│ │ └── read_nanovdb_sphere_accessor.cc
|
||||
│ ├── ex_read_nanovdb_sphere_accessor_cuda
|
||||
│ │ ├── read_nanovdb_sphere_accessor_cuda.cu
|
||||
│ │ └── read_nanovdb_sphere_accessor_cuda_kernel.cu
|
||||
│ ├── ex_util
|
||||
│ │ └── ComputePrimitives.h
|
||||
│ ├── ex_voxels_to_grid_cuda
|
||||
│ │ └── ex_voxels_to_grid_cuda.cu
|
||||
│ ├── ex_vox_to_nanovdb
|
||||
│ │ ├── vox_to_nanovdb.cc
|
||||
│ │ └── VoxToNanoVDB.h
|
||||
│ └── ex_write_nanovdb_grids
|
||||
│ └── write_nanovdb_grids.cc
|
||||
├── GridHandle.h
|
||||
├── HostBuffer.h
|
||||
├── io
|
||||
│ └── IO.h
|
||||
├── math
|
||||
│ ├── CSampleFromVoxels.h
|
||||
│ ├── DitherLUT.h
|
||||
│ ├── HDDA.h
|
||||
│ ├── Math.h
|
||||
│ ├── Ray.h
|
||||
│ ├── SampleFromVoxels.h
|
||||
│ └── Stencils.h
|
||||
├── NanoVDB.h
|
||||
├── NodeManager.h
|
||||
├── PNanoVDB.h
|
||||
├── Readme.md
|
||||
├── tools
|
||||
│ ├── CreateNanoGrid.h
|
||||
│ ├── CreatePrimitives.h
|
||||
│ ├── cuda
|
||||
│ │ ├── AddBlindData.cuh
|
||||
│ │ ├── GridChecksum.cuh
|
||||
│ │ ├── GridStats.cuh
|
||||
│ │ ├── GridValidator.cuh
|
||||
│ │ ├── IndexToGrid.cuh
|
||||
│ │ ├── PointsToGrid.cuh
|
||||
│ │ └── SignedFloodFill.cuh
|
||||
│ ├── GridBuilder.h
|
||||
│ ├── GridChecksum.h
|
||||
│ ├── GridStats.h
|
||||
│ ├── GridValidator.h
|
||||
│ └── NanoToOpenVDB.h
|
||||
├── unittest
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── pnanovdb_validate_strides.h
|
||||
│ ├── TestNanoVDB.cc
|
||||
│ ├── TestNanoVDB.cu
|
||||
│ └── TestOpenVDB.cc
|
||||
└── util
|
||||
├── CpuTimer.h
|
||||
├── CreateNanoGrid.h
|
||||
├── cuda
|
||||
│ ├── CudaAddBlindData.cuh
|
||||
│ ├── CudaDeviceBuffer.h
|
||||
│ ├── CudaGridChecksum.cuh
|
||||
│ ├── CudaGridHandle.cuh
|
||||
│ ├── CudaGridStats.cuh
|
||||
│ ├── CudaGridValidator.cuh
|
||||
│ ├── CudaIndexToGrid.cuh
|
||||
│ ├── CudaNodeManager.cuh
|
||||
│ ├── CudaPointsToGrid.cuh
|
||||
│ ├── CudaSignedFloodFill.cuh
|
||||
│ ├── CudaUtils.h
|
||||
│ ├── GpuTimer.h
|
||||
│ ├── Timer.h
|
||||
│ └── Util.h
|
||||
├── DitherLUT.h
|
||||
├── ForEach.h
|
||||
├── GridBuilder.h
|
||||
├── GridChecksum.h
|
||||
├── GridStats.h
|
||||
├── GridValidator.h
|
||||
├── HDDA.h
|
||||
├── HostBuffer.h
|
||||
├── Invoke.h
|
||||
├── IO.h
|
||||
├── NanoToOpenVDB.h
|
||||
├── NodeManager.h
|
||||
├── OpenToNanoVDB.h
|
||||
├── PrefixSum.h
|
||||
├── Primitives.h
|
||||
├── Range.h
|
||||
├── Ray.h
|
||||
├── Reduce.h
|
||||
├── SampleFromVoxels.h
|
||||
├── Stencils.h
|
||||
├── Timer.h
|
||||
└── Util.h
|
||||
├── nanovdb
|
||||
│ ├── CNanoVDB.h
|
||||
│ ├── NanoVDB.h
|
||||
│ ├── PNanoVDB.h
|
||||
│ └── util
|
||||
│ ├── CSampleFromVoxels.h
|
||||
│ ├── CudaDeviceBuffer.h
|
||||
| ├── DitherLUT.h
|
||||
│ ├── ForEach.h
|
||||
│ ├── GridBuilder.h
|
||||
│ ├── GridChecksum.h
|
||||
│ ├── GridHandle.h
|
||||
│ ├── GridStats.h
|
||||
│ ├── GridValidator.h
|
||||
│ ├── HDDA.h
|
||||
│ ├── HostBuffer.h
|
||||
│ ├── Invoke.h
|
||||
│ ├── IO.h
|
||||
│ ├── NanoToOpenVDB.h
|
||||
│ ├── OpenToNanoVDB.h
|
||||
| ├── Primitives.h
|
||||
│ ├── Range.h
|
||||
│ ├── Ray.h
|
||||
| ├── Reduce.h
|
||||
| ├── SampleFromVoxels.h
|
||||
| └── Stencils.h
|
||||
```
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@
|
||||
|
||||
Welcome to the NanoVDB documentation page.
|
||||
|
||||
* @subpage NanoVDB_HowToBuild
|
||||
* @subpage NanoVDB_FAQ
|
||||
* @subpage NanoVDB_SourceTree
|
||||
* @subpage NanoVDB_HelloWorld
|
||||
* @ref NanoVDB_HowToBuild
|
||||
* @ref NanoVDB_FAQ
|
||||
* @ref NanoVDB_SourceTree
|
||||
* @ref NanoVDB_HelloWorld
|
||||
+9
-5
@@ -4,8 +4,10 @@
|
||||
|
||||
This section describes the OpenVDB Python module and includes Python code
|
||||
snippets and some complete programs that illustrate how to perform common tasks.
|
||||
The Python module exposes most of the functionality of the C++
|
||||
@vdblink::Grid Grid@endlink class, including I/O, metadata
|
||||
(An <a href="./python/index.html">API reference</a> is also available,
|
||||
if <a href="http://epydoc.sourceforge.net/">Epydoc</a> is installed.)
|
||||
As of OpenVDB 2.0, the Python module exposes most of the functionality
|
||||
of the C++ @vdblink::Grid Grid@endlink class, including I/O, metadata
|
||||
management, voxel access and iteration, but almost none of the many
|
||||
@ref secToolUtils "tools".
|
||||
We expect to add support for tools in forthcoming releases.
|
||||
@@ -441,9 +443,11 @@ not on their active states or other attributes.
|
||||
|
||||
Large data sets are often handled in Python using
|
||||
<a href="http://www.numpy.org/">NumPy</a>.
|
||||
The @b copyFromArray and @b copyToArray grid methods can be used to exchange
|
||||
data efficiently between scalar-valued grids and three-dimensional NumPy
|
||||
arrays and between vector-valued grids and four-dimensional NumPy arrays.
|
||||
The OpenVDB Python module can optionally be compiled with NumPy support.
|
||||
With NumPy enabled, the @b copyFromArray and @b copyToArray grid methods
|
||||
can be used to exchange data efficiently between scalar-valued grids
|
||||
and three-dimensional NumPy arrays and between vector-valued grids and
|
||||
four-dimensional NumPy arrays.
|
||||
@code{.py}
|
||||
>>> import pyopenvdb as vdb
|
||||
>>> import numpy
|
||||
|
||||
+24
-147
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
project(NanoVDB LANGUAGES C CXX)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -25,8 +25,7 @@ message(STATUS "----------------------------------------------------")
|
||||
option(NANOVDB_BUILD_TOOLS "Build command-line tools" ON)
|
||||
option(NANOVDB_BUILD_UNITTESTS "Build Unit tests" OFF)
|
||||
option(NANOVDB_BUILD_EXAMPLES "Build examples" OFF)
|
||||
#option(NANOVDB_BUILD_BENCHMARK "Build benchmark in examples" OFF)
|
||||
option(NANOVDB_BUILD_PYTHON_MODULE "Build the nanovdb Python module" OFF)
|
||||
option(NANOVDB_BUILD_BENCHMARK "Build benchmark in examples" OFF)
|
||||
|
||||
option(NANOVDB_USE_INTRINSICS "Build with hardware intrinsics support" OFF)
|
||||
option(NANOVDB_USE_CUDA "Build with CUDA support" OFF)
|
||||
@@ -72,18 +71,19 @@ if(UNIX)
|
||||
find_package(Threads REQUIRED)
|
||||
endif()
|
||||
|
||||
#if(NANOVDB_BUILD_UNITTESTS OR NANOVDB_BUILD_BENCHMARK)
|
||||
if(NANOVDB_BUILD_UNITTESTS)
|
||||
find_package(GTest ${MINIMUM_GOOGLETEST_VERSION} REQUIRED)
|
||||
if(NANOVDB_BUILD_UNITTESTS OR NANOVDB_BUILD_BENCHMARK)
|
||||
find_package(GTest REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_CUDA)
|
||||
set(CMAKE_CUDA_STANDARD 17)
|
||||
set(CMAKE_CUDA_STANDARD 11)
|
||||
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
|
||||
|
||||
# Allow the user to provide CMAKE_CUDA_ARCHITECTURES
|
||||
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
|
||||
set(CMAKE_CUDA_ARCHITECTURES 75)
|
||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
|
||||
# Allow the user to provide CMAKE_CUDA_ARCHITECTURES
|
||||
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
|
||||
set(CMAKE_CUDA_ARCHITECTURES 75)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
enable_language(CUDA)
|
||||
@@ -113,38 +113,26 @@ if(NANOVDB_USE_CUDA)
|
||||
get_target_property(VDB_MSVC_RUNTIME_SELECTION openvdb MSVC_RUNTIME_LIBRARY)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(CUDAToolkit)
|
||||
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
# This will automatically clone CCCL from GitHub and make the exported cmake targets available
|
||||
CPMAddPackage(
|
||||
NAME CCCL
|
||||
GITHUB_REPOSITORY nvidia/cccl
|
||||
GIT_TAG main # Fetches the latest commit on the main branch
|
||||
)
|
||||
|
||||
find_package(NCCL)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_OPENVDB)
|
||||
if(NOT OPENVDB_BUILD_CORE AND NOT TARGET OpenVDB::openvdb)
|
||||
find_package(OpenVDB REQUIRED COMPONENTS openvdb)
|
||||
# disable the shared libs that OpenVDB's cmake switches ON.
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_TBB AND NOT TARGET TBB::tbb)
|
||||
find_package(TBB ${MINIMUM_TBB_VERSION} REQUIRED)
|
||||
find_package(TBB REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_BLOSC AND NOT TARGET Blosc::blosc)
|
||||
find_package(Blosc ${MINIMUM_BLOSC_VERSION} REQUIRED)
|
||||
find_package(Blosc REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_ZLIB AND NOT TARGET ZLIB::ZLIB)
|
||||
find_package(ZLIB ${MINIMUM_ZLIB_VERSION} REQUIRED)
|
||||
find_package(ZLIB REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_MAGICAVOXEL)
|
||||
@@ -173,80 +161,19 @@ endif()
|
||||
# NanoVDB header files
|
||||
set(NANOVDB_INCLUDE_FILES
|
||||
CNanoVDB.h
|
||||
GridHandle.h
|
||||
HostBuffer.h
|
||||
NanoVDB.h
|
||||
NodeManager.h
|
||||
PNanoVDB.h
|
||||
)
|
||||
|
||||
# NanoVDB cuda header files
|
||||
set(NANOVDB_INCLUDE_CUDA_FILES
|
||||
cuda/DeviceBuffer.h
|
||||
cuda/DeviceMesh.h
|
||||
cuda/DeviceResource.h
|
||||
cuda/DeviceStreamMap.h
|
||||
cuda/GridHandle.cuh
|
||||
cuda/NodeManager.cuh
|
||||
cuda/TempPool.h
|
||||
cuda/UnifiedBuffer.h
|
||||
)
|
||||
|
||||
# NanoVDB io header files
|
||||
set(NANOVDB_INCLUDE_IO_FILES
|
||||
io/IO.h
|
||||
)
|
||||
|
||||
# NanoVDB math header files
|
||||
set(NANOVDB_INCLUDE_MATH_FILES
|
||||
math/CSampleFromVoxels.h
|
||||
math/DitherLUT.h
|
||||
math/HDDA.h
|
||||
math/Math.h
|
||||
math/Ray.h
|
||||
math/SampleFromVoxels.h
|
||||
math/Stencils.h
|
||||
)
|
||||
|
||||
# NanoVDB tools header files
|
||||
set(NANOVDB_INCLUDE_TOOLS_FILES
|
||||
tools/CreateNanoGrid.h
|
||||
tools/CreatePrimitives.h
|
||||
tools/GridBuilder.h
|
||||
tools/GridChecksum.h
|
||||
tools/GridStats.h
|
||||
tools/GridValidator.h
|
||||
tools/NanoToOpenVDB.h
|
||||
tools/VoxelBlockManager.h
|
||||
)
|
||||
|
||||
# NanoVDB tools/cuda header files
|
||||
set(NANOVDB_INCLUDE_TOOLS_CUDA_FILES
|
||||
tools/cuda/AddBlindData.cuh
|
||||
tools/cuda/GridChecksum.cuh
|
||||
tools/cuda/GridStats.cuh
|
||||
tools/cuda/GridValidator.cuh
|
||||
tools/cuda/IndexToGrid.cuh
|
||||
tools/cuda/PointsToGrid.cuh
|
||||
tools/cuda/SignedFloodFill.cuh
|
||||
tools/cuda/MergeGrids.cuh
|
||||
tools/cuda/TopologyBuilder.cuh
|
||||
tools/cuda/RefineGrid.cuh
|
||||
tools/cuda/PruneGrid.cuh
|
||||
tools/cuda/DistributedPointsToGrid.cuh
|
||||
tools/cuda/DilateGrid.cuh
|
||||
tools/cuda/CoarsenGrid.cuh
|
||||
tools/cuda/VoxelBlockManager.cuh
|
||||
)
|
||||
|
||||
# NanoVDB util header files
|
||||
set(NANOVDB_INCLUDE_UTIL_FILES
|
||||
util/CpuTimer.h
|
||||
util/CreateNanoGrid.h
|
||||
set(NANOVDB_INCLUDE_UTILFILES
|
||||
util/CSampleFromVoxels.h
|
||||
util/CudaDeviceBuffer.h
|
||||
util/DitherLUT.h
|
||||
util/ForEach.h
|
||||
util/GridBuilder.h
|
||||
util/GridChecksum.h
|
||||
util/GridHandle.h
|
||||
util/GridStats.h
|
||||
util/GridValidator.h
|
||||
util/HDDA.h
|
||||
@@ -256,38 +183,12 @@ set(NANOVDB_INCLUDE_UTIL_FILES
|
||||
util/NanoToOpenVDB.h
|
||||
util/NodeManager.h
|
||||
util/OpenToNanoVDB.h
|
||||
util/PrefixSum.h
|
||||
util/Primitives.h
|
||||
util/Range.h
|
||||
util/Ray.h
|
||||
util/Reduce.h
|
||||
util/SampleFromVoxels.h
|
||||
util/Stencils.h
|
||||
util/Timer.h
|
||||
util/Util.h
|
||||
util/MorphologyHelpers.h
|
||||
)
|
||||
|
||||
# NanoVDB util/cuda header files
|
||||
set(NANOVDB_INCLUDE_UTIL_CUDA_FILES
|
||||
util/cuda/CudaAddBlindData.cuh
|
||||
util/cuda/CudaGridHandle.cuh
|
||||
util/cuda/CudaIndexToGrid.cuh
|
||||
util/cuda/CudaSignedFloodFill.cuh
|
||||
util/cuda/Timer.h
|
||||
util/cuda/CudaDeviceBuffer.h
|
||||
util/cuda/CudaGridStats.cuh
|
||||
util/cuda/CudaNodeManager.cuh
|
||||
util/cuda/CudaUtils.h
|
||||
util/cuda/Util.h
|
||||
util/cuda/CudaGridChecksum.cuh
|
||||
util/cuda/CudaGridValidator.cuh
|
||||
util/cuda/CudaPointsToGrid.cuh
|
||||
util/cuda/GpuTimer.h
|
||||
util/cuda/Morphology.cuh
|
||||
util/cuda/MorphologyHelpers.cuh
|
||||
util/cuda/DeviceGridTraits.cuh
|
||||
util/cuda/Injection.cuh
|
||||
)
|
||||
|
||||
add_library(nanovdb INTERFACE)
|
||||
@@ -338,14 +239,6 @@ if(NANOVDB_USE_CUDA)
|
||||
target_compile_options(nanovdb INTERFACE
|
||||
"$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:-arch=sm_75>")
|
||||
endif()
|
||||
|
||||
# Add CUDA includes to any C++ units which use NanoVDB
|
||||
target_link_libraries(nanovdb INTERFACE CCCL::CCCL CUDA::cudart)
|
||||
|
||||
if(NCCL_FOUND)
|
||||
target_compile_definitions(nanovdb INTERFACE -DNANOVDB_USE_NCCL)
|
||||
target_link_libraries(nanovdb INTERFACE NCCL::NCCL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_MAGICAVOXEL)
|
||||
@@ -357,23 +250,11 @@ if(TARGET Threads::Threads)
|
||||
target_link_libraries(nanovdb INTERFACE Threads::Threads)
|
||||
endif()
|
||||
|
||||
set(NANOVDB_INSTALL_ROOT_DIR ${NANOVDB_INSTALL_INCLUDEDIR}/nanovdb)
|
||||
set(NANOVDB_INSTALL_CUDA_DIR ${NANOVDB_INSTALL_ROOT_DIR}/cuda)
|
||||
set(NANOVDB_INSTALL_IO_DIR ${NANOVDB_INSTALL_ROOT_DIR}/io)
|
||||
set(NANOVDB_INSTALL_MATH_DIR ${NANOVDB_INSTALL_ROOT_DIR}/math)
|
||||
set(NANOVDB_INSTALL_TOOLS_DIR ${NANOVDB_INSTALL_ROOT_DIR}/tools)
|
||||
set(NANOVDB_INSTALL_TOOLS_CUDA_DIR ${NANOVDB_INSTALL_TOOLS_DIR}/cuda)
|
||||
set(NANOVDB_INSTALL_UTIL_DIR ${NANOVDB_INSTALL_ROOT_DIR}/util)
|
||||
set(NANOVDB_INSTALL_UTIL_CUDA_DIR ${NANOVDB_INSTALL_UTIL_DIR}/cuda)
|
||||
set(NANOVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/nanovdb)
|
||||
set(NANOVDB_INSTALL_UTILDIR ${NANOVDB_INSTALL_INCLUDEDIR}/util)
|
||||
|
||||
install(FILES ${NANOVDB_INCLUDE_FILES} DESTINATION ${NANOVDB_INSTALL_ROOT_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_CUDA_FILES} DESTINATION ${NANOVDB_INSTALL_CUDA_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_IO_FILES} DESTINATION ${NANOVDB_INSTALL_IO_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_MATH_FILES} DESTINATION ${NANOVDB_INSTALL_MATH_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_TOOLS_FILES} DESTINATION ${NANOVDB_INSTALL_TOOLS_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_TOOLS_CUDA_FILES} DESTINATION ${NANOVDB_INSTALL_TOOLS_CUDA_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_UTIL_FILES} DESTINATION ${NANOVDB_INSTALL_UTIL_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_UTIL_CUDA_FILES} DESTINATION ${NANOVDB_INSTALL_UTIL_CUDA_DIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_FILES} DESTINATION ${NANOVDB_INSTALL_INCLUDEDIR})
|
||||
install(FILES ${NANOVDB_INCLUDE_UTILFILES} DESTINATION ${NANOVDB_INSTALL_UTILDIR})
|
||||
|
||||
###############################################################################
|
||||
# Options
|
||||
@@ -390,7 +271,3 @@ endif()
|
||||
if(NANOVDB_BUILD_EXAMPLES)
|
||||
add_subdirectory(examples)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_BUILD_PYTHON_MODULE)
|
||||
add_subdirectory(python)
|
||||
endif()
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
//
|
||||
// Simple C-wrapper for the nanovdb structure
|
||||
// Meant for systems where you lack a C++ compiler.
|
||||
//
|
||||
|
||||
/// @warning This header file will soon be deprecated in favor of PNanoVDB.h
|
||||
|
||||
#ifndef __CNANOVDB__
|
||||
#define __CNANOVDB__
|
||||
|
||||
@@ -690,7 +687,7 @@ cnanovdb_griddata_valid(const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT grid)
|
||||
{
|
||||
if (!grid)
|
||||
return 0;
|
||||
if (grid->mMagic != 0x304244566f6e614eUL && grid->mMagic != 0x314244566f6e614eUL)
|
||||
if (grid->mMagic != 0x304244566f6e614eUL)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1,533 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/GridHandle.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date January 8, 2020
|
||||
|
||||
\brief Defines GridHandle, which manages a host, and possibly a device,
|
||||
memory buffer containing one or more NanoVDB grids.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_GRID_HANDLE_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_GRID_HANDLE_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <fstream> // for std::ifstream
|
||||
#include <iostream> // for std::cerr/cout
|
||||
#include <vector>
|
||||
#include <initializer_list>
|
||||
|
||||
#include <nanovdb/NanoVDB.h>// for toGridType
|
||||
#include <nanovdb/HostBuffer.h>
|
||||
#include <nanovdb/tools/GridChecksum.h>// for updateGridCount
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
// --------------------------> GridHandle <------------------------------------
|
||||
|
||||
struct GridHandleMetaData {uint64_t offset, size; GridType gridType;};
|
||||
|
||||
/// @brief This class serves to manage a buffer containing one or more NanoVDB Grids.
|
||||
///
|
||||
/// @note It is important to note that this class does NOT depend on OpenVDB.
|
||||
template<typename BufferT = HostBuffer>
|
||||
class GridHandle
|
||||
{
|
||||
std::vector<GridHandleMetaData> mMetaData;
|
||||
BufferT mBuffer;
|
||||
|
||||
template <typename T>
|
||||
static T* no_const(const T* ptr) { return const_cast<T*>(ptr); }
|
||||
|
||||
public:
|
||||
using BufferType = BufferT;
|
||||
|
||||
/// @brief Move constructor from a dual host-device buffer
|
||||
/// @param buffer buffer containing one or more NanoGrids that will be moved into this GridHandle
|
||||
/// @throw Will throw and error with the buffer does not contain a valid NanoGrid!
|
||||
/// @note The implementation of this template specialization is in nanovdb/cuda/GridHandle.cuh since it requires CUDA
|
||||
template<typename T = BufferT, typename util::enable_if<BufferTraits<T>::hasDeviceDual, int>::type = 0>
|
||||
GridHandle(T&& buffer);
|
||||
|
||||
/// @brief Move constructor from a host buffer
|
||||
/// @param buffer buffer containing one or more NanoGrids that will be moved into this GridHandle
|
||||
/// @throw Will throw and error with the buffer does not contain a valid NanoGrid!
|
||||
template<typename T = BufferT, typename util::disable_if<BufferTraits<T>::hasDeviceDual, int>::type = 0>
|
||||
GridHandle(T&& buffer);
|
||||
|
||||
/// @brief Constructs an empty GridHandle
|
||||
GridHandle() = default;
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
GridHandle(const GridHandle&) = delete;
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
GridHandle(GridHandle&& other) noexcept {
|
||||
mBuffer = std::move(other.mBuffer);
|
||||
mMetaData = std::move(other.mMetaData);
|
||||
}
|
||||
|
||||
/// @brief clear this GridHandle to an empty handle
|
||||
void reset() {
|
||||
mBuffer.clear();
|
||||
mMetaData.clear();
|
||||
}
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
GridHandle& operator=(const GridHandle&) = delete;
|
||||
|
||||
/// @brief Move copy assignment operation
|
||||
GridHandle& operator=(GridHandle&& other) noexcept {
|
||||
mBuffer = std::move(other.mBuffer);
|
||||
mMetaData = std::move(other.mMetaData);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// @brief Performs a deep copy of the GridHandle, possibly templated on a different buffer type
|
||||
/// @tparam OtherBufferT Buffer type of the deep copy
|
||||
/// @param buffer optional buffer used for allocation
|
||||
/// @return A new handle of the specified buffer type that contains a deep copy of the current handle
|
||||
template <typename OtherBufferT = HostBuffer>
|
||||
GridHandle<OtherBufferT> copy(const OtherBufferT& buffer = OtherBufferT()) const;
|
||||
|
||||
/// @brief Return a reference to the buffer
|
||||
BufferT& buffer() { return mBuffer; }
|
||||
|
||||
/// @brief Return a const reference to the buffer
|
||||
const BufferT& buffer() const { return mBuffer; }
|
||||
|
||||
/// @brief Returns a non-const pointer to the data.
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized
|
||||
void* data() { return mBuffer.data(); }
|
||||
|
||||
/// @brief Returns a const pointer to the data.
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized
|
||||
const void* data() const { return mBuffer.data(); }
|
||||
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const void*>::type
|
||||
deviceData() const { return mBuffer.deviceData(); }
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const void*>::type
|
||||
deviceData(int device) const { return mBuffer.deviceData(device); }
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void*>::type
|
||||
deviceData() { return mBuffer.deviceData(); }
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void*>::type
|
||||
deviceData(int device) { return mBuffer.deviceData(device); }
|
||||
|
||||
//@{
|
||||
/// @brief Returns the size in bytes of the raw memory buffer managed by this GridHandle.
|
||||
[[deprecated("Use GridHandle::bufferSize instead.")]] uint64_t size() const { return mBuffer.size(); }
|
||||
uint64_t bufferSize() const { return mBuffer.size(); }
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/// @brief Return true if this handle is empty, i.e. has no allocated memory
|
||||
bool empty() const { return mBuffer.size() == 0; }
|
||||
bool isEmpty() const { return mBuffer.size() == 0; }
|
||||
//@}
|
||||
|
||||
/// @brief Return true if this handle is not empty, i.e. contains at least one grid
|
||||
operator bool() const { return !this->empty(); }
|
||||
|
||||
/// @brief Returns a const host pointer to the @a n'th NanoVDB grid encoded in this GridHandle.
|
||||
/// @tparam ValueT Value type of the grid point to be returned
|
||||
/// @param n Index of the (host) grid pointer to be returned
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle no host grid, @a n is invalid
|
||||
/// or if the template parameter does not match the specified grid!
|
||||
template<typename ValueT>
|
||||
const NanoGrid<ValueT>* grid(uint32_t n = 0) const;
|
||||
|
||||
/// @brief Returns a host pointer to the @a n'th NanoVDB grid encoded in this GridHandle.
|
||||
/// @tparam ValueT Value type of the grid point to be returned
|
||||
/// @param n Index of the (host) grid pointer to be returned
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle no host grid, @a n is invalid
|
||||
/// or if the template parameter does not match the specified grid!
|
||||
template<typename ValueT>
|
||||
NanoGrid<ValueT>* grid(uint32_t n = 0) {return const_cast<NanoGrid<ValueT>*>(static_cast<const GridHandle*>(this)->template grid<ValueT>(n));}
|
||||
|
||||
/// @brief Return a const pointer to the @a n'th grid encoded in this GridHandle on the device, e.g. GPU
|
||||
/// @tparam ValueT Value type of the grid point to be returned
|
||||
/// @param n Index of the (device) grid pointer to be returned
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle has no device grid, @a n is invalid,
|
||||
/// or if the template parameter does not match the specified grid.
|
||||
template<typename ValueT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NanoGrid<ValueT>*>::type
|
||||
deviceGrid(uint32_t n=0) const;
|
||||
|
||||
/// @brief Return a const pointer to the @a n'th grid encoded in this GridHandle on the device, e.g. GPU
|
||||
/// @tparam ValueT Value type of the grid point to be returned
|
||||
/// @param n Index of the grid pointer to be returned
|
||||
/// @param verbose if non-zero error messages will be printed in case something failed
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized, @a n is invalid,
|
||||
/// or if the template parameter does not match the specified grid.
|
||||
template<typename ValueT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, NanoGrid<ValueT>*>::type
|
||||
deviceGrid(uint32_t n=0){return const_cast<NanoGrid<ValueT>*>(static_cast<const GridHandle*>(this)->template deviceGrid<ValueT>(n));}
|
||||
|
||||
/// @brief Upload the grid to the device, e.g. from CPU to GPU
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(void* stream, bool sync = true) { mBuffer.deviceUpload(stream, sync); }
|
||||
|
||||
/// @brief Upload the host buffer to a specific device buffer. It device buffer doesn't exist it's created first
|
||||
/// @param device Device to upload host data to
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(int device = 0, void* stream = nullptr, bool sync = true) { mBuffer.deviceUpload(device, stream, sync); }
|
||||
|
||||
/// @brief Download the grid to from the device, e.g. from GPU to CPU
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(void* stream, bool sync = true) { mBuffer.deviceDownload(stream, sync); }
|
||||
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(int device = 0, void* stream = nullptr, bool sync = true) { mBuffer.deviceDownload(device, stream, sync); }
|
||||
|
||||
/// @brief Check if the buffer is this handle has any padding, i.e. if the buffer is larger than the combined size of all its grids
|
||||
/// @return true is the combined size of all grid is smaller than the buffer size
|
||||
bool isPadded() const {return mMetaData.empty() ? false : mMetaData.back().offset + mMetaData.back().size != mBuffer.size();}
|
||||
|
||||
/// @brief Return the total number of grids contained in this buffer
|
||||
uint32_t gridCount() const {return static_cast<uint32_t>(mMetaData.size());}
|
||||
|
||||
/// @brief Return the grid size of the @a n'th grid in this GridHandle
|
||||
/// @param n index of the grid (assumed to be less than gridCount())
|
||||
/// @return Return the byte size of the specified grid
|
||||
uint64_t gridSize(uint32_t n = 0) const {return mMetaData[n].size; }
|
||||
|
||||
/// @brief compute the total sum of memory footprints of all the grids in this buffer
|
||||
/// @return the number of bytes occupied by all grids associated with this buffer
|
||||
uint64_t totalGridSize() const {
|
||||
uint64_t sum = 0;
|
||||
for (auto &m : mMetaData) sum += m.size;
|
||||
NANOVDB_ASSERT(sum <= mBuffer.size());
|
||||
return sum;
|
||||
}
|
||||
|
||||
/// @brief compute the size of unused storage in this buffer
|
||||
/// @return the number of unused bytes in this buffer.
|
||||
uint64_t freeSize() const {return mBuffer.size() - this->totalGridSize();}
|
||||
|
||||
/// @brief Test if this buffer has any unused storage left, i.e. memory not occupied by grids
|
||||
/// @return true if there is no extra storage left in this buffer, i.e. empty or fully occupied with grids
|
||||
bool isFull() const { return this->totalGridSize() == mBuffer.size(); }
|
||||
|
||||
/// @brief Return the GridType of the @a n'th grid in this GridHandle
|
||||
/// @param n index of the grid (assumed to be less than gridCount())
|
||||
/// @return Return the GridType of the specified grid
|
||||
GridType gridType(uint32_t n = 0) const {return mMetaData[n].gridType; }
|
||||
|
||||
/// @brief Access to the GridData of the n'th grid in the current handle
|
||||
/// @param n zero-based ID of the grid
|
||||
/// @return Const pointer to the n'th GridData in the current handle
|
||||
const GridData* gridData(uint32_t n = 0) const;
|
||||
|
||||
/// @brief Returns a const point to the @a n'th grid meta data
|
||||
/// @param n zero-based ID of the grid
|
||||
/// @warning Note that the return pointer can be NULL if the GridHandle was not initialized
|
||||
const GridMetaData* gridMetaData(uint32_t n = 0) const;
|
||||
|
||||
/// @brief Write a specific grid in this buffer to an output stream
|
||||
/// @param os output stream that the buffer will be written to
|
||||
/// @param n zero-based index of the grid to be written to stream
|
||||
void write(std::ostream& os, uint32_t n) const {
|
||||
if (const GridData* data = this->gridData(n)) {
|
||||
os.write((const char*)data, data->mGridSize);
|
||||
} else {
|
||||
throw std::runtime_error("GridHandle does not contain a #" + std::to_string(n) + " grid");
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Write the entire grid buffer to an output stream
|
||||
/// @param os output stream that the buffer will be written to
|
||||
void write(std::ostream& os) const {
|
||||
for (uint32_t n=0; n<this->gridCount(); ++n) this->write(os, n);
|
||||
}
|
||||
|
||||
/// @brief Write this entire grid buffer to a file
|
||||
/// @param fileName string name of the output file
|
||||
void write(const std::string &fileName) const {
|
||||
std::ofstream os(fileName, std::ios::out | std::ios::binary | std::ios::trunc);
|
||||
if (!os.is_open()) throw std::ios_base::failure("Unable to open file named \"" + fileName + "\" for output");
|
||||
this->write(os);
|
||||
}
|
||||
|
||||
/// @brief Write a specific grid to file
|
||||
/// @param fileName string name of the output file
|
||||
/// @param n zero-based index of the grid to be written to file
|
||||
void write(const std::string &fileName, uint32_t n) const {
|
||||
std::ofstream os(fileName, std::ios::out | std::ios::binary | std::ios::trunc);
|
||||
if (!os.is_open()) throw std::ios_base::failure("Unable to open file named \"" + fileName + "\" for output");
|
||||
this->write(os, n);
|
||||
}
|
||||
|
||||
/// @brief Read an entire raw grid buffer from an input stream
|
||||
/// @param is input stream containing a raw grid buffer
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
/// @throw Will throw a std::logic_error if the stream does not contain a valid raw grid
|
||||
void read(std::istream& is, const BufferT& pool = BufferT());
|
||||
|
||||
/// @brief Read a specific grid from an input stream containing a raw grid buffer
|
||||
/// @param is input stream containing a raw grid buffer
|
||||
/// @param n zero-based index of the grid to be read
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
/// @throw Will throw a std::logic_error if the stream does not contain a valid raw grid
|
||||
void read(std::istream& is, uint32_t n, const BufferT& pool = BufferT());
|
||||
|
||||
/// @brief Read a specific grid from an input stream containing a raw grid buffer
|
||||
/// @param is input stream containing a raw grid buffer
|
||||
/// @param gridName string name of the grid to be read
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
/// @throw Will throw a std::logic_error if the stream does not contain a valid raw grid with the specified name
|
||||
void read(std::istream& is, const std::string &gridName, const BufferT& pool = BufferT());
|
||||
|
||||
/// @brief Read a raw grid buffer from a file
|
||||
/// @param filename string name of the input file containing a raw grid buffer
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
void read(const std::string &fileName, const BufferT& pool = BufferT()) {
|
||||
std::ifstream is(fileName, std::ios::in | std::ios::binary);
|
||||
if (!is.is_open()) throw std::ios_base::failure("Unable to open file named \"" + fileName + "\" for input");
|
||||
this->read(is, pool);
|
||||
}
|
||||
|
||||
/// @brief Read a specific grid from a file containing a raw grid buffer
|
||||
/// @param filename string name of the input file containing a raw grid buffer
|
||||
/// @param n zero-based index of the grid to be read
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
/// @throw Will throw a std::ios_base::failure if the file does not exist and a
|
||||
/// std::logic_error if the files does not contain a valid raw grid
|
||||
void read(const std::string &fileName, uint32_t n, const BufferT& pool = BufferT()) {
|
||||
std::ifstream is(fileName, std::ios::in | std::ios::binary);
|
||||
if (!is.is_open()) throw std::ios_base::failure("Unable to open file named \"" + fileName + "\" for input");
|
||||
this->read(is, n, pool);
|
||||
}
|
||||
|
||||
/// @brief Read a specific grid from a file containing a raw grid buffer
|
||||
/// @param filename string name of the input file containing a raw grid buffer
|
||||
/// @param gridName string name of the grid to be read
|
||||
/// @param pool optional pool from which to allocate the new grid buffer
|
||||
/// @throw Will throw a std::ios_base::failure if the file does not exist and a
|
||||
/// std::logic_error if the files does not contain a valid raw grid withe the specified name
|
||||
void read(const std::string &fileName, const std::string &gridName, const BufferT& pool = BufferT()) {
|
||||
std::ifstream is(fileName, std::ios::in | std::ios::binary);
|
||||
if (!is.is_open()) throw std::ios_base::failure("Unable to open file named \"" + fileName + "\" for input");
|
||||
this->read(is, gridName, pool);
|
||||
}
|
||||
}; // GridHandle
|
||||
|
||||
// --------------------------> Implementation of private methods in GridHandle <------------------------------------
|
||||
|
||||
template<typename BufferT>
|
||||
inline const GridData* GridHandle<BufferT>::gridData(uint32_t n) const
|
||||
{
|
||||
const void *data = this->data();
|
||||
if (data == nullptr || n >= mMetaData.size()) return nullptr;
|
||||
return util::PtrAdd<GridData>(data, mMetaData[n].offset);
|
||||
}// const GridData* GridHandle<BufferT>::gridData(uint32_t n) const
|
||||
|
||||
template<typename BufferT>
|
||||
inline const GridMetaData* GridHandle<BufferT>::gridMetaData(uint32_t n) const
|
||||
{
|
||||
const auto *data = this->data();
|
||||
if (data == nullptr || n >= mMetaData.size()) return nullptr;
|
||||
return util::PtrAdd<GridMetaData>(data, mMetaData[n].offset);
|
||||
}// const GridMetaData* GridHandle<BufferT>::gridMetaData(uint32_t n) const
|
||||
|
||||
inline __hostdev__ void cpyGridHandleMeta(const GridData *data, GridHandleMetaData *meta)
|
||||
{
|
||||
uint64_t offset = 0;
|
||||
for (auto *p=meta, *q=p+data->mGridCount; p!=q; ++p) {
|
||||
*p = {offset, data->mGridSize, data->mGridType};
|
||||
offset += p->size;
|
||||
data = util::PtrAdd<GridData>(data, p->size);
|
||||
}
|
||||
}// void cpyGridHandleMeta(const GridData *data, GridHandleMetaData *meta)
|
||||
|
||||
// template specialization of move constructor from a host buffer
|
||||
template<typename BufferT>
|
||||
template<typename T, typename util::disable_if<BufferTraits<T>::hasDeviceDual, int>::type>
|
||||
GridHandle<BufferT>::GridHandle(T&& buffer)
|
||||
{
|
||||
static_assert(util::is_same<T,BufferT>::value, "Expected U==BufferT");
|
||||
mBuffer = std::move(buffer);
|
||||
if (auto *data = reinterpret_cast<const GridData*>(mBuffer.data())) {
|
||||
if (!data->isValid()) throw std::runtime_error("GridHandle was constructed with an invalid host buffer");
|
||||
mMetaData.resize(data->mGridCount);
|
||||
cpyGridHandleMeta(data, mMetaData.data());
|
||||
}
|
||||
}// GridHandle<BufferT>::GridHandle(T&& buffer)
|
||||
|
||||
template<typename BufferT>
|
||||
template <typename OtherBufferT>
|
||||
inline GridHandle<OtherBufferT> GridHandle<BufferT>::copy(const OtherBufferT& other) const
|
||||
{
|
||||
if (mBuffer.isEmpty()) return GridHandle<OtherBufferT>();// return an empty handle
|
||||
auto buffer = OtherBufferT::create(mBuffer.size(), &other);
|
||||
std::memcpy(buffer.data(), mBuffer.data(), mBuffer.size());// deep copy of buffer
|
||||
return GridHandle<OtherBufferT>(std::move(buffer));
|
||||
}// GridHandle<OtherBufferT> GridHandle<BufferT>::copy(const OtherBufferT& other) const
|
||||
|
||||
template<typename BufferT>
|
||||
template<typename ValueT>
|
||||
inline const NanoGrid<ValueT>* GridHandle<BufferT>::grid(uint32_t n) const
|
||||
{
|
||||
const void *data = mBuffer.data();
|
||||
if (data == nullptr || n >= mMetaData.size() || mMetaData[n].gridType != toGridType<ValueT>()) return nullptr;
|
||||
return util::PtrAdd<NanoGrid<ValueT>>(data, mMetaData[n].offset);
|
||||
}// const NanoGrid<ValueT>* GridHandle<BufferT>::grid(uint32_t n) const
|
||||
|
||||
template<typename BufferT>
|
||||
template<typename ValueT, typename U>
|
||||
inline typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NanoGrid<ValueT>*>::type
|
||||
GridHandle<BufferT>::deviceGrid(uint32_t n) const
|
||||
{
|
||||
const void *data = mBuffer.deviceData();
|
||||
if (data == nullptr || n >= mMetaData.size() || mMetaData[n].gridType != toGridType<ValueT>()) return nullptr;
|
||||
return util::PtrAdd<NanoGrid<ValueT>>(data, mMetaData[n].offset);
|
||||
}// GridHandle<BufferT>::deviceGrid(uint32_t n) cons
|
||||
|
||||
template<typename BufferT>
|
||||
void GridHandle<BufferT>::read(std::istream& is, const BufferT& pool)
|
||||
{
|
||||
GridData data;
|
||||
is.read((char*)&data, sizeof(GridData));
|
||||
if (data.isValid()) {
|
||||
uint64_t size = data.mGridSize, sum = 0u;
|
||||
while(data.mGridIndex + 1u < data.mGridCount) {// loop over remaining raw grids in stream
|
||||
is.seekg(data.mGridSize - sizeof(GridData), std::ios::cur);// skip grid
|
||||
is.read((char*)&data, sizeof(GridData));
|
||||
sum += data.mGridSize;
|
||||
}
|
||||
auto buffer = BufferT::create(size + sum, &pool);
|
||||
is.seekg(-int64_t(sum + sizeof(GridData)), std::ios::cur);// rewind to start
|
||||
is.read((char*)(buffer.data()), buffer.size());
|
||||
*this = GridHandle(std::move(buffer));
|
||||
} else {
|
||||
is.seekg(-sizeof(GridData), std::ios::cur);// rewind
|
||||
throw std::logic_error("This stream does not contain a valid raw grid buffer");
|
||||
}
|
||||
}// void GridHandle<BufferT>::read(std::istream& is, const BufferT& pool)
|
||||
|
||||
template<typename BufferT>
|
||||
void GridHandle<BufferT>::read(std::istream& is, uint32_t n, const BufferT& pool)
|
||||
{
|
||||
GridData data;
|
||||
is.read((char*)&data, sizeof(GridData));
|
||||
if (data.isValid()) {
|
||||
if (n>=data.mGridCount) throw std::runtime_error("stream does not contain a #" + std::to_string(n) + " grid");
|
||||
while(data.mGridIndex != n) {
|
||||
is.seekg(data.mGridSize - sizeof(GridData), std::ios::cur);// skip grid
|
||||
is.read((char*)&data, sizeof(GridData));
|
||||
}
|
||||
auto buffer = BufferT::create(data.mGridSize, &pool);
|
||||
is.seekg(-sizeof(GridData), std::ios::cur);// rewind
|
||||
is.read((char*)(buffer.data()), data.mGridSize);
|
||||
tools::updateGridCount((GridData*)buffer.data(), 0u, 1u);
|
||||
*this = GridHandle(std::move(buffer));
|
||||
} else {
|
||||
is.seekg(-sizeof(GridData), std::ios::cur);// rewind sizeof(GridData) bytes to undo initial read
|
||||
throw std::logic_error("This file does not contain a valid raw buffer");
|
||||
}
|
||||
}// void GridHandle<BufferT>::read(std::istream& is, uint32_t n, const BufferT& pool)
|
||||
|
||||
template<typename BufferT>
|
||||
void GridHandle<BufferT>::read(std::istream& is, const std::string &gridName, const BufferT& pool)
|
||||
{
|
||||
static const std::streamsize byteSize = sizeof(GridData);
|
||||
GridData data;
|
||||
is.read((char*)&data, byteSize);
|
||||
is.seekg(-byteSize, std::ios::cur);// rewind
|
||||
if (data.isValid()) {
|
||||
uint32_t n = 0;
|
||||
while(data.mGridName != gridName && n++ < data.mGridCount) {
|
||||
is.seekg(data.mGridSize, std::ios::cur);// skip grid
|
||||
is.read((char*)&data, byteSize);// read sizeof(GridData) bytes
|
||||
is.seekg(-byteSize, std::ios::cur);// rewind
|
||||
}
|
||||
if (n>data.mGridCount) throw std::runtime_error("No raw grid named \""+gridName+"\"");
|
||||
auto buffer = BufferT::create(data.mGridSize, &pool);
|
||||
is.read((char*)(buffer.data()), data.mGridSize);
|
||||
tools::updateGridCount((GridData*)buffer.data(), 0u, 1u);
|
||||
*this = GridHandle(std::move(buffer));
|
||||
} else {
|
||||
throw std::logic_error("This file does not contain a valid raw buffer");
|
||||
}
|
||||
}// void GridHandle<BufferT>::read(std::istream& is, const std::string &gridName n, const BufferT& pool)
|
||||
|
||||
// --------------------------> free-standing functions <------------------------------------
|
||||
|
||||
/// @brief Split all grids in a single GridHandle into a vector of multiple GridHandles each with a single grid
|
||||
/// @tparam BufferT Type of the input and output grid buffers
|
||||
/// @param handle GridHandle with grids that will be slip into individual GridHandles
|
||||
/// @param pool optional pool used for allocation of output GridHandle
|
||||
/// @return Vector of GridHandles each containing a single grid
|
||||
template<typename BufferT, template <class, class...> class VectorT = std::vector>
|
||||
inline VectorT<GridHandle<BufferT>>
|
||||
splitGrids(const GridHandle<BufferT> &handle, const BufferT* other = nullptr)
|
||||
{
|
||||
using HandleT = GridHandle<BufferT>;
|
||||
const void *ptr = handle.data();
|
||||
if (ptr == nullptr) return VectorT<HandleT>();
|
||||
VectorT<HandleT> handles(handle.gridCount());
|
||||
for (auto &h : handles) {
|
||||
const GridData *src = reinterpret_cast<const GridData*>(ptr);
|
||||
NANOVDB_ASSERT(src->isValid());
|
||||
auto buffer = BufferT::create(src->mGridSize, other);
|
||||
GridData *dst = reinterpret_cast<GridData*>(buffer.data());
|
||||
std::memcpy(dst, src, src->mGridSize);
|
||||
tools::updateGridCount(dst, 0u, 1u);
|
||||
h = HandleT(std::move(buffer));
|
||||
ptr = util::PtrAdd(ptr, src->mGridSize);
|
||||
}
|
||||
return handles;
|
||||
}// splitGrids
|
||||
|
||||
/// @brief Combines (or merges) multiple GridHandles into a single GridHandle containing all grids
|
||||
/// @tparam BufferT Type of the input and output grid buffers
|
||||
/// @param handles Vector of GridHandles to be combined
|
||||
/// @param pool optional pool used for allocation of output GridHandle
|
||||
/// @return single GridHandle containing all input grids
|
||||
template<typename BufferT, template <class, class...> class VectorT>
|
||||
inline GridHandle<BufferT>
|
||||
mergeGrids(const VectorT<GridHandle<BufferT>> &handles, const BufferT* pool = nullptr)
|
||||
{
|
||||
uint64_t size = 0u;
|
||||
uint32_t counter = 0u, gridCount = 0u;
|
||||
for (auto &h : handles) {
|
||||
gridCount += h.gridCount();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) size += h.gridSize(n);
|
||||
}
|
||||
auto buffer = BufferT::create(size, pool);
|
||||
void *dst = buffer.data();
|
||||
for (auto &h : handles) {
|
||||
const void *src = h.data();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) {
|
||||
std::memcpy(dst, src, h.gridSize(n));
|
||||
GridData *data = reinterpret_cast<GridData*>(dst);
|
||||
NANOVDB_ASSERT(data->isValid());
|
||||
tools::updateGridCount(data, counter++, gridCount);
|
||||
dst = util::PtrAdd(dst, data->mGridSize);
|
||||
src = util::PtrAdd(src, data->mGridSize);
|
||||
}
|
||||
}
|
||||
return GridHandle<BufferT>(std::move(buffer));
|
||||
}// mergeGrids
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#if defined(__CUDACC__)
|
||||
#include <nanovdb/cuda/GridHandle.cuh>
|
||||
#endif// defined(__CUDACC__)
|
||||
|
||||
#endif // NANOVDB_GRID_HANDLE_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,591 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
@file nanovdb/HostBuffer.h
|
||||
|
||||
@date April 20, 2021
|
||||
|
||||
@brief HostBuffer - a buffer that contains a shared or private bump
|
||||
pool to either externally or internally managed host memory.
|
||||
|
||||
@details This HostBuffer can be used in multiple ways, most of which are
|
||||
demonstrated in the examples below. Memory in the pool can
|
||||
be managed or unmanged (e.g. internal or external) and can
|
||||
be shared between multiple buffers or belong to a single buffer.
|
||||
|
||||
Example that uses HostBuffer::create inside io::readGrids to create a
|
||||
full self-managed buffer, i.e. not shared and without padding, per grid in the file.
|
||||
@code
|
||||
auto handles = nanovdb::io::readGrids("file.nvdb");
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createFull. Assuming you have a raw pointer
|
||||
to a NanoVDB grid of unknown type, this examples shows how to create its
|
||||
GridHandle which can be used to enquire about the grid type and meta data.
|
||||
@code
|
||||
void *data;// pointer to a NanoVDB grid of unknown type
|
||||
uint64_t size;// byte size of NanoVDB grid of unknown type
|
||||
auto buffer = nanovdb::HostBuffer::createFull(size, data);
|
||||
nanovdb::GridHandle<> gridHandle(std::move(buffer));
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createPool for internally managed host memory.
|
||||
Suppose you want to read multiple grids in multiple files, but reuse the same
|
||||
fixed sized memory buffer to both avoid memory fragmentation as well as
|
||||
exceeding the fixed memory ceiling!
|
||||
@code
|
||||
auto pool = nanovdb::HostBuffer::createPool(1 << 30);// 1 GB memory pool
|
||||
std::vector<std::string>> frames;// vector of grid names
|
||||
for (int i=0; i<frames.size(); ++i) {
|
||||
auto handles = nanovdb::io::readGrids(frames[i], 0, pool);// throws if grids in file exceed 1 GB
|
||||
...
|
||||
pool.reset();// clears all handles and resets the memory pool for reuse
|
||||
}
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createPool for externally managed host memory.
|
||||
Note that in this example @c handles are allowed to outlive @c pool since
|
||||
they internally store a shared pointer to the memory pool. However @c data
|
||||
MUST outlive @c handles since the pool does not own its memory in this example.
|
||||
@code
|
||||
const size_t poolSize = 1 << 30;// 1 GB
|
||||
void *data = std::malloc(size + NANOVDB_DATA_ALIGNMENT);// 1 GB pool with padding
|
||||
void *buffer = nanovdb::alignPtr(data);// 32B aligned buffer
|
||||
//void *buffer = std::aligned_alloc(NANOVDB_DATA_ALIGNMENT, poolSize);// in C++17
|
||||
auto pool = nanovdb::HostBuffer::createPool(poolSize, buffer);
|
||||
auto handles1 = nanovdb::io::readGrids("file1.nvdb", 0, pool);
|
||||
auto handles2 = nanovdb::io::readGrids("file2.nvdb", 0, pool);
|
||||
....
|
||||
std::free(data);
|
||||
//std::free(buffer);
|
||||
@endcode
|
||||
|
||||
Example that uses HostBuffer::createPool for externally managed host memory.
|
||||
Note that in this example @c handles are allowed to outlive @c pool since
|
||||
they internally store a shared pointer to the memory pool. However @c array
|
||||
MUST outlive @c handles since the pool does not own its memory in this example.
|
||||
@code
|
||||
const size_t poolSize = 1 << 30;// 1 GB
|
||||
std::unique_ptr<char[]> array(new char[size + NANOVDB_DATA_ALIGNMENT]);// scoped pool of 1 GB with padding
|
||||
void *buffer = nanovdb::alignPtr(array.get());// 32B aligned buffer
|
||||
auto pool = nanovdb::HostBuffer::createPool(poolSize, buffer);
|
||||
auto handles = nanovdb::io::readGrids("file.nvdb", 0, pool);
|
||||
@endcode
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/NanoVDB.h>// for NANOVDB_DATA_ALIGNMENT;
|
||||
#include <stdint.h> // for types like int32_t etc
|
||||
#include <cstdio> // for fprintf
|
||||
#include <cstdlib> // for std::malloc/std::realloc/std::free
|
||||
#include <memory>// for std::make_shared
|
||||
#include <mutex>// for std::mutex
|
||||
#include <unordered_set>// for std::unordered_set
|
||||
#include <cassert>// for assert
|
||||
#include <sstream>// for std::stringstream
|
||||
#include <cstring>// for memcpy
|
||||
|
||||
#define checkPtr(ptr, msg) \
|
||||
{ \
|
||||
ptrAssert((ptr), (msg), __FILE__, __LINE__); \
|
||||
}
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
template<typename BufferT>
|
||||
struct BufferTraits
|
||||
{
|
||||
static constexpr bool hasDeviceDual = false;
|
||||
};
|
||||
|
||||
// ----------------------------> HostBuffer <--------------------------------------
|
||||
|
||||
/// @brief This is a buffer that contains a shared or private pool
|
||||
/// to either externally or internally managed host memory.
|
||||
///
|
||||
/// @note Terminology:
|
||||
/// Pool: 0 = buffer.size() < buffer.poolSize()
|
||||
/// Buffer: 0 < buffer.size() < buffer.poolSize()
|
||||
/// Full: 0 < buffer.size() = buffer.poolSize()
|
||||
/// Empty: 0 = buffer.size() = buffer.poolSize()
|
||||
class HostBuffer
|
||||
{
|
||||
struct Pool;// forward declaration of private pool struct
|
||||
std::shared_ptr<Pool> mPool;
|
||||
uint64_t mSize; // total number of bytes for the NanoVDB grid.
|
||||
void* mData; // raw buffer for the NanoVDB grid.
|
||||
|
||||
#if defined(DEBUG) || defined(_DEBUG)
|
||||
static inline void ptrAssert(void* ptr, const char* msg, const char* file, int line, bool abort = true)
|
||||
{
|
||||
if (ptr == nullptr) {
|
||||
fprintf(stderr, "NULL pointer error: %s %s %d\n", msg, file, line);
|
||||
if (abort)
|
||||
exit(1);
|
||||
}
|
||||
if (uint64_t(ptr) % NANOVDB_DATA_ALIGNMENT) {
|
||||
fprintf(stderr, "Alignment pointer error: %s %s %d\n", msg, file, line);
|
||||
if (abort)
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void ptrAssert(void*, const char*, const char*, int, bool = true)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
public:
|
||||
/// @brief Return a full buffer or an empty buffer
|
||||
HostBuffer(uint64_t bufferSize = 0);
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
HostBuffer(HostBuffer&& other);
|
||||
|
||||
/// @brief Custom descructor
|
||||
~HostBuffer() { this->clear(); }
|
||||
|
||||
/// @brief Move copy assignment operation
|
||||
HostBuffer& operator=(HostBuffer&& other);
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
HostBuffer(const HostBuffer&) = delete;
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
HostBuffer& operator=(const HostBuffer&) = delete;
|
||||
|
||||
/// @brief Return a pool buffer which satisfies: buffer.size == 0,
|
||||
/// buffer.poolSize() == poolSize, and buffer.data() == nullptr.
|
||||
/// If data==nullptr, memory for the pool will be allocated.
|
||||
///
|
||||
/// @throw If poolSize is zero.
|
||||
static HostBuffer createPool(uint64_t poolSize, void *data = nullptr);
|
||||
|
||||
/// @brief Return a full buffer which satisfies: buffer.size == bufferSize,
|
||||
/// buffer.poolSize() == bufferSize, and buffer.data() == data.
|
||||
/// If data==nullptr, memory for the pool will be allocated.
|
||||
///
|
||||
/// @throw If bufferSize is zero.
|
||||
static HostBuffer createFull(uint64_t bufferSize, void *data = nullptr);
|
||||
|
||||
/// @brief Return a buffer with @c bufferSize bytes managed by
|
||||
/// the specified memory @c pool. If none is provided, i.e.
|
||||
/// @c pool == nullptr or @c pool->poolSize() == 0, one is
|
||||
/// created with size @c bufferSize, i.e. a full buffer is returned.
|
||||
///
|
||||
/// @throw If the specified @c pool has insufficient memory for
|
||||
/// the requested buffer size.
|
||||
static HostBuffer create(uint64_t bufferSize, const HostBuffer* pool = nullptr);
|
||||
|
||||
/// @brief Initialize as a full buffer with the specified size. If data is NULL
|
||||
/// the memory is internally allocated.
|
||||
void init(uint64_t bufferSize, void *data = nullptr);
|
||||
|
||||
//@{
|
||||
/// @brief Retuns a pointer to the raw memory buffer managed by this allocator.
|
||||
///
|
||||
/// @warning Note that the pointer can be NULL if the allocator was not initialized!
|
||||
const void* data() const { return mData; }
|
||||
void* data() { return mData; }
|
||||
//@}
|
||||
|
||||
/// @brief Returns an offset pointer of a specific type from the allocated host memory
|
||||
/// @tparam T Type of the pointer returned
|
||||
/// @param count Numbers of elements of @c parameter type T to skip
|
||||
/// @warning might return NULL
|
||||
template <typename T>
|
||||
T* data(ptrdiff_t count = 0) const {return mData ? reinterpret_cast<T*>(mData) + count : nullptr;}
|
||||
|
||||
//@{
|
||||
/// @brief Returns the size in bytes associated with this buffer.
|
||||
uint64_t bufferSize() const { return mSize; }
|
||||
uint64_t size() const { return this->bufferSize(); }
|
||||
//@}
|
||||
|
||||
/// @brief Returns the size in bytes of the memory pool shared with this instance.
|
||||
uint64_t poolSize() const;
|
||||
|
||||
/// @brief Return true if memory is managed (using std::malloc and std:free) by the
|
||||
/// shared pool in this buffer. Else memory is assumed to be managed externally.
|
||||
bool isManaged() const;
|
||||
|
||||
//@{
|
||||
/// @brief Returns true if this buffer has no memory associated with it
|
||||
bool isEmpty() const { return !mPool || mSize == 0 || mData == nullptr; }
|
||||
bool empty() const { return this->isEmpty(); }
|
||||
//@}
|
||||
|
||||
/// @brief Return true if this is a pool, i.e. an empty buffer with a nonempty
|
||||
/// internal pool, i.e. this->size() == 0 and this->poolSize() != 0
|
||||
bool isPool() const { return mSize == 0 && this->poolSize() > 0; }
|
||||
|
||||
/// @brief Return true if the pool exists, is nonempty but has no more available memory
|
||||
bool isFull() const;
|
||||
|
||||
/// @brief Clear this buffer so it is empty.
|
||||
void clear();
|
||||
|
||||
/// @brief Clears all existing buffers that are registered against the memory pool
|
||||
/// and resets the pool so it can be reused to create new buffers.
|
||||
///
|
||||
/// @throw If this instance is not empty or contains no pool.
|
||||
///
|
||||
/// @warning This method is not thread-safe!
|
||||
void reset();
|
||||
|
||||
/// @brief Total number of bytes from the pool currently in use by buffers
|
||||
uint64_t poolUsage() const;
|
||||
|
||||
/// @brief resize the pool size. It will attempt to resize the existing
|
||||
/// memory block, but if that fails a deep copy is performed.
|
||||
/// If @c data is not NULL it will be used as new externally
|
||||
/// managed memory for the pool. All registered buffers are
|
||||
/// updated so GridHandle::grid might return a new address (if
|
||||
/// deep copy was performed).
|
||||
///
|
||||
/// @note This method can be use to resize the memory pool and even
|
||||
/// change it from internally to externally managed memory or vice versa.
|
||||
///
|
||||
/// @throw if @c poolSize is less than this->poolUsage() the used memory
|
||||
/// or allocations fail.
|
||||
void resizePool(uint64_t poolSize, void *data = nullptr);
|
||||
|
||||
}; // HostBuffer class
|
||||
|
||||
// --------------------------> Implementation of HostBuffer::Pool <------------------------------------
|
||||
|
||||
// This is private struct of HostBuffer so you can safely ignore the API
|
||||
struct HostBuffer::Pool
|
||||
{
|
||||
using HashTableT = std::unordered_set<HostBuffer*>;
|
||||
std::mutex mMutex; // mutex for updating mRegister and mFree
|
||||
HashTableT mRegister;
|
||||
void *mData, *mFree;
|
||||
uint64_t mSize, mPadding;
|
||||
bool mManaged;
|
||||
|
||||
/// @brief External memory ctor
|
||||
Pool(uint64_t size = 0, void* data = nullptr)
|
||||
: mData(data)
|
||||
, mFree(mData)
|
||||
, mSize(size)
|
||||
, mPadding(0)
|
||||
, mManaged(data == nullptr)
|
||||
{
|
||||
if (mManaged) {
|
||||
mData = Pool::alloc(mSize);
|
||||
if (mData == nullptr) throw std::runtime_error("Pool::Pool malloc failed");
|
||||
}
|
||||
mPadding = alignmentPadding(mData);
|
||||
if (!mManaged && mPadding != 0) {
|
||||
throw std::runtime_error("Pool::Pool: external memory buffer is not aligned to " +
|
||||
std::to_string(NANOVDB_DATA_ALIGNMENT) +
|
||||
" bytes.\nHint: use nanovdb::alignPtr or std::aligned_alloc (C++17 only)");
|
||||
}
|
||||
mFree = util::PtrAdd(mData, mPadding);
|
||||
}
|
||||
|
||||
/// @brief Custom destructor
|
||||
~Pool()
|
||||
{
|
||||
assert(mRegister.empty());
|
||||
if (mManaged) std::free(mData);
|
||||
}
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
Pool(const Pool&) = delete;
|
||||
|
||||
/// @brief Disallow move-construction
|
||||
Pool(const Pool&&) = delete;
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
Pool& operator=(const Pool&) = delete;
|
||||
|
||||
/// @brief Disallow move assignment operation
|
||||
Pool& operator=(const Pool&&) = delete;
|
||||
|
||||
/// @brief Return the total number of bytes used from this Pool by buffers
|
||||
uint64_t usage() const { return util::PtrDiff(mFree, mData) - mPadding; }
|
||||
|
||||
/// @brief Allocate a buffer of the specified size and add it to the register
|
||||
void add(HostBuffer* buffer, uint64_t size)
|
||||
{
|
||||
void *alignedFree = util::PtrAdd(mFree, alignmentPadding(mFree));
|
||||
|
||||
if (util::PtrAdd(alignedFree, size) > util::PtrAdd(mData, mPadding + mSize)) {
|
||||
std::stringstream ss;
|
||||
ss << "HostBuffer::Pool: insufficient memory\n"
|
||||
<< "\tA buffer requested " << size << " bytes with " << NANOVDB_DATA_ALIGNMENT
|
||||
<< "-bytes alignment from a pool with "
|
||||
<< mSize << " bytes of which\n\t" << (util::PtrDiff(alignedFree, mData) - mPadding)
|
||||
<< " bytes are used by " << mRegister.size() << " other buffer(s). "
|
||||
<< "Pool is " << (mManaged ? "internally" : "externally") << " managed.\n";
|
||||
throw std::runtime_error(ss.str());
|
||||
}
|
||||
buffer->mSize = size;
|
||||
const std::lock_guard<std::mutex> lock(mMutex);
|
||||
mRegister.insert(buffer);
|
||||
buffer->mData = alignedFree;
|
||||
mFree = util::PtrAdd(alignedFree, size);
|
||||
}
|
||||
|
||||
/// @brief Remove the specified buffer from the register
|
||||
void remove(HostBuffer *buffer)
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(mMutex);
|
||||
mRegister.erase(buffer);
|
||||
}
|
||||
|
||||
/// @brief Replaces buffer1 with buffer2 in the register
|
||||
void replace(HostBuffer *buffer1, HostBuffer *buffer2)
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(mMutex);
|
||||
mRegister.erase( buffer1);
|
||||
mRegister.insert(buffer2);
|
||||
}
|
||||
|
||||
/// @brief Reset the register and all its buffers
|
||||
void reset()
|
||||
{
|
||||
for (HostBuffer *buffer : mRegister) {
|
||||
buffer->mPool.reset();
|
||||
buffer->mSize = 0;
|
||||
buffer->mData = nullptr;
|
||||
}
|
||||
mRegister.clear();
|
||||
mFree = util::PtrAdd(mData, mPadding);
|
||||
}
|
||||
|
||||
/// @brief Resize this Pool and update registered buffers as needed. If data is no NULL
|
||||
/// it is used as externally managed memory.
|
||||
void resize(uint64_t size, void *data = nullptr)
|
||||
{
|
||||
const uint64_t memUsage = this->usage();
|
||||
|
||||
const bool managed = (data == nullptr);
|
||||
|
||||
if (!managed && alignmentPadding(data) != 0) {
|
||||
throw std::runtime_error("Pool::resize: external memory buffer is not aligned to " +
|
||||
std::to_string(NANOVDB_DATA_ALIGNMENT) + " bytes");
|
||||
}
|
||||
|
||||
if (memUsage > size) {
|
||||
throw std::runtime_error("Pool::resize: insufficient memory");
|
||||
}
|
||||
|
||||
uint64_t padding = 0;
|
||||
if (mManaged && managed && size != mSize) { // managed -> managed
|
||||
padding = mPadding;
|
||||
data = Pool::realloc(mData, memUsage, size, padding); // performs both copy and free of mData
|
||||
} else if (!mManaged && managed) { // un-managed -> managed
|
||||
data = Pool::alloc(size);
|
||||
padding = alignmentPadding(data);
|
||||
}
|
||||
|
||||
if (data == nullptr) {
|
||||
throw std::runtime_error("Pool::resize: allocation failed");
|
||||
} else if (data != mData) {
|
||||
void* paddedData = util::PtrAdd(data, padding);
|
||||
|
||||
if (!(mManaged && managed)) { // no need to copy if managed -> managed
|
||||
memcpy(paddedData, util::PtrAdd(mData, mPadding), memUsage);
|
||||
}
|
||||
|
||||
for (HostBuffer* buffer : mRegister) { // update registered buffers
|
||||
buffer->mData = util::PtrAdd(paddedData, util::PtrDiff(buffer->mData, util::PtrAdd(mData, mPadding)));
|
||||
}
|
||||
mFree = util::PtrAdd(paddedData, memUsage); // update the free pointer
|
||||
if (mManaged && !managed) {// only free if managed -> un-managed
|
||||
std::free(mData);
|
||||
}
|
||||
|
||||
mData = data;
|
||||
mPadding = padding;
|
||||
}
|
||||
mSize = size;
|
||||
mManaged = managed;
|
||||
}
|
||||
/// @brief Return true is all the memory in this pool is in use.
|
||||
bool isFull() const
|
||||
{
|
||||
assert(mFree <= util::PtrAdd(mData, mPadding + mSize));
|
||||
return mSize > 0 ? mFree == util::PtrAdd(mData, mPadding + mSize) : false;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
static void* alloc(uint64_t size)
|
||||
{
|
||||
// make sure we alloc enough space to align the result
|
||||
return std::malloc(size + NANOVDB_DATA_ALIGNMENT);
|
||||
}
|
||||
|
||||
static void* realloc(void* const origData,
|
||||
uint64_t origSize,
|
||||
uint64_t desiredSize,
|
||||
uint64_t& padding)
|
||||
{
|
||||
// make sure we alloc enough space to align the result
|
||||
void* data = std::realloc(origData, desiredSize + NANOVDB_DATA_ALIGNMENT);
|
||||
|
||||
if (data != nullptr && data != origData) {
|
||||
uint64_t newPadding = alignmentPadding(data);
|
||||
// Number of padding bytes may have changed -- move data if that's the case
|
||||
if (newPadding != padding) {
|
||||
// Realloc should not happen when shrinking down buffer, but let's be safe
|
||||
std::memmove(util::PtrAdd(data, newPadding),
|
||||
util::PtrAdd(data, padding),
|
||||
math::Min(origSize, desiredSize));
|
||||
padding = newPadding;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
};// struct HostBuffer::Pool
|
||||
|
||||
// --------------------------> Implementation of HostBuffer <------------------------------------
|
||||
|
||||
inline HostBuffer::HostBuffer(uint64_t size) : mPool(nullptr), mSize(size), mData(nullptr)
|
||||
{
|
||||
if (size>0) {
|
||||
mPool = std::make_shared<Pool>(size);
|
||||
mData = mPool->mFree;
|
||||
mPool->mRegister.insert(this);
|
||||
mPool->mFree = util::PtrAdd(mPool->mFree, size);
|
||||
}
|
||||
}
|
||||
|
||||
inline HostBuffer::HostBuffer(HostBuffer&& other) : mPool(other.mPool), mSize(other.mSize), mData(other.mData)
|
||||
{
|
||||
if (mPool && mSize != 0) {
|
||||
mPool->replace(&other, this);
|
||||
}
|
||||
other.mPool.reset();
|
||||
other.mSize = 0;
|
||||
other.mData = nullptr;
|
||||
}
|
||||
|
||||
inline void HostBuffer::init(uint64_t bufferSize, void *data)
|
||||
{
|
||||
if (bufferSize == 0) {
|
||||
throw std::runtime_error("HostBuffer: invalid buffer size");
|
||||
}
|
||||
if (mPool) {
|
||||
mPool.reset();
|
||||
}
|
||||
if (!mPool || mPool->mSize != bufferSize) {
|
||||
mPool = std::make_shared<Pool>(bufferSize, data);
|
||||
}
|
||||
mPool->add(this, bufferSize);
|
||||
}
|
||||
|
||||
inline HostBuffer& HostBuffer::operator=(HostBuffer&& other)
|
||||
{
|
||||
if (mPool) {
|
||||
mPool->remove(this);
|
||||
}
|
||||
mPool = other.mPool;
|
||||
mSize = other.mSize;
|
||||
mData = other.mData;
|
||||
if (mPool && mSize != 0) {
|
||||
mPool->replace(&other, this);
|
||||
}
|
||||
other.mPool.reset();
|
||||
other.mSize = 0;
|
||||
other.mData = nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline uint64_t HostBuffer::poolSize() const
|
||||
{
|
||||
return mPool ? mPool->mSize : 0u;
|
||||
}
|
||||
|
||||
inline uint64_t HostBuffer::poolUsage() const
|
||||
{
|
||||
return mPool ? mPool->usage(): 0u;
|
||||
}
|
||||
|
||||
inline bool HostBuffer::isManaged() const
|
||||
{
|
||||
return mPool ? mPool->mManaged : false;
|
||||
}
|
||||
|
||||
inline bool HostBuffer::isFull() const
|
||||
{
|
||||
return mPool ? mPool->isFull() : false;
|
||||
}
|
||||
|
||||
inline HostBuffer HostBuffer::createPool(uint64_t poolSize, void *data)
|
||||
{
|
||||
if (poolSize == 0) {
|
||||
throw std::runtime_error("HostBuffer: invalid pool size");
|
||||
}
|
||||
HostBuffer buffer;
|
||||
buffer.mPool = std::make_shared<Pool>(poolSize, data);
|
||||
// note the buffer is NOT registered by its pool since it is not using its memory
|
||||
buffer.mSize = 0;
|
||||
buffer.mData = nullptr;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
inline HostBuffer HostBuffer::createFull(uint64_t bufferSize, void *data)
|
||||
{
|
||||
if (bufferSize == 0) {
|
||||
throw std::runtime_error("HostBuffer: invalid buffer size");
|
||||
}
|
||||
HostBuffer buffer;
|
||||
buffer.mPool = std::make_shared<Pool>(bufferSize, data);
|
||||
buffer.mPool->add(&buffer, bufferSize);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
inline HostBuffer HostBuffer::create(uint64_t bufferSize, const HostBuffer* pool)
|
||||
{
|
||||
HostBuffer buffer;
|
||||
if (pool == nullptr || !pool->mPool) {
|
||||
buffer.mPool = std::make_shared<Pool>(bufferSize);
|
||||
} else {
|
||||
buffer.mPool = pool->mPool;
|
||||
}
|
||||
buffer.mPool->add(&buffer, bufferSize);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
inline void HostBuffer::clear()
|
||||
{
|
||||
if (mPool) {// remove self from the buffer register in the pool
|
||||
mPool->remove(this);
|
||||
}
|
||||
mPool.reset();
|
||||
mSize = 0;
|
||||
mData = nullptr;
|
||||
}
|
||||
|
||||
inline void HostBuffer::reset()
|
||||
{
|
||||
if (this->size()>0) {
|
||||
throw std::runtime_error("HostBuffer: only empty buffers can call reset");
|
||||
}
|
||||
if (!mPool) {
|
||||
throw std::runtime_error("HostBuffer: this buffer contains no pool to reset");
|
||||
}
|
||||
mPool->reset();
|
||||
}
|
||||
|
||||
inline void HostBuffer::resizePool(uint64_t size, void *data)
|
||||
{
|
||||
if (!mPool) {
|
||||
throw std::runtime_error("HostBuffer: this buffer contains no pool to resize");
|
||||
}
|
||||
mPool->resize(size, data);
|
||||
}
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
|
||||
+2496
-4033
File diff suppressed because it is too large
Load Diff
@@ -1,323 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/NodeManager.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date February 12, 2021
|
||||
|
||||
\brief This class allows for sequential access to nodes
|
||||
in a NanoVDB tree on both the host and device.
|
||||
|
||||
\details The ordering of the sequential access to nodes is always breadth-first!
|
||||
*/
|
||||
|
||||
#include <nanovdb/NanoVDB.h>// for NanoGrid etc
|
||||
#include <nanovdb/HostBuffer.h>// for HostBuffer
|
||||
|
||||
#ifndef NANOVDB_NODEMANAGER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_NODEMANAGER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
/// @brief NodeManager allows for sequential access to nodes
|
||||
template <typename BuildT>
|
||||
class NodeManager;
|
||||
|
||||
/// @brief NodeManagerHandle manages the memory of a NodeManager
|
||||
template<typename BufferT = HostBuffer>
|
||||
class NodeManagerHandle;
|
||||
|
||||
/// @brief brief Construct a NodeManager and return its handle
|
||||
///
|
||||
/// @param grid grid whose nodes will be accessed sequentially
|
||||
/// @param buffer buffer from which to allocate the output handle
|
||||
///
|
||||
/// @note This is the only way to create a NodeManager since it's using
|
||||
/// managed memory pointed to by a NodeManagerHandle.
|
||||
template <typename BuildT, typename BufferT = HostBuffer>
|
||||
NodeManagerHandle<BufferT> createNodeManager(const NanoGrid<BuildT> &grid,
|
||||
const BufferT& buffer = BufferT());
|
||||
|
||||
struct NodeManagerData
|
||||
{// 40B = 5*8B
|
||||
__hostdev__ NodeManagerData(void *grid) : mPadding{0}, mGrid(grid), mPtr{0,0,0}{}
|
||||
union {int64_t mPadding; uint8_t mLinear;};// 8B of which 1B is used for a binary flag
|
||||
void *mGrid;// 8B pointer to either host or device grid
|
||||
union {int64_t *mPtr[3], mOff[3];};// 24B, use mOff if mLinear!=0
|
||||
};
|
||||
|
||||
/// @brief This class serves to manage a raw memory buffer of a NanoVDB NodeManager or LeafManager.
|
||||
template<typename BufferT>
|
||||
class NodeManagerHandle
|
||||
{
|
||||
GridType mGridType{GridType::Unknown};
|
||||
BufferT mBuffer;
|
||||
|
||||
template<typename BuildT>
|
||||
const NodeManager<BuildT>* getMgr() const {
|
||||
return mGridType == toGridType<BuildT>() ? (const NodeManager<BuildT>*)mBuffer.data() : nullptr;
|
||||
}
|
||||
|
||||
template<typename BuildT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NodeManager<BuildT>*>::type
|
||||
getDeviceMgr() const {
|
||||
return mGridType == toGridType<BuildT>() ? (const NodeManager<BuildT>*)mBuffer.deviceData() : nullptr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static T* no_const(const T* ptr) { return const_cast<T*>(ptr); }
|
||||
|
||||
public:
|
||||
/// @brief Move constructor from a buffer
|
||||
NodeManagerHandle(GridType gridType, BufferT&& buffer) : mGridType(gridType) { mBuffer = std::move(buffer); }
|
||||
/// @brief Empty ctor
|
||||
NodeManagerHandle() = default;
|
||||
/// @brief Disallow copy-construction
|
||||
NodeManagerHandle(const NodeManagerHandle&) = delete;
|
||||
/// @brief Disallow copy assignment operation
|
||||
NodeManagerHandle& operator=(const NodeManagerHandle&) = delete;
|
||||
/// @brief Move copy assignment operation
|
||||
NodeManagerHandle& operator=(NodeManagerHandle&& other) noexcept {
|
||||
mGridType = other.mGridType;
|
||||
mBuffer = std::move(other.mBuffer);
|
||||
other.mGridType = GridType::Unknown;
|
||||
return *this;
|
||||
}
|
||||
/// @brief Move copy-constructor
|
||||
NodeManagerHandle(NodeManagerHandle&& other) noexcept {
|
||||
mGridType = other.mGridType;
|
||||
mBuffer = std::move(other.mBuffer);
|
||||
other.mGridType = GridType::Unknown;
|
||||
}
|
||||
/// @brief Default destructor
|
||||
~NodeManagerHandle() { this->reset(); }
|
||||
/// @brief clear the buffer
|
||||
void reset() { mBuffer.clear(); }
|
||||
|
||||
/// @brief Return a reference to the buffer
|
||||
BufferT& buffer() { return mBuffer; }
|
||||
|
||||
/// @brief Return a const reference to the buffer
|
||||
const BufferT& buffer() const { return mBuffer; }
|
||||
|
||||
/// @brief Returns a non-const pointer to the data.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the NodeManagerHandle was not initialized
|
||||
void* data() { return mBuffer.data(); }
|
||||
|
||||
/// @brief Returns a const pointer to the data.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the NodeManagerHandle was not initialized
|
||||
const void* data() const { return mBuffer.data(); }
|
||||
|
||||
/// @brief Returns the size in bytes of the raw memory buffer managed by this NodeManagerHandle's allocator.
|
||||
uint64_t size() const { return mBuffer.size(); }
|
||||
|
||||
/// @brief Returns a const pointer to the NodeManager encoded in this NodeManagerHandle.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT>
|
||||
const NodeManager<BuildT>* mgr() const { return this->template getMgr<BuildT>(); }
|
||||
|
||||
/// @brief Returns a pointer to the NodeManager encoded in this NodeManagerHandle.
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT>
|
||||
NodeManager<BuildT>* mgr() { return no_const(this->template getMgr<BuildT>()); }
|
||||
|
||||
/// @brief Return a const pointer to the NodeManager encoded in this NodeManagerHandle on the device, e.g. GPU
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, const NodeManager<BuildT>*>::type
|
||||
deviceMgr() const { return this->template getDeviceMgr<BuildT>(); }
|
||||
|
||||
/// @brief Return a const pointer to the NodeManager encoded in this NodeManagerHandle on the device, e.g. GPU
|
||||
///
|
||||
/// @warning Note that the return pointer can be NULL if the template parameter does not match the specified grid!
|
||||
template<typename BuildT, typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, NodeManager<BuildT>*>::type
|
||||
deviceMgr() { return no_const(this->template getDeviceMgr<BuildT>()); }
|
||||
|
||||
/// @brief Upload the NodeManager to the device, e.g. from CPU to GPU
|
||||
///
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceUpload(void* deviceGrid, void* stream = nullptr, bool sync = true)
|
||||
{
|
||||
assert(deviceGrid);
|
||||
auto *data = reinterpret_cast<NodeManagerData*>(mBuffer.data());
|
||||
void *tmp = data->mGrid;
|
||||
data->mGrid = deviceGrid;
|
||||
mBuffer.deviceUpload(stream, sync);
|
||||
data->mGrid = tmp;
|
||||
}
|
||||
|
||||
/// @brief Download the NodeManager to from the device, e.g. from GPU to CPU
|
||||
///
|
||||
/// @note This method is only available if the buffer supports devices
|
||||
template<typename U = BufferT>
|
||||
typename util::enable_if<BufferTraits<U>::hasDeviceDual, void>::type
|
||||
deviceDownload(void* stream = nullptr, bool sync = true)
|
||||
{
|
||||
auto *data = reinterpret_cast<NodeManagerData*>(mBuffer.data());
|
||||
void *tmp = data->mGrid;
|
||||
mBuffer.deviceDownload(stream, sync);
|
||||
data->mGrid = tmp;
|
||||
}
|
||||
};// NodeManagerHandle
|
||||
|
||||
/// @brief This class allows for sequential access to nodes in a NanoVDB tree
|
||||
///
|
||||
/// @details Nodes are always arranged breadth first during sequential access of nodes
|
||||
/// at a particular level.
|
||||
template<typename BuildT>
|
||||
class NodeManager : private NodeManagerData
|
||||
{
|
||||
using DataT = NodeManagerData;
|
||||
using GridT = NanoGrid<BuildT>;
|
||||
using TreeT = typename GridTree<GridT>::type;
|
||||
template<int LEVEL>
|
||||
using NodeT = typename NodeTrait<TreeT, LEVEL>::type;
|
||||
using RootT = NodeT<3>;// root node
|
||||
using Node2 = NodeT<2>;// upper internal node
|
||||
using Node1 = NodeT<1>;// lower internal node
|
||||
using Node0 = NodeT<0>;// leaf node
|
||||
|
||||
public:
|
||||
static constexpr bool FIXED_SIZE = Node0::FIXED_SIZE && Node1::FIXED_SIZE && Node2::FIXED_SIZE;
|
||||
|
||||
NodeManager(const NodeManager&) = delete;
|
||||
NodeManager(NodeManager&&) = delete;
|
||||
NodeManager& operator=(const NodeManager&) = delete;
|
||||
NodeManager& operator=(NodeManager&&) = delete;
|
||||
~NodeManager() = delete;
|
||||
|
||||
/// @brief return true if the nodes have both fixed size and are arranged breadth-first in memory.
|
||||
/// This allows for direct and memory-efficient linear access to nodes.
|
||||
__hostdev__ static bool isLinear(const GridT &grid) {return FIXED_SIZE && grid.isBreadthFirst();}
|
||||
|
||||
/// @brief return true if the nodes have both fixed size and are arranged breadth-first in memory.
|
||||
/// This allows for direct and memory-efficient linear access to nodes.
|
||||
__hostdev__ bool isLinear() const {return DataT::mLinear!=0u;}
|
||||
|
||||
/// @brief Return the memory footprint in bytes of the NodeManager derived from the specified grid
|
||||
__hostdev__ static uint64_t memUsage(const GridT &grid) {
|
||||
uint64_t size = sizeof(NodeManagerData);
|
||||
if (!NodeManager::isLinear(grid)) {
|
||||
const uint32_t *p = grid.tree().mNodeCount;
|
||||
size += sizeof(int64_t)*(p[0]+p[1]+p[2]);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/// @brief Return the memory footprint in bytes of this instance
|
||||
__hostdev__ uint64_t memUsage() const {return NodeManager::memUsage(this->grid());}
|
||||
|
||||
/// @brief Return a reference to the grid
|
||||
__hostdev__ GridT& grid() { return *reinterpret_cast<GridT*>(DataT::mGrid); }
|
||||
__hostdev__ const GridT& grid() const { return *reinterpret_cast<const GridT*>(DataT::mGrid); }
|
||||
|
||||
/// @brief Return a reference to the tree
|
||||
__hostdev__ TreeT& tree() { return this->grid().tree(); }
|
||||
__hostdev__ const TreeT& tree() const { return this->grid().tree(); }
|
||||
|
||||
/// @brief Return a reference to the root
|
||||
__hostdev__ RootT& root() { return this->tree().root(); }
|
||||
__hostdev__ const RootT& root() const { return this->tree().root(); }
|
||||
|
||||
/// @brief Return the number of tree nodes at the specified level
|
||||
/// @details 0 is leaf, 1 is lower internal, and 2 is upper internal level
|
||||
__hostdev__ uint64_t nodeCount(int level) const { return this->tree().nodeCount(level); }
|
||||
|
||||
__hostdev__ uint64_t leafCount() const { return this->tree().nodeCount(0); }
|
||||
__hostdev__ uint64_t lowerCount() const { return this->tree().nodeCount(1); }
|
||||
__hostdev__ uint64_t upperCount() const { return this->tree().nodeCount(2); }
|
||||
|
||||
/// @brief Return the i'th leaf node with respect to breadth-first ordering
|
||||
template <int LEVEL>
|
||||
__hostdev__ const NodeT<LEVEL>& node(uint32_t i) const {
|
||||
NANOVDB_ASSERT(i < this->nodeCount(LEVEL));
|
||||
const NodeT<LEVEL>* ptr = nullptr;
|
||||
if (DataT::mLinear) {
|
||||
ptr = util::PtrAdd<const NodeT<LEVEL>>(DataT::mGrid, DataT::mOff[LEVEL]) + i;
|
||||
} else {
|
||||
ptr = util::PtrAdd<const NodeT<LEVEL>>(DataT::mGrid, DataT::mPtr[LEVEL][i]);
|
||||
}
|
||||
NANOVDB_ASSERT(ptr && isAligned(ptr));
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
/// @brief Return the i'th node with respect to breadth-first ordering
|
||||
template <int LEVEL>
|
||||
__hostdev__ NodeT<LEVEL>& node(uint32_t i) {
|
||||
NANOVDB_ASSERT(i < this->nodeCount(LEVEL));
|
||||
NodeT<LEVEL>* ptr = nullptr;
|
||||
if (DataT::mLinear) {
|
||||
ptr = util::PtrAdd<NodeT<LEVEL>>(DataT::mGrid, DataT::mOff[LEVEL]) + i;
|
||||
} else {
|
||||
ptr = util::PtrAdd<NodeT<LEVEL>>(DataT::mGrid, DataT::mPtr[LEVEL][i]);
|
||||
}
|
||||
NANOVDB_ASSERT(ptr && isAligned(ptr));
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
/// @brief Return the i'th leaf node with respect to breadth-first ordering
|
||||
__hostdev__ const Node0& leaf(uint32_t i) const { return this->node<0>(i); }
|
||||
__hostdev__ Node0& leaf(uint32_t i) { return this->node<0>(i); }
|
||||
|
||||
/// @brief Return the i'th lower internal node with respect to breadth-first ordering
|
||||
__hostdev__ const Node1& lower(uint32_t i) const { return this->node<1>(i); }
|
||||
__hostdev__ Node1& lower(uint32_t i) { return this->node<1>(i); }
|
||||
|
||||
/// @brief Return the i'th upper internal node with respect to breadth-first ordering
|
||||
__hostdev__ const Node2& upper(uint32_t i) const { return this->node<2>(i); }
|
||||
__hostdev__ Node2& upper(uint32_t i) { return this->node<2>(i); }
|
||||
|
||||
}; // NodeManager<BuildT> class
|
||||
|
||||
template <typename BuildT, typename BufferT>
|
||||
NodeManagerHandle<BufferT> createNodeManager(const NanoGrid<BuildT> &grid,
|
||||
const BufferT& buffer)
|
||||
{
|
||||
NodeManagerHandle<BufferT> handle(toGridType<BuildT>(), BufferT::create(NodeManager<BuildT>::memUsage(grid), &buffer));
|
||||
auto *data = reinterpret_cast<NodeManagerData*>(handle.data());
|
||||
NANOVDB_ASSERT(data && isAligned(data));
|
||||
NANOVDB_ASSERT(toGridType<BuildT>() == grid.gridType());
|
||||
*data = NodeManagerData((void*)&grid);
|
||||
|
||||
if (NodeManager<BuildT>::isLinear(grid)) {
|
||||
data->mLinear = uint8_t(1u);
|
||||
data->mOff[0] = util::PtrDiff(grid.tree().template getFirstNode<0>(), &grid);
|
||||
data->mOff[1] = util::PtrDiff(grid.tree().template getFirstNode<1>(), &grid);
|
||||
data->mOff[2] = util::PtrDiff(grid.tree().template getFirstNode<2>(), &grid);
|
||||
} else {
|
||||
int64_t *ptr0 = data->mPtr[0] = reinterpret_cast<int64_t*>(data + 1);
|
||||
int64_t *ptr1 = data->mPtr[1] = data->mPtr[0] + grid.tree().nodeCount(0);
|
||||
int64_t *ptr2 = data->mPtr[2] = data->mPtr[1] + grid.tree().nodeCount(1);
|
||||
// Performs depth first traversal but breadth first insertion
|
||||
for (auto it2 = grid.tree().root().cbeginChild(); it2; ++it2) {
|
||||
*ptr2++ = util::PtrDiff(&*it2, &grid);
|
||||
for (auto it1 = it2->cbeginChild(); it1; ++it1) {
|
||||
*ptr1++ = util::PtrDiff(&*it1, &grid);
|
||||
for (auto it0 = it1->cbeginChild(); it0; ++it0) {
|
||||
*ptr0++ = util::PtrDiff(&*it0, &grid);
|
||||
}// loop over child nodes of the lower internal node
|
||||
}// loop over child nodes of the upper internal node
|
||||
}// loop over child nodes of the root node
|
||||
}
|
||||
|
||||
return handle;// // is converted to r-value so return value is move constructed!
|
||||
}// createNodeManager
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#if defined(__CUDACC__)
|
||||
#include <nanovdb/cuda/NodeManager.cuh>
|
||||
#endif// defined(__CUDACC__)
|
||||
|
||||
#endif // NANOVDB_NODEMANAGER_H_HAS_BEEN_INCLUDED
|
||||
+2502
-3590
File diff suppressed because it is too large
Load Diff
@@ -3,12 +3,13 @@
|
||||
# NanoVDB:
|
||||
A lightweight GPU friendly version of VDB initially targeting rendering applications.
|
||||
|
||||
* [Build instructions for make and cmake](../../doc/nanovdb/HowToBuild.md)
|
||||
* [Frequently asked questions](../../doc/nanovdb/FAQ.md)
|
||||
* [Source tree](../../doc/nanovdb/SourceTree.md)
|
||||
* [Examples](../../doc/nanovdb/HelloWorld.md)
|
||||
* [Build instructions for make and cmake](docs/HowToBuild.md)
|
||||
* [Frequently asked questions](docs/FAQ.md)
|
||||
* [Grid cells vs grid nodes](docs/GridCells_vs_GridNodes/Main.pdf)
|
||||
* [Source tree](docs/SourceTree.md)
|
||||
* [Examples](docs/HelloWorld.md)
|
||||
|
||||
### Copyright Contributors to the OpenVDB Project
|
||||
### SPDX-License-Identifier: Apache-2.0
|
||||
### SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
[](https://circleci.com/gh/NVIDIA-Omniverse/NanoVDB)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
project(NanoVDBExamples LANGUAGES CXX)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -32,17 +32,17 @@ if(NOT NANOVDB_USE_OPENVDB)
|
||||
else()
|
||||
add_executable(nanovdb_convert convert/nanovdb_convert.cc)
|
||||
target_link_libraries(nanovdb_convert PRIVATE nanovdb)
|
||||
install(TARGETS nanovdb_convert RUNTIME DESTINATION ${NANOVDB_INSTALL_BINDIR})
|
||||
install(TARGETS nanovdb_convert RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
endif()
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# nanovdb_print
|
||||
add_executable(nanovdb_print print/nanovdb_print.cc)
|
||||
target_link_libraries(nanovdb_print PRIVATE nanovdb)
|
||||
install(TARGETS nanovdb_print RUNTIME DESTINATION ${NANOVDB_INSTALL_BINDIR})
|
||||
install(TARGETS nanovdb_print RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# nanovdb_validate
|
||||
add_executable(nanovdb_validate validate/nanovdb_validate.cc)
|
||||
target_link_libraries(nanovdb_validate PRIVATE nanovdb)
|
||||
install(TARGETS nanovdb_validate RUNTIME DESTINATION ${NANOVDB_INSTALL_BINDIR})
|
||||
install(TARGETS nanovdb_validate RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb_convert.cc
|
||||
@@ -15,9 +15,9 @@
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
|
||||
#include <nanovdb/io/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/tools/CreateNanoGrid.h>
|
||||
#include <nanovdb/tools/NanoToOpenVDB.h>
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/util/OpenToNanoVDB.h>
|
||||
#include <nanovdb/util/NanoToOpenVDB.h>
|
||||
|
||||
void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAILURE)
|
||||
{
|
||||
@@ -35,8 +35,6 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
<< "--fp8\tQuantize float grids to 8 bits\n"
|
||||
<< "--fp16\tQuantize float grids to 16 bits\n"
|
||||
<< "--fpN\tQuantize float grids to variable bit depth (use -a or -r to specify a tolerance)\n"
|
||||
<< "--index\tProduce an IndexGrid where all float values are encoded as sidecar data\n"
|
||||
<< "--onIndex\tProduce an IndexGrid where active float values are encoded as sidecar data\n"
|
||||
<< "-g,--grid name\tConvert all grids matching the specified string name\n"
|
||||
<< "-h,--help\tPrints this message\n"
|
||||
<< "-r,--rel-error float\t Relative error tolerance used for variable bit depth quantization\n"
|
||||
@@ -49,9 +47,7 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
|
||||
void version [[noreturn]] (const char* progName, int exitStatus = EXIT_SUCCESS)
|
||||
{
|
||||
char str[8];
|
||||
nanovdb::toStr(str, nanovdb::Version());
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, str);
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, nanovdb::Version().c_str());
|
||||
exit(exitStatus);
|
||||
}
|
||||
|
||||
@@ -59,14 +55,14 @@ int main(int argc, char* argv[])
|
||||
{
|
||||
int exitStatus = EXIT_SUCCESS;
|
||||
|
||||
nanovdb::io::Codec codec = nanovdb::io::Codec::NONE;// compression codec for the file
|
||||
nanovdb::tools::StatsMode sMode = nanovdb::tools::StatsMode::Default;
|
||||
nanovdb::CheckMode cMode = nanovdb::CheckMode::Default;
|
||||
nanovdb::GridType qMode = nanovdb::GridType::Unknown;//specify the quantization mode
|
||||
bool verbose = false, overwrite = false, dither = false, absolute = true;
|
||||
float tolerance = -1.0f;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
nanovdb::io::Codec codec = nanovdb::io::Codec::NONE;// compression codec for the file
|
||||
nanovdb::StatsMode sMode = nanovdb::StatsMode::Default;
|
||||
nanovdb::ChecksumMode cMode = nanovdb::ChecksumMode::Default;
|
||||
nanovdb::GridType qMode = nanovdb::GridType::Unknown;//specify the quantization mode
|
||||
bool verbose = false, overwrite = false, dither = false, absolute = true;
|
||||
float tolerance = -1.0f;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
auto toLowerCase = [](std::string &str) {
|
||||
std::transform(str.begin(), str.end(), str.begin(),[](unsigned char c){return std::tolower(c);});
|
||||
};
|
||||
@@ -87,10 +83,6 @@ int main(int argc, char* argv[])
|
||||
qMode = nanovdb::GridType::Fp16;
|
||||
} else if (arg == "--fpN") {
|
||||
qMode = nanovdb::GridType::FpN;
|
||||
} else if (arg == "--index") {
|
||||
qMode = nanovdb::GridType::Index;
|
||||
} else if (arg == "--onIndex") {
|
||||
qMode = nanovdb::GridType::OnIndex;
|
||||
} else if (arg == "-h" || arg == "--help") {
|
||||
usage(argv[0], EXIT_SUCCESS);
|
||||
} else if (arg == "-b" || arg == "--blosc") {
|
||||
@@ -107,11 +99,11 @@ int main(int argc, char* argv[])
|
||||
std::string str(argv[++i]);
|
||||
toLowerCase(str);
|
||||
if (str == "none") {
|
||||
cMode = nanovdb::CheckMode::Disable;
|
||||
cMode = nanovdb::ChecksumMode::Disable;
|
||||
} else if (str == "partial") {
|
||||
cMode = nanovdb::CheckMode::Partial;
|
||||
cMode = nanovdb::ChecksumMode::Partial;
|
||||
} else if (str == "full") {
|
||||
cMode = nanovdb::CheckMode::Full;
|
||||
cMode = nanovdb::ChecksumMode::Full;
|
||||
} else {
|
||||
std::cerr << "Expected one of the following checksum modes: {none, partial, full}\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
@@ -125,13 +117,13 @@ int main(int argc, char* argv[])
|
||||
std::string str(argv[++i]);
|
||||
toLowerCase(str);
|
||||
if (str == "none") {
|
||||
sMode = nanovdb::tools::StatsMode::Disable;
|
||||
sMode = nanovdb::StatsMode::Disable;
|
||||
} else if (str == "bbox") {
|
||||
sMode = nanovdb::tools::StatsMode::BBox;
|
||||
sMode = nanovdb::StatsMode::BBox;
|
||||
} else if (str == "extrema") {
|
||||
sMode = nanovdb::tools::StatsMode::MinMax;
|
||||
sMode = nanovdb::StatsMode::MinMax;
|
||||
} else if (str == "all") {
|
||||
sMode = nanovdb::tools::StatsMode::All;
|
||||
sMode = nanovdb::StatsMode::All;
|
||||
} else {
|
||||
std::cerr << "Expected one of the following stats modes: {none, bbox, extrema, all}\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
@@ -144,7 +136,7 @@ int main(int argc, char* argv[])
|
||||
} else {
|
||||
qMode = nanovdb::GridType::FpN;
|
||||
absolute = true;
|
||||
tolerance = static_cast<float>(atof(argv[++i]));
|
||||
tolerance = atof(argv[++i]);
|
||||
}
|
||||
} else if (arg == "-r" || arg == "--rel-error") {
|
||||
if (i + 1 == argc) {
|
||||
@@ -153,7 +145,7 @@ int main(int argc, char* argv[])
|
||||
} else {
|
||||
qMode = nanovdb::GridType::FpN;
|
||||
absolute = false;
|
||||
tolerance = static_cast<float>(atof(argv[++i]));
|
||||
tolerance = atof(argv[++i]);
|
||||
}
|
||||
} else if (arg == "-g" || arg == "--grid") {
|
||||
if (i + 1 == argc) {
|
||||
@@ -175,22 +167,17 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "Expected at least one input file followed by exactly one output file\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
const std::string outputFile = fileNames.back();// last file is always the output file
|
||||
const std::string outputFile = fileNames.back();
|
||||
const std::string ext = outputFile.substr(outputFile.find_last_of(".") + 1);
|
||||
bool toNanoVDB = false;
|
||||
if (ext == "nvdb") {
|
||||
toNanoVDB = true;
|
||||
} else if (ext == "vdb") {
|
||||
if (qMode != nanovdb::GridType::Unknown) {
|
||||
std::cerr << "The options are incompatible an output of type OpenVDB" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
} else {
|
||||
} else if (ext != "vdb") {
|
||||
std::cerr << "Unrecognized file extension: \"" << ext << "\"\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
fileNames.pop_back();// remove the output file name
|
||||
fileNames.pop_back();
|
||||
|
||||
if (!overwrite) {
|
||||
std::ifstream is(outputFile, std::ios::in | std::ios::binary);
|
||||
@@ -214,38 +201,41 @@ int main(int argc, char* argv[])
|
||||
|
||||
auto openToNano = [&](const openvdb::GridBase::Ptr& base)
|
||||
{
|
||||
const bool includeStats = false, includeTiles = false;
|
||||
const int verb = verbose ? 1 : 0;
|
||||
if (qMode == nanovdb::GridType::OnIndex) {
|
||||
return nanovdb::tools::openToIndexVDB<nanovdb::ValueOnIndex>(base, 1u, includeStats, includeTiles, verb);
|
||||
} else if (qMode == nanovdb::GridType::Index) {
|
||||
return nanovdb::tools::openToIndexVDB<nanovdb::ValueIndex>(base, 1u, includeStats, includeTiles, verb);
|
||||
}
|
||||
|
||||
if (auto floatGrid = openvdb::GridBase::grid<openvdb::FloatGrid>(base)) {
|
||||
nanovdb::tools::CreateNanoGrid<openvdb::FloatGrid> s(*floatGrid);
|
||||
s.setStats(sMode);
|
||||
s.setChecksum(cMode);
|
||||
s.enableDithering(dither);
|
||||
s.setVerbose(verbose ? 1 : 0);
|
||||
switch (qMode) {
|
||||
case nanovdb::GridType::Fp4:
|
||||
return s.getHandle<nanovdb::Fp4>();
|
||||
case nanovdb::GridType::Fp8:
|
||||
return s.getHandle<nanovdb::Fp8>();
|
||||
case nanovdb::GridType::Fp16:
|
||||
return s.getHandle<nanovdb::Fp16>();
|
||||
case nanovdb::GridType::FpN:
|
||||
case nanovdb::GridType::Fp4: {
|
||||
nanovdb::OpenToNanoVDB<float, nanovdb::Fp4> s;
|
||||
s.enableDithering(dither);
|
||||
return s(*floatGrid, sMode, cMode, verbose ? 1 : 0);
|
||||
}
|
||||
case nanovdb::GridType::Fp8: {
|
||||
nanovdb::OpenToNanoVDB<float, nanovdb::Fp8> s;
|
||||
s.enableDithering(dither);
|
||||
return s(*floatGrid, sMode, cMode, verbose ? 1 : 0);
|
||||
}
|
||||
case nanovdb::GridType::Fp16: {
|
||||
nanovdb::OpenToNanoVDB<float, nanovdb::Fp16> s;
|
||||
s.enableDithering(dither);
|
||||
return s(*floatGrid, sMode, cMode, verbose ? 1 : 0);
|
||||
}
|
||||
case nanovdb::GridType::FpN: {
|
||||
if (absolute) {
|
||||
return s.getHandle<nanovdb::FpN>(nanovdb::tools::AbsDiff(tolerance));
|
||||
nanovdb::OpenToNanoVDB<float, nanovdb::FpN, nanovdb::AbsDiff> s;
|
||||
s.enableDithering(dither);
|
||||
s.oracle() = nanovdb::AbsDiff(tolerance);
|
||||
return s(*floatGrid, sMode, cMode, verbose ? 1 : 0);
|
||||
} else {
|
||||
return s.getHandle<nanovdb::FpN>(nanovdb::tools::RelDiff(tolerance));
|
||||
nanovdb::OpenToNanoVDB<float, nanovdb::FpN, nanovdb::RelDiff> s;
|
||||
s.enableDithering(dither);
|
||||
s.oracle() = nanovdb::RelDiff(tolerance);
|
||||
return s(*floatGrid, sMode, cMode, verbose ? 1 : 0);
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}// end of switch
|
||||
}
|
||||
return nanovdb::tools::openToNanoVDB(base, sMode, cMode, verb);
|
||||
return nanovdb::openToNanoVDB(base, sMode, cMode, verbose ? 1 : 0);
|
||||
};
|
||||
try {
|
||||
if (toNanoVDB) { // OpenVDB -> NanoVDB
|
||||
@@ -255,21 +245,24 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "Since the last file has extension .nvdb the remaining input files were expected to have extensions .vdb\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose) std::cout << "Opening OpenVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
if (verbose)
|
||||
std::cout << "Opening OpenVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
openvdb::io::File file(inputFile);
|
||||
file.open(false); //disable delayed loading
|
||||
if (gridName.empty()) {// convert all grid in the file
|
||||
auto grids = file.getGrids();
|
||||
std::vector<nanovdb::GridHandle<nanovdb::HostBuffer> > handles;
|
||||
for (auto& grid : *grids) {
|
||||
if (verbose) std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
handles.push_back(openToNano(grid));
|
||||
if (verbose) {
|
||||
std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
}
|
||||
auto handle = openToNano(grid);
|
||||
nanovdb::io::writeGrid(os, handle, codec);
|
||||
} // loop over OpenVDB grids in file
|
||||
auto handle = nanovdb::mergeGrids<nanovdb::HostBuffer, std::vector>(handles);
|
||||
nanovdb::io::writeGrid(os, handle, codec);
|
||||
} else {// convert only grid with matching name
|
||||
auto grid = file.readGrid(gridName);
|
||||
if (verbose) std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
if (verbose) {
|
||||
std::cout << "Converting OpenVDB grid named \"" << grid->getName() << "\" to NanoVDB" << std::endl;
|
||||
}
|
||||
auto handle = openToNano(grid);
|
||||
nanovdb::io::writeGrid(os, handle, codec);
|
||||
}
|
||||
@@ -282,14 +275,14 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "Since the last file has extension .vdb the remaining input files were expected to have extensions .nvdb\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose) std::cout << "Opening NanoVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
if (verbose)
|
||||
std::cout << "Opening NanoVDB file named \"" << inputFile << "\"" << std::endl;
|
||||
if (gridName.empty()) {
|
||||
auto handles = nanovdb::io::readGrids(inputFile, verbose);
|
||||
for (auto &h : handles) {
|
||||
for (uint32_t i = 0; i < h.gridCount(); ++i) {
|
||||
if (verbose) std::cout << "Converting NanoVDB grid named \"" << h.gridMetaData(i)->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanovdb::tools::nanoToOpenVDB(h, i));
|
||||
}
|
||||
if (verbose)
|
||||
std::cout << "Converting NanoVDB grid named \"" << h.gridMetaData()->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanoToOpenVDB(h));
|
||||
}
|
||||
} else {
|
||||
auto handle = nanovdb::io::readGrid(inputFile, gridName);
|
||||
@@ -297,8 +290,9 @@ int main(int argc, char* argv[])
|
||||
std::cerr << "File did not contain a NanoVDB grid named \"" << gridName << "\"\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose) std::cout << "Converting NanoVDB grid named \"" << handle.gridMetaData()->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanovdb::tools::nanoToOpenVDB(handle));
|
||||
if (verbose)
|
||||
std::cout << "Converting NanoVDB grid named \"" << handle.gridMetaData()->shortGridName() << "\" to OpenVDB" << std::endl;
|
||||
grids->push_back(nanoToOpenVDB(handle));
|
||||
}
|
||||
} // loop over input files
|
||||
file.write(*grids);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb_print.cc
|
||||
@@ -11,7 +11,7 @@
|
||||
\brief Command-line tool that prints information about grids in a nanovdb file
|
||||
*/
|
||||
|
||||
#include <nanovdb/io/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
@@ -31,9 +31,7 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
|
||||
void version [[noreturn]] (const char* progName, int exitStatus = EXIT_SUCCESS)
|
||||
{
|
||||
char str[8];
|
||||
nanovdb::toStr(str, nanovdb::Version());
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, str);
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, nanovdb::Version().c_str());
|
||||
exit(exitStatus);
|
||||
}
|
||||
|
||||
@@ -44,7 +42,6 @@ int main(int argc, char* argv[])
|
||||
enum Mode : int { Short = 0,
|
||||
Default = 1,
|
||||
Long = 2 } mode = Default;
|
||||
char str[32];
|
||||
bool verbose = false;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
@@ -106,13 +103,13 @@ int main(int argc, char* argv[])
|
||||
if (size > n)
|
||||
n = size;
|
||||
};
|
||||
auto Vec3dToStr = [](const nanovdb::Vec3d& v) {
|
||||
auto vec3RToStr = [](const nanovdb::Vec3R& v) {
|
||||
std::stringstream ss;
|
||||
ss << std::setprecision(3);
|
||||
ss << "(" << v[0] << "," << v[1] << "," << v[2] << ")";
|
||||
return ss.str();
|
||||
};
|
||||
auto wbboxToStr = [](const nanovdb::math::BBox<nanovdb::Vec3d>& bbox) {
|
||||
auto wbboxToStr = [](const nanovdb::BBox<nanovdb::Vec3d>& bbox) {
|
||||
std::stringstream ss;
|
||||
if (bbox.empty()) {
|
||||
ss << "empty grid";
|
||||
@@ -151,7 +148,7 @@ int main(int argc, char* argv[])
|
||||
for (auto& file : fileNames) {
|
||||
auto list = nanovdb::io::readGridMetaData(file);
|
||||
if (!gridName.empty()) {
|
||||
std::vector<nanovdb::io::FileGridMetaData> tmp;
|
||||
std::vector<nanovdb::io::GridMetaData> tmp;
|
||||
for (auto& m : list) {
|
||||
if (nameKey == m.nameKey && gridName == m.gridName)
|
||||
tmp.emplace_back(m);
|
||||
@@ -166,7 +163,7 @@ int main(int argc, char* argv[])
|
||||
auto classWidth = std::string("Class").length() + padding;
|
||||
auto codecWidth = std::string("Codec").length() + padding;
|
||||
auto ibboxWidth = std::string("Index Bounding Box").length() + padding;
|
||||
auto wbboxWidth = std::string("World Bounding Box").length() + padding;
|
||||
auto wbboxWidth = std::string("World BBox").length() + padding;
|
||||
auto sizeWidth = std::string("Size").length() + padding;
|
||||
auto fileWidth = std::string("File").length() + padding;
|
||||
auto voxelsWidth = std::string("# Voxels").length() + padding;
|
||||
@@ -175,23 +172,21 @@ int main(int argc, char* argv[])
|
||||
auto configWidth = std::string("32^3->16^3->8^3").length() + padding;
|
||||
auto tileWidth = std::string("# Active tiles").length() + padding;
|
||||
auto resWidth = std::string("Resolution").length() + padding;
|
||||
auto blindWidth = std::string("Blind data count").length() + padding;
|
||||
for (auto& m : list) {
|
||||
width(nameWidth, m.gridName);
|
||||
width(typeWidth, nanovdb::toStr(str, m.gridType));
|
||||
width(classWidth, nanovdb::toStr(str, m.gridClass));
|
||||
width(codecWidth, nanovdb::io::toStr(str, m.codec));
|
||||
width(typeWidth, nanovdb::toStr(m.gridType));
|
||||
width(classWidth, nanovdb::toStr(m.gridClass));
|
||||
width(codecWidth, nanovdb::io::toStr(m.codec));
|
||||
width(wbboxWidth, wbboxToStr(m.worldBBox));
|
||||
width(ibboxWidth, ibboxToStr(m.indexBBox));
|
||||
width(resWidth, resToStr(m.indexBBox));
|
||||
width(sizeWidth, format(m.gridSize));
|
||||
width(fileWidth, format(m.fileSize));
|
||||
width(versionWidth, nanovdb::toStr(str, m.version));
|
||||
width(versionWidth, std::string(m.version.c_str()));
|
||||
width(configWidth, nodesToStr(m.nodeCount));
|
||||
width(tileWidth, nodesToStr(m.tileCount));
|
||||
width(voxelsWidth, std::to_string(m.voxelCount));
|
||||
width(voxelSizeWidth, Vec3dToStr(m.voxelSize));
|
||||
width(blindWidth, std::to_string(m.blindDataCount));
|
||||
width(voxelSizeWidth, vec3RToStr(m.voxelSize));
|
||||
}
|
||||
std::cout << "\nThe file \"" << file << "\" contains the following ";
|
||||
if (list.size()>1) {
|
||||
@@ -216,8 +211,7 @@ int main(int argc, char* argv[])
|
||||
std::cout << std::left << std::setw(configWidth) << "32^3->16^3->8^3"
|
||||
<< std::left << std::setw(tileWidth) << "# Active tiles"
|
||||
<< std::left << std::setw(ibboxWidth) << "Index Bounding Box"
|
||||
<< std::left << std::setw(wbboxWidth) << "World Bounding Box"
|
||||
<< std::left << std::setw(blindWidth) << "Blind data count";
|
||||
<< std::left << std::setw(wbboxWidth) << "World Bounding Box";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
int n = 0;
|
||||
@@ -226,14 +220,14 @@ int main(int argc, char* argv[])
|
||||
continue;
|
||||
std::cout << std::left << std::setw(numberWidth) << ++n
|
||||
<< std::left << std::setw(nameWidth) << m.gridName
|
||||
<< std::left << std::setw(typeWidth) << nanovdb::toStr(str, m.gridType);
|
||||
<< std::left << std::setw(typeWidth) << nanovdb::toStr(m.gridType);
|
||||
if (mode != Short) {
|
||||
std::cout << std::left << std::setw(classWidth) << nanovdb::toStr(str, m.gridClass)
|
||||
<< std::left << std::setw(versionWidth) << nanovdb::toStr(str+10, m.version)
|
||||
<< std::left << std::setw(codecWidth) << nanovdb::io::toStr(str + 20, m.codec)
|
||||
std::cout << std::left << std::setw(classWidth) << nanovdb::toStr(m.gridClass)
|
||||
<< std::left << std::setw(versionWidth) << std::string(m.version.c_str())
|
||||
<< std::left << std::setw(codecWidth) << nanovdb::io::toStr(m.codec)
|
||||
<< std::left << std::setw(sizeWidth) << format(m.gridSize)
|
||||
<< std::left << std::setw(fileWidth) << format(m.fileSize)
|
||||
<< std::left << std::setw(voxelSizeWidth) << Vec3dToStr(m.voxelSize);
|
||||
<< std::left << std::setw(voxelSizeWidth) << vec3RToStr(m.voxelSize);
|
||||
}
|
||||
std::cout << std::left << std::setw(voxelsWidth) << m.voxelCount
|
||||
<< std::left << std::setw(resWidth) << resToStr(m.indexBBox);
|
||||
@@ -241,12 +235,11 @@ int main(int argc, char* argv[])
|
||||
std::cout << std::left << std::setw(configWidth) << nodesToStr(m.nodeCount)
|
||||
<< std::left << std::setw(tileWidth) << nodesToStr(m.tileCount)
|
||||
<< std::left << std::setw(ibboxWidth) << ibboxToStr(m.indexBBox)
|
||||
<< std::left << std::setw(wbboxWidth) << wbboxToStr(m.worldBBox)
|
||||
<< std::left << std::setw(blindWidth) << m.blindDataCount;
|
||||
<< std::left << std::setw(wbboxWidth) << wbboxToStr(m.worldBBox);
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}// loop over FileGridMetaData in list from a single file
|
||||
}// loop over files
|
||||
}
|
||||
}
|
||||
if (verbose) {
|
||||
size_t w = 0;
|
||||
switch (mode) {
|
||||
@@ -323,9 +316,9 @@ int main(int argc, char* argv[])
|
||||
exitStatus = EXIT_FAILURE;
|
||||
}
|
||||
catch (...) {
|
||||
std::cerr << "Exception of unexpected type caught" << std::endl;
|
||||
std::cerr << "Exception oof unexpected type caught" << std::endl;
|
||||
exitStatus = EXIT_FAILURE;
|
||||
}
|
||||
|
||||
return exitStatus;
|
||||
}// main
|
||||
}
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
import argparse
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def open_file(file_path):
|
||||
"""
|
||||
Opens a file. If utf-8 decoding fails, try windows-1252.
|
||||
|
||||
Args:
|
||||
file_path: Path of the file to open.
|
||||
|
||||
Returns:
|
||||
The content of the file in an arbitrary format.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "r", encoding="utf-8", errors="replace") as file:
|
||||
return file.read()
|
||||
except UnicodeDecodeError:
|
||||
with open(file_path, "r", encoding="windows-1252", errors="replace") as file:
|
||||
return file.read()
|
||||
|
||||
|
||||
def write_file(file_path, content):
|
||||
"""
|
||||
Writes a file. If utf-8 decoding fails, try windows-1252.
|
||||
|
||||
Args:
|
||||
file_path: Path of the file to open.
|
||||
|
||||
Returns:
|
||||
None.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "w", encoding="utf-8", errors="replace") as file:
|
||||
file.write(content)
|
||||
except UnicodeDecodeError:
|
||||
with open(file_path, "w", encoding="windows-1252", errors="replace") as file:
|
||||
file.write(content)
|
||||
|
||||
|
||||
def update_files(dir_path):
|
||||
"""
|
||||
Updates the content of files ending in .h, .cuh, .cc, .cu, and .cpp
|
||||
to call the appropriate API as we update NanoVDB from version 32.6 to
|
||||
version 32.7. This includes changes in namespaces, function names, and
|
||||
include directories.
|
||||
|
||||
Args:
|
||||
Directory path: will include files in downstream directories.
|
||||
|
||||
Returns:
|
||||
None. Writes the contents of the file.
|
||||
"""
|
||||
|
||||
# List of file extensions to search for
|
||||
file_extensions = [".h", ".cuh", ".cc", ".cu", ".cpp"]
|
||||
|
||||
nspace_dic = {
|
||||
"math": [
|
||||
"Ray",
|
||||
"DDA<",
|
||||
"HDDA",
|
||||
"Vec3<",
|
||||
"Vec4<",
|
||||
"BBox<",
|
||||
"ZeroCrossing",
|
||||
"TreeMarcher",
|
||||
"PointTreeMarcher",
|
||||
"BoxStencil<",
|
||||
"CurvatureStencil<",
|
||||
"GradStencil<",
|
||||
"WenoStencil<",
|
||||
"AlignUp",
|
||||
"Min",
|
||||
"Max",
|
||||
"Abs",
|
||||
"Clamp",
|
||||
"Sqrt",
|
||||
"Sign",
|
||||
"Maximum<",
|
||||
"Delta<",
|
||||
"RoundDown<",
|
||||
"pi<",
|
||||
"isApproxZero<",
|
||||
"Round<",
|
||||
"createSampler",
|
||||
"SampleFromVoxels<",
|
||||
],
|
||||
"tools": [
|
||||
"createNanoGrid",
|
||||
"StatsMode",
|
||||
"createLevelSetSphere",
|
||||
"createFogVolumeSphere",
|
||||
"createFogVolumeSphere createFogVolumeSphere",
|
||||
"createFogVolumeTorus",
|
||||
"createLevelSetBox",
|
||||
"CreateNanoGrid",
|
||||
"updateGridStats",
|
||||
"evalChecksum",
|
||||
"validateChecksum",
|
||||
"checkGrid",
|
||||
"Extrema",
|
||||
],
|
||||
"util": [
|
||||
"is_floating_point",
|
||||
"findLowestOn",
|
||||
"findHighestOn",
|
||||
"Range",
|
||||
"streq",
|
||||
"strcpy",
|
||||
"strcat",
|
||||
"empty(",
|
||||
"Split",
|
||||
"invoke",
|
||||
"forEach",
|
||||
"reduce",
|
||||
"prefixSum",
|
||||
"is_same",
|
||||
"is_specialization",
|
||||
"PtrAdd",
|
||||
"PtrDiff",
|
||||
],
|
||||
}
|
||||
|
||||
rename_dic = {
|
||||
# list from func4 in updateFiles.sh
|
||||
"nanovdb::build::": "nanovdb::tools::build::",
|
||||
"nanovdb::BBoxR": "nanovdb::Vec3dBBox",
|
||||
"nanovdb::BBox<nanovdb::Vec3d>": "nanovdb::Vec3dBbox",
|
||||
# scope and rename, i.e. list from func2 in updateFiles.sh
|
||||
"nanovdb::cudaCreateNodeManager": "nanovdb::cuda::createNodeManager",
|
||||
"nanovdb::cudaVoxelsToGrid": "nanovdb::cuda::voxelsToGrid",
|
||||
"nanovdb::cudaPointsToGrid": "nanovdb::cuda::pointsToGrid",
|
||||
"nanovdb::DitherLUT": "nanovdb::math::DitherLUT",
|
||||
"nanovdb::PackedRGBA8": "nanovdb::math::Rgba8",
|
||||
"nanovdb::Rgba8": "nanovdb::math::Rgba8",
|
||||
"nanovdb::CpuTimer": "nanovdb::util::Timer",
|
||||
"nanovdb::GpuTimer": "nanovdb::util::cuda::Timer",
|
||||
"nanovdb::CountOn": "nanovdb::util::countOn",
|
||||
}
|
||||
|
||||
movdir_dic = {
|
||||
# list comes from func3 calls on updateFiles.sh
|
||||
"util/GridHandle.h": "GridHandle.h",
|
||||
"util/BuildGrid.h": "tools/GridBuilder.h",
|
||||
"util/GridBuilder.h": "tools/GridBuilder.h",
|
||||
"util/IO.h": "io/IO.h",
|
||||
"util/CSampleFromVoxels.h": "math/CSampleFromVoxels.h",
|
||||
"util/DitherLUT.h": "math/DitherLUT.h",
|
||||
"util/HDDA.h": "math/HDDA.h",
|
||||
"util/Ray.h": "math/Ray.h",
|
||||
"util/SampleFromVoxels.h": "math/SampleFromVoxels.h",
|
||||
"util/Stencils.h": "nanovdb/math/Stencils.h",
|
||||
"util/CreateNanoGrid.h": "tools/CreateNanoGrid.h",
|
||||
"util/Primitives.h": "tools/CreatePrimitives.h",
|
||||
"util/GridChecksum.h": "tools/GridChecksum.h",
|
||||
"util/GridStats.h": "tools/GridStats.h",
|
||||
"util/GridChecksum.h": "tools/GridChecksum.h",
|
||||
"util/GridValidator.h": "tools/GridValidator.h",
|
||||
"util/NanoToOpenVDB.h": "tools/NanoToOpenVDB.h",
|
||||
"util/cuda/CudaGridChecksum.cuh": "tools/cuda/CudaGridChecksum.cuh",
|
||||
"util/cuda/CudaGridStats.cuh": "tools/cuda/CudaGridStats.cuh",
|
||||
"util/cuda/CudaGridValidator.cuh": "tools/cuda/CudaGridValidator.cuh",
|
||||
"util/cuda/CudaIndexToGrid.cuh": "tools/cuda/CudaIndexToGrid.cuh",
|
||||
"util/cuda/CudaPointsToGrid.cuh": "tools/cuda/PointsToGrid.cuh",
|
||||
"util/cuda/CudaSignedFloodFill.cuh": "tools/cuda/CudaSignedFloodFill.cuh",
|
||||
"util/cuda/CudaDeviceBuffer.h": "cuda/DeviceBuffer.h",
|
||||
"util/cuda/CudaGridHandle.cuh": "cuda/GridHandle.cuh",
|
||||
"util/cuda/CudaUtils.h": "util/cuda/Util.h",
|
||||
"util/cuda/GpuTimer.h": "util/cuda/Timer.h",
|
||||
}
|
||||
|
||||
# Iterate over files in the directory and its subdirectories
|
||||
for root, dirs, files in os.walk(dir_path):
|
||||
for file in files:
|
||||
if any(file.endswith(ext) for ext in file_extensions):
|
||||
file_path = os.path.join(root, file)
|
||||
print(f"Processing file: {file_path}")
|
||||
|
||||
content = open_file(file_path)
|
||||
|
||||
# Correspond to func1 $file in updateFiles.sh
|
||||
for key, vals in nspace_dic.items():
|
||||
for val in vals:
|
||||
old_word = "nanovdb::" + val
|
||||
new_word = "nanovdb::" + key + "::" + val
|
||||
content = content.replace(old_word, new_word)
|
||||
|
||||
# Correspond to func4 and func2 in updateFiles.sh
|
||||
for key, val in rename_dic.items():
|
||||
content = content.replace(key, val)
|
||||
|
||||
# Correspond to func3 in updateFiles.sh
|
||||
for key, val in movdir_dic.items():
|
||||
old_path = "<nanovdb/" + key + ">"
|
||||
new_path = "<nanovdb/" + val + ">"
|
||||
content = content.replace(old_path, new_path)
|
||||
|
||||
write_file(file_path, content)
|
||||
|
||||
# Example use:
|
||||
# To update all the files using NanoVDB in the current directory (and directories downstream):
|
||||
# python ./nanovdb/nanovdb/cmd/updateFiles.py
|
||||
# To update all the files using NanoVDB in a directory called foo (and directories downstream):
|
||||
# python ./nanovdb/nanovdb/cmd/updateFiles.py -d /path/to/foo
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Synthetic Data Generation for USD")
|
||||
parser.add_argument(
|
||||
"-d",
|
||||
"--directory",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Path to directory containing .h, .cc, and .cu files using NanoVDB.",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
dir_path = os.getcwd() if args.directory is None else Path(args.directory).resolve()
|
||||
|
||||
update_files(dir_path)
|
||||
@@ -1,101 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#Usage process all files in this directory or optionally specify a target directory
|
||||
|
||||
# Define directory in which to find files
|
||||
dir="."
|
||||
if [ "$1" ]; then
|
||||
dir="$1"
|
||||
fi
|
||||
|
||||
# Check if dir is not a directory
|
||||
if [ ! -d "$dir" ]; then
|
||||
echo -e "\nUsage: '$0 <directory>'\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# E.g.: func1 $file "math" "Coord" "Vec3" "Vec4"
|
||||
func1 () {
|
||||
for ((i=3; i<=$#; i++)); do
|
||||
arg="s/nanovdb::${!i}/nanovdb::$2::${!i}/g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
done
|
||||
}
|
||||
|
||||
# E.G.: func2 file namespace old new : nanovdb::old -> nanovdb::namespace::new in file
|
||||
func2 () {
|
||||
arg="s/nanovdb::$3/nanovdb::$2::$4/g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
}
|
||||
|
||||
# E.G.: func3 file path1/old.h path2/new.h <nanovdb/path1/old.h> -> <nanovdb/path2/new.h> in file
|
||||
func3 () {
|
||||
arg="s;<nanovdb/$2>;<nanovdb/$3>;g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
}
|
||||
|
||||
# E.g.: func4 file old new new -> old
|
||||
func4 () {
|
||||
arg="s;$2;$3;g"
|
||||
#echo "sed -i $arg $1"
|
||||
sed -i $arg $1
|
||||
}
|
||||
|
||||
# Loop through files in the target directory
|
||||
for file in $(find "$dir" -name '*.h' -or -name '*.cuh' -or -name '*.cc' -or -name '*.cu' -or -name '*.cpp'); do
|
||||
if [ -f "$file" ]; then
|
||||
echo "Processing file: $file"
|
||||
func1 $file math Ray "DDA<" HDDA "Vec3<" "Vec4<" "BBox<" ZeroCrossing TreeMarcher PointTreeMarcher\
|
||||
"BoxStencil<" "CurvatureStencil<" "GradStencil<" "WenoStencil<" AlignUp Min Max Abs Clamp\
|
||||
Sqrt Sign "Maximum<" "Delta<" "RoundDown<" "pi<" "isApproxZero<" "Round<" createSampler "SampleFromVoxels<"
|
||||
func1 $file tools createNanoGrid StatsMode createLevelSetSphere\
|
||||
createFogVolumeSphere createFogVolumeSphere createFogVolumeSphere\
|
||||
createFogVolumeTorus createLevelSetBox CreateNanoGrid updateGridStats\
|
||||
evalChecksum validateChecksum checkGrid Extrema
|
||||
func1 $file util is_floating_point findLowestOn findHighestOn Range streq strcpy strcat "empty("\
|
||||
Split invoke forEach reduce prefixSum is_same is_specialization PtrAdd PtrDiff
|
||||
func4 $file "nanovdb::build::" "nanovdb::tools::build::"
|
||||
func4 $file "nanovdb::BBoxR" "nanovdb::Vec3dBBox"
|
||||
func4 $file "nanovdb::BBox<nanovdb::Vec3d>" "nanovdb::Vec3dBbox"
|
||||
func2 $file cuda cudaCreateNodeManager createNodeManager
|
||||
func2 $file cuda cudaVoxelsToGrid voxelsToGrid
|
||||
func2 $file cuda cudaPointsToGrid pointsToGrid
|
||||
func2 $file math DitherLUT DitherLUT
|
||||
func2 $file math PackedRGBA8 Rgba8
|
||||
func2 $file math Rgba8 Rgba8
|
||||
func2 $file util CpuTimer Timer
|
||||
func2 $file util GpuTimer "cuda::Timer"
|
||||
func2 $file util CountOn countOn
|
||||
func3 $file "util/GridHandle.h" "GridHandle.h"
|
||||
func3 $file "util/BuildGrid.h" "tools/GridBuilder.h"
|
||||
func3 $file "util/GridBuilder.h" "tools/GridBuilder.h"
|
||||
func3 $file "util/IO.h" "io/IO.h"
|
||||
func3 $file "util/CSampleFromVoxels.h" "math/CSampleFromVoxels.h"
|
||||
func3 $file "util/DitherLUT.h" "math/DitherLUT.h"
|
||||
func3 $file "util/HDDA.h" "math/HDDA.h"
|
||||
func3 $file "util/Ray.h" "math/Ray.h"
|
||||
func3 $file "util/SampleFromVoxels.h" "math/SampleFromVoxels.h"
|
||||
func3 $file "util/Stencils.h" "nanovdb/math/Stencils.h"
|
||||
func3 $file "util/CreateNanoGrid.h" "tools/CreateNanoGrid.h"
|
||||
func3 $file "util/Primitives.h" "tools/CreatePrimitives.h"
|
||||
func3 $file "util/GridChecksum.h" "tools/GridChecksum.h"
|
||||
func3 $file "util/GridStats.h" "tools/GridStats.h"
|
||||
func3 $file "util/GridChecksum.h" "tools/GridChecksum.h"
|
||||
func3 $file "util/GridValidator.h" "tools/GridValidator.h"
|
||||
func3 $file "util/NanoToOpenVDB.h" "tools/NanoToOpenVDB.h"
|
||||
func3 $file "util/cuda/CudaGridChecksum.cuh" "tools/cuda/CudaGridChecksum.cuh"
|
||||
func3 $file "util/cuda/CudaGridStats.cuh" "tools/cuda/CudaGridStats.cuh"
|
||||
func3 $file "util/cuda/CudaGridValidator.cuh" "tools/cuda/CudaGridValidator.cuh"
|
||||
func3 $file "util/cuda/CudaIndexToGrid.cuh" "tools/cuda/CudaIndexToGrid.cuh"
|
||||
func3 $file "util/cuda/CudaPointsToGrid.cuh" "tools/cuda/PointsToGrid.cuh"
|
||||
func3 $file "util/cuda/CudaSignedFloodFill.cuh" "tools/cuda/CudaSignedFloodFill.cuh"
|
||||
func3 $file "util/cuda/CudaDeviceBuffer.h" "cuda/DeviceBuffer.h"
|
||||
func3 $file "util/cuda/CudaGridHandle.cuh" "cuda/GridHandle.cuh"
|
||||
func3 $file "util/cuda/CudaUtils.h" "util/cuda/Util.h"
|
||||
func3 $file "util/cuda/GpuTimer.h" "util/cuda/Timer.h"
|
||||
fi
|
||||
done
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb_validate.cc
|
||||
@@ -11,8 +11,8 @@
|
||||
\brief Command-line tool that validates Grids in nanovdb files
|
||||
*/
|
||||
|
||||
#include <nanovdb/io/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/tools/GridValidator.h>
|
||||
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
|
||||
#include <nanovdb/util/GridValidator.h>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
@@ -23,7 +23,6 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
<< "Options:\n"
|
||||
<< "-g,--grid name\tOnly validate grids matching the specified string name\n"
|
||||
<< "-h,--help\tPrints this message\n"
|
||||
<< "-p,--partial\tPerform partial (i.e. fast) validation tests\n"
|
||||
<< "-v,--verbose\tPrint verbose information information useful for debugging\n"
|
||||
<< "--version\tPrint version information to the terminal\n";
|
||||
exit(exitStatus);
|
||||
@@ -31,18 +30,17 @@ void usage [[noreturn]] (const std::string& progName, int exitStatus = EXIT_FAIL
|
||||
|
||||
void version [[noreturn]] (const char* progName, int exitStatus = EXIT_SUCCESS)
|
||||
{
|
||||
char str[8];
|
||||
nanovdb::toStr(str, nanovdb::Version());
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, str);
|
||||
printf("\n%s was build against NanoVDB version %s\n", progName, nanovdb::Version().c_str());
|
||||
exit(exitStatus);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int exitStatus = EXIT_SUCCESS;
|
||||
bool verbose = false;
|
||||
nanovdb::CheckMode mode = nanovdb::CheckMode::Full;
|
||||
std::string gridName;
|
||||
int exitStatus = EXIT_SUCCESS;
|
||||
|
||||
bool verbose = false;
|
||||
bool detailed = true;
|
||||
std::string gridName;
|
||||
std::vector<std::string> fileNames;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
std::string arg = argv[i];
|
||||
@@ -53,8 +51,6 @@ int main(int argc, char* argv[])
|
||||
version(argv[0]);
|
||||
} else if (arg == "-v" || arg == "--verbose") {
|
||||
verbose = true;
|
||||
} else if (arg == "-p" || arg == "--partial") {
|
||||
mode = nanovdb::CheckMode::Partial;
|
||||
} else if (arg == "-g" || arg == "--grid") {
|
||||
if (i + 1 == argc) {
|
||||
std::cerr << "\nExpected a grid name to follow the -g,--grid option\n";
|
||||
@@ -81,19 +77,64 @@ int main(int argc, char* argv[])
|
||||
for (auto& file : fileNames) {
|
||||
auto list = nanovdb::io::readGridMetaData(file);
|
||||
if (!gridName.empty()) {
|
||||
std::vector<nanovdb::io::FileGridMetaData> tmp;
|
||||
std::vector<nanovdb::io::GridMetaData> tmp;
|
||||
for (auto& m : list) {
|
||||
if (nameKey == m.nameKey && gridName == m.gridName) tmp.emplace_back(m);
|
||||
if (nameKey == m.nameKey && gridName == m.gridName)
|
||||
tmp.emplace_back(m);
|
||||
}
|
||||
list = std::move(tmp);
|
||||
list = tmp;
|
||||
}
|
||||
if (list.size() == 0) {
|
||||
continue;
|
||||
}
|
||||
if (list.size() == 0) continue;
|
||||
|
||||
if (verbose) std::cout << "\nThe file \"" << file << "\" contains the following matching " << list.size() << " grid(s):\n";
|
||||
if (verbose) {
|
||||
std::cout << "\nThe file \"" << file << "\" contains the following matching " << list.size() << " grid(s):\n";
|
||||
}
|
||||
|
||||
for (auto& m : list) {
|
||||
auto handle = nanovdb::io::readGrid(file, m.gridName);
|
||||
const bool test = nanovdb::tools::validateGrids(handle, mode, verbose);
|
||||
auto gridType = handle.gridType();
|
||||
bool test = false;
|
||||
if (gridType == nanovdb::GridType::End) {
|
||||
std::cerr << "GridHandle was empty\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
} else if (auto* grid = handle.grid<float>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Vec3f>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<uint32_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int32_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int16_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int64_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<int16_t>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<double>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Vec3d>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::ValueMask>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Rgba8>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Fp4>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Fp8>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::Fp16>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<nanovdb::FpN>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else if (auto* grid = handle.grid<bool>()) {
|
||||
test = isValid(*grid, detailed, verbose);
|
||||
} else {
|
||||
std::cerr << "Unsupported GridType: \"" << nanovdb::toStr(gridType) << "\"\n" << std::endl;
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (verbose) {
|
||||
std::cout << "Grid named \"" << m.gridName << "\": " << (test ? "passed" : "failed") << std::endl;
|
||||
} else if (!test) {
|
||||
|
||||
@@ -1,414 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file DeviceBuffer.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date January 8, 2020
|
||||
|
||||
\brief DeviceBuffer has one pinned host buffer and multiple device CUDA buffers
|
||||
|
||||
\note This file has no device-only kernel functions,
|
||||
which explains why it's a .h and not .cuh file.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_DEVICEBUFFER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICEBUFFER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda.h>
|
||||
#include <memory>// for std::shared_ptr
|
||||
#include <nanovdb/HostBuffer.h>// for BufferTraits
|
||||
#include <nanovdb/util/cuda/Util.h>// for cudaMalloc/cudaMallocManaged/cudaFree
|
||||
|
||||
namespace nanovdb {// ================================================================
|
||||
|
||||
namespace cuda {// ===================================================================
|
||||
|
||||
// ----------------------------> DeviceBuffer <--------------------------------------
|
||||
|
||||
/// @brief Simple memory buffer using un-managed pinned host memory when compiled with NVCC.
|
||||
/// Obviously this class is making explicit used of CUDA so replace it with your own memory
|
||||
/// allocator if you are not using CUDA.
|
||||
/// @note While CUDA's pinned host memory allows for asynchronous memory copy between host and device
|
||||
/// it is significantly slower then cached (un-pinned) memory on the host.
|
||||
class DeviceBuffer
|
||||
{
|
||||
uint64_t mSize; // total number of bytes managed by this buffer (assumed to be identical for host and device)
|
||||
void *mCpuData, **mGpuData; // raw pointers to the host and device buffers
|
||||
int mDeviceCount, mManaged;// if mManaged is non-zero this class is responsible for allocating and freeing memory buffers. Otherwise this is assumed to be handled externally
|
||||
|
||||
/// @brief Initialize buffer
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @note All existing buffers are first cleared
|
||||
/// @warning size is expected to be non-zero. Use clear() clear buffer!
|
||||
void init(uint64_t size, int device, cudaStream_t stream);
|
||||
|
||||
public:
|
||||
|
||||
using PtrT = std::shared_ptr<DeviceBuffer>;
|
||||
|
||||
/// @brief Default constructor of an empty buffer
|
||||
DeviceBuffer() : mSize(0), mCpuData(nullptr), mGpuData(nullptr), mDeviceCount(0), mManaged(0){}
|
||||
|
||||
/// @brief Constructor with a specified device and size
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
DeviceBuffer(uint64_t size, int device = cudaCpuDeviceId, cudaStream_t stream = 0) : DeviceBuffer()
|
||||
{
|
||||
this->init(size, device, stream);
|
||||
}
|
||||
|
||||
/// @brief Constructor
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param host If true buffer is initialized only on the host/CPU, else on the current device/GPU
|
||||
/// @param stream optional stream argument (defaults to stream NULL)
|
||||
DeviceBuffer(uint64_t size, bool host, void* stream) : DeviceBuffer()
|
||||
{
|
||||
int device = cudaCpuDeviceId;
|
||||
if (!host) cudaCheck(cudaGetDevice(&device));
|
||||
this->init(size, device, reinterpret_cast<cudaStream_t>(stream));
|
||||
}
|
||||
|
||||
/// @brief Constructor for externally managed host and device buffers
|
||||
/// @param size byte size of the two external buffers
|
||||
/// @param cpuData host buffer, assumed to NOT be NULL
|
||||
/// @param gpuData device buffer, assumed to NOT be NULL;
|
||||
/// @note The device buffer, @c gpuData, will be associated
|
||||
/// with the current device ID given by cudaGetDevice
|
||||
DeviceBuffer(uint64_t size, void* cpuData, void* gpuData)
|
||||
: mSize(size)
|
||||
, mCpuData(cpuData)
|
||||
, mManaged(0)
|
||||
{
|
||||
cudaCheck(cudaGetDeviceCount(&mDeviceCount));
|
||||
mGpuData = new void*[mDeviceCount]();// NULL initialization
|
||||
NANOVDB_ASSERT(cpuData);
|
||||
NANOVDB_ASSERT(gpuData);
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
mGpuData[device] = gpuData;
|
||||
}
|
||||
|
||||
/// @brief Constructor for externally managed host and multiple device buffers
|
||||
/// @param size byte size of the two external buffers
|
||||
/// @param cpuData host buffer, assumed to NOT be NULL
|
||||
/// @param list list of device IDs and external device buffers, all assumed to not be NULL
|
||||
DeviceBuffer(uint64_t size, void* cpuData, std::initializer_list<std::pair<int,void*>> list)
|
||||
: mSize(size)
|
||||
, mCpuData(cpuData)
|
||||
, mManaged(0)
|
||||
{
|
||||
NANOVDB_ASSERT(cpuData);
|
||||
cudaCheck(cudaGetDeviceCount(&mDeviceCount));
|
||||
mGpuData = new void*[mDeviceCount]();// NULL initialization
|
||||
for (auto &p : list) {
|
||||
NANOVDB_ASSERT(p.first>=0 && p.first<mDeviceCount);
|
||||
NANOVDB_ASSERT(p.second);
|
||||
mGpuData[p.first] = p.second;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
DeviceBuffer(const DeviceBuffer&) = delete;
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
DeviceBuffer(DeviceBuffer&& other) noexcept
|
||||
: mSize(other.mSize)
|
||||
, mCpuData(other.mCpuData)
|
||||
, mGpuData(other.mGpuData)
|
||||
, mDeviceCount(other.mDeviceCount)
|
||||
, mManaged(other.mManaged)
|
||||
{
|
||||
other.mCpuData = other.mGpuData = nullptr;
|
||||
other.mSize = other.mDeviceCount = other.mManaged = 0;
|
||||
}
|
||||
|
||||
/// @brief Copy-constructor from a HostBuffer
|
||||
/// @param buffer host buffer from which to copy data
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
DeviceBuffer(const HostBuffer& buffer, int device = cudaCpuDeviceId, cudaStream_t stream = 0)
|
||||
: DeviceBuffer(buffer.size(), device, stream)
|
||||
{
|
||||
if (mCpuData) {
|
||||
cudaCheck(cudaMemcpy(mCpuData, buffer.data(), mSize, cudaMemcpyHostToHost));
|
||||
} else if (mGpuData[device]) {
|
||||
cudaCheck(cudaMemcpyAsync(mGpuData[device], buffer.data(), mSize, cudaMemcpyHostToDevice, stream));
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Destructor frees memory on both the host and device
|
||||
~DeviceBuffer() { this->clear(); };
|
||||
|
||||
/// @brief Static factory method that return an instance of this buffer
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
|
||||
/// @param host If true buffer is initialized only on the host/CPU, else only on the device/GPU
|
||||
/// @param stream optional stream argument (defaults to stream NULL)
|
||||
/// @return An instance of this class using move semantics
|
||||
static DeviceBuffer create(uint64_t size, const DeviceBuffer* dummy, bool host, void* stream){return DeviceBuffer(size, host, stream);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
static DeviceBuffer create(uint64_t size, const DeviceBuffer* dummy = nullptr, int device = cudaCpuDeviceId, cudaStream_t stream = 0){return DeviceBuffer(size, device, stream);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer that wraps externally managed memory
|
||||
/// @param size byte size of buffer specified by external memory
|
||||
/// @param cpuData pointer to externally managed host memory
|
||||
/// @param gpuData pointer to externally managed device memory
|
||||
/// @return An instance of this class using move semantics
|
||||
static DeviceBuffer create(uint64_t size, void* cpuData, void* gpuData) {return DeviceBuffer(size, cpuData, gpuData);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer that wraps externally managed host and device memory
|
||||
/// @param size byte size of buffer to be initialized
|
||||
/// @param cpuData pointer to externally managed host memory
|
||||
/// @param list list of device IDs and device memory pointers
|
||||
static DeviceBuffer create(uint64_t size, void* cpuData, std::initializer_list<std::pair<int,void*>> list) {return DeviceBuffer(size, cpuData, list);}
|
||||
|
||||
/// @brief Static factory method that returns an instance of this buffer constructed from a HostBuffer
|
||||
/// @param buffer host buffer from which to copy data
|
||||
/// @param device id of the device on which to initialize the buffer
|
||||
/// @param stream cuda stream
|
||||
static DeviceBuffer create(const HostBuffer& buffer, int device = cudaCpuDeviceId, cudaStream_t stream = 0) {return DeviceBuffer(buffer, device, stream);}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @{
|
||||
/// @brief Factory methods that create a shared pointer to an DeviceBuffer instance
|
||||
static PtrT createPtr(uint64_t size, const DeviceBuffer* = nullptr, int device = cudaCpuDeviceId, cudaStream_t stream = 0) {return std::make_shared<DeviceBuffer>(size, device, stream);}
|
||||
static PtrT createPtr(uint64_t size, void* cpuData, void* gpuData) {return std::make_shared<DeviceBuffer>(size, cpuData, gpuData);}
|
||||
static PtrT createPtr(uint64_t size, void* cpuData, std::initializer_list<std::pair<int,void*>> list) {return std::make_shared<DeviceBuffer>(size, cpuData, list);}
|
||||
static PtrT createPtr(const HostBuffer& buffer, int device = cudaCpuDeviceId, cudaStream_t stream = 0) {return std::make_shared<DeviceBuffer>(buffer, device, stream);}
|
||||
/// @}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
DeviceBuffer& operator=(const DeviceBuffer&) = delete;
|
||||
|
||||
/// @brief Move copy assignment operation
|
||||
DeviceBuffer& operator=(DeviceBuffer&& other) noexcept;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Retuns a raw void pointer to the host/CPU buffer managed by this allocator.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* data() const { return mCpuData; }
|
||||
|
||||
/// @brief Returns an offset pointer of a specific type from the allocated host memory
|
||||
/// @tparam T Type of the pointer returned
|
||||
/// @param count Numbers of elements of @c parameter type T to skip
|
||||
/// @warning might return NULL
|
||||
template <typename T>
|
||||
T* data(ptrdiff_t count = 0, int device = cudaCpuDeviceId) const
|
||||
{
|
||||
NANOVDB_ASSERT(device >= cudaCpuDeviceId && device < mDeviceCount);
|
||||
void *ptr = device == cudaCpuDeviceId ? mCpuData : mGpuData[device];
|
||||
return ptr ? reinterpret_cast<T*>(ptr) + count : nullptr;
|
||||
}
|
||||
|
||||
/// @brief Returns a byte offset void pointer from the allocated host memory
|
||||
/// @param byteOffset offset of return pointer in units of bytes
|
||||
/// @warning assumes that this instance is not empty!
|
||||
void* data(ptrdiff_t byteOffset, int device = cudaCpuDeviceId) const
|
||||
{
|
||||
NANOVDB_ASSERT(device >= cudaCpuDeviceId && device < mDeviceCount);
|
||||
void *ptr = device == cudaCpuDeviceId ? mCpuData : mGpuData[device];
|
||||
return ptr ? reinterpret_cast<char*>(ptr) + byteOffset : nullptr;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Retuns a raw pointer to the specified device/GPU buffer managed by this allocator.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* deviceData(int device) const {
|
||||
NANOVDB_ASSERT(device >= 0 && device < mDeviceCount);
|
||||
return mGpuData[device];
|
||||
}
|
||||
|
||||
/// @brief Retuns a raw pointer to the current device/GPU buffer managed by this allocator.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* deviceData() const {
|
||||
int device = cudaCpuDeviceId;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
return this->deviceData(device);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Uploads buffer on the host to a specific device. If it doesn't exist it's created first.
|
||||
/// @param device Device ID that the data is copied to
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous.
|
||||
/// @warning Assumes that the host buffer already exists!
|
||||
/// @note determine the current device with cudaGetDevice
|
||||
void deviceUpload(int device = 0, cudaStream_t stream = 0, bool sync = true);
|
||||
void deviceUpload(int device, void* stream, bool sync){this->deviceUpload(device, cudaStream_t(stream), sync);}
|
||||
|
||||
/// @brief Upload buffer from the host to ALL the existing devices, i.e. CPU -> GPU.
|
||||
/// If no device buffers exist one is created for the current device (typically 0)
|
||||
/// and subsequently populated with the host data.
|
||||
/// @param stream CUDA stream.
|
||||
/// @param sync if false the memory copy is asynchronous.
|
||||
/// @warning Assumes that the host buffer already exists!
|
||||
void deviceUpload(cudaStream_t stream, bool sync);
|
||||
void deviceUpload(void* stream, bool sync) {this->deviceUpload(cudaStream_t(stream), sync);}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Download data from a specified device to the host. If the host buffer des not exist it will first be allocated
|
||||
/// @param device device ID to download source data from
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous.
|
||||
/// @warning Assumes that the specifed device buffer already exists!
|
||||
void deviceDownload(int device = 0, cudaStream_t stream = 0, bool sync = true);
|
||||
void deviceDownload(int device, void* stream , bool sync) {this->deviceDownload(device, cudaStream_t(stream), sync);}
|
||||
|
||||
/// @brief Download the buffer from the current device to the host, i.e. GPU -> CPU.
|
||||
/// If the host buffer des not exist it will first be allocated
|
||||
/// @param stream CUDA stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
/// @note If the host/CPU buffer does not exist it is first allocated
|
||||
/// @warning Assumes that the device/GPU buffer already exists
|
||||
void deviceDownload(void* stream, bool sync);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Returns the size in bytes of the raw memory buffer managed by this allocator.
|
||||
uint64_t size() const { return mSize; }
|
||||
uint64_t capacity() const {return this->size();}
|
||||
|
||||
/// @brief Returns the number of buffers that are not NULL
|
||||
int bufferCount() const {
|
||||
int count = mCpuData ? 1 : 0;
|
||||
for (int i=0; i<mDeviceCount; ++i) if (mGpuData[i]) ++count;
|
||||
return count;
|
||||
}
|
||||
|
||||
int deviceCount() const {return mDeviceCount;}
|
||||
|
||||
/// @{
|
||||
/// @brief Returns true if this allocator is empty, i.e. has no allocated memory
|
||||
bool empty() const { return mSize == 0; }
|
||||
bool isEmpty() const { return this->empty(); }
|
||||
/// @}
|
||||
|
||||
/// @brief De-allocate all memory managed by this allocator and set all pointers to NULL
|
||||
void clear(cudaStream_t stream = 0);
|
||||
void clear(void* stream){this->clear(cudaStream_t(stream));}
|
||||
|
||||
}; // DeviceBuffer class
|
||||
|
||||
// --------------------------> Implementations below <------------------------------------
|
||||
|
||||
inline DeviceBuffer& DeviceBuffer::operator=(DeviceBuffer&& other) noexcept
|
||||
{
|
||||
if (mManaged) {// first free all the managed data buffers
|
||||
cudaCheck(cudaFreeHost(mCpuData));
|
||||
for (int i=0; i<mDeviceCount; ++i) cudaCheck(util::cuda::freeAsync(mGpuData[i], 0));
|
||||
}
|
||||
delete [] mGpuData;
|
||||
mSize = other.mSize;
|
||||
mCpuData = other.mCpuData;
|
||||
mGpuData = other.mGpuData;
|
||||
mDeviceCount = other.mDeviceCount;
|
||||
mManaged = other.mManaged;
|
||||
other.mCpuData = nullptr;
|
||||
other.mGpuData = nullptr;
|
||||
other.mSize = 0;
|
||||
other.mDeviceCount = 0;
|
||||
other.mManaged = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline void DeviceBuffer::init(uint64_t size, int device, cudaStream_t stream)
|
||||
{
|
||||
if (size==0) return;
|
||||
cudaCheck(cudaGetDeviceCount(&mDeviceCount));
|
||||
mGpuData = new void*[mDeviceCount]();// NULL initialization
|
||||
NANOVDB_ASSERT(device >= cudaCpuDeviceId && device < mDeviceCount);
|
||||
if (device == cudaCpuDeviceId) {
|
||||
cudaCheck(cudaMallocHost((void**)&mCpuData, size)); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
|
||||
checkPtr(mCpuData, "cuda::DeviceBuffer::init: failed to allocate host buffer");
|
||||
} else {
|
||||
cudaCheck(util::cuda::mallocAsync(mGpuData+device, size, stream)); // un-managed memory on the device, always 32B aligned!
|
||||
checkPtr(mGpuData[device], "cuda::DeviceBuffer::init: failed to allocate device buffer");
|
||||
}
|
||||
mSize = size;
|
||||
mManaged = 1;// i.e. this instance is responsible for allocating and delete memory
|
||||
} // DeviceBuffer::init
|
||||
|
||||
inline void DeviceBuffer::deviceUpload(int device, cudaStream_t stream, bool sync)
|
||||
{
|
||||
NANOVDB_ASSERT(device >= 0 && device < mDeviceCount);// should be device and not the host
|
||||
checkPtr(mCpuData, "uninitialized cpu source data");
|
||||
if (mGpuData[device] == nullptr) {
|
||||
if (mManaged==0) throw std::runtime_error("DeviceBuffer::deviceUpload called on externally managed memory that wasn\'t allocated.");
|
||||
cudaCheck(util::cuda::mallocAsync(mGpuData+device, mSize, stream)); // un-managed memory on the device, always 32B aligned!
|
||||
}
|
||||
checkPtr(mGpuData[device], "uninitialized gpu destination data");
|
||||
cudaCheck(cudaMemcpyAsync(mGpuData[device], mCpuData, mSize, cudaMemcpyHostToDevice, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
} // DeviceBuffer::deviceUpload
|
||||
|
||||
inline void DeviceBuffer::deviceUpload(cudaStream_t stream, bool sync)
|
||||
{
|
||||
int device = 0;
|
||||
cudaGetDevice(&device);
|
||||
this->deviceUpload(device, stream, sync);
|
||||
} // DeviceBuffer::deviceUpload
|
||||
|
||||
inline void DeviceBuffer::deviceDownload(int device, cudaStream_t stream, bool sync)
|
||||
{
|
||||
NANOVDB_ASSERT(device >= 0 && device < mDeviceCount);
|
||||
checkPtr(mGpuData[device], "uninitialized gpu source data");// no source data on the specified device
|
||||
if (mCpuData == nullptr) {
|
||||
if (mManaged==0) throw std::runtime_error("DeviceBuffer::deviceDownload called on uninitialized cpu destination memory that is externally managed.");
|
||||
cudaCheck(cudaMallocHost((void**)&mCpuData, mSize)); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
|
||||
}
|
||||
checkPtr(mCpuData, "uninitialized cpu destination data");
|
||||
cudaCheck(cudaMemcpyAsync(mCpuData, mGpuData[device], mSize, cudaMemcpyDeviceToHost, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
} // DeviceBuffer::deviceDownload
|
||||
|
||||
inline void DeviceBuffer::deviceDownload(void* stream, bool sync)
|
||||
{
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
this->deviceDownload(device, cudaStream_t(stream), sync);
|
||||
} // DeviceBuffer::deviceDownload
|
||||
|
||||
inline void DeviceBuffer::clear(cudaStream_t stream)
|
||||
{
|
||||
if (mManaged) {// free all the managed data buffers
|
||||
cudaCheck(cudaFreeHost(mCpuData));
|
||||
for (int i=0; i<mDeviceCount; ++i) cudaCheck(util::cuda::freeAsync(mGpuData[i], stream));
|
||||
}
|
||||
delete [] mGpuData;
|
||||
mCpuData = nullptr;
|
||||
mGpuData = nullptr;
|
||||
mSize = 0;
|
||||
mDeviceCount = 0;
|
||||
mManaged = 0;
|
||||
} // DeviceBuffer::clear
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
using CudaDeviceBuffer [[deprecated("Use nanovdb::cuda::DeviceBuffer instead")]] = cuda::DeviceBuffer;
|
||||
|
||||
template<>
|
||||
struct BufferTraits<cuda::DeviceBuffer>
|
||||
{
|
||||
static constexpr bool hasDeviceDual = true;
|
||||
};
|
||||
|
||||
}// namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICEBUFFER_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,229 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file DeviceMesh.h
|
||||
|
||||
\brief nanovdb::cuda::DeviceMesh encapsulates device IDs, CUDA streams,
|
||||
and NCCL communicators in order to facilitate multi-GPU applications.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_DEVICEMESH_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICEMESH_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <thread>
|
||||
|
||||
#include <nanovdb/util/cuda/Util.h>
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
#include <nccl.h>
|
||||
#endif
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
namespace detail {
|
||||
|
||||
/// @brief RAII class that caches/restores the current device at construction/destruction
|
||||
class DeviceGuard {
|
||||
public:
|
||||
DeviceGuard() { cudaGetDevice(&deviceId); }
|
||||
~DeviceGuard() { cudaSetDevice(deviceId); }
|
||||
|
||||
/// @{
|
||||
/// @brief DeviceGuard is not copyable nor movable
|
||||
DeviceGuard(const DeviceGuard&) = delete;
|
||||
DeviceGuard& operator=(const DeviceGuard&) = delete;
|
||||
DeviceGuard(DeviceGuard&& other) = delete;
|
||||
DeviceGuard& operator=(DeviceGuard&& other) = delete;
|
||||
/// @}
|
||||
private:
|
||||
int deviceId = -1;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
/// @brief POD struct representing a device id and a stream on that device
|
||||
struct DeviceNode
|
||||
{
|
||||
int id = -1;
|
||||
cudaStream_t stream = cudaStream_t(0);
|
||||
};
|
||||
|
||||
/// @brief This class wraps a vector of per-device IDs and CUDA streams and holds inter-device connectivity information and NCCL comms.
|
||||
class DeviceMesh
|
||||
{
|
||||
using DeviceVecT = std::vector<DeviceNode>;
|
||||
using const_iterator = DeviceVecT::const_iterator;
|
||||
using size_type = DeviceVecT::size_type;
|
||||
public:
|
||||
/// @brief Constructs a device mesh for all devices on the host and initializes a CUDA stream (and NCCL communicator) for each device
|
||||
DeviceMesh();
|
||||
/// @brief Destroys the per-device CUDA stream and finalizes and destroys the per-device NCCL communicators
|
||||
~DeviceMesh();
|
||||
/// @brief Disallow copy-construction
|
||||
DeviceMesh(const DeviceMesh&) = delete;
|
||||
/// @brief Move constructor. Underlying CUDA streams and NCCL communicators are not reinitialized.
|
||||
/// @param DeviceMesh instance that will be moved into this DeviceMesh.
|
||||
DeviceMesh(DeviceMesh&&) noexcept;
|
||||
/// @brief Disallow copy-assignment
|
||||
DeviceMesh& operator=(const DeviceMesh&) = delete;
|
||||
/// @brief Move assignment. Underlying CUDA streams and NCCL communicators are not reinitialized.
|
||||
/// @param DeviceMesh instance that will be moved into this DeviceMesh.
|
||||
DeviceMesh& operator=(DeviceMesh&&) noexcept;
|
||||
|
||||
/// @brief Returns the number of devices
|
||||
size_type deviceCount() const { return mDeviceNodes.size(); };
|
||||
|
||||
/// @brief Returns a const reference to the DeviceNode for a particular device
|
||||
const DeviceNode& operator [](int deviceId) const { return mDeviceNodes[deviceId]; }
|
||||
|
||||
/// @brief Returns an iterator to the first device node
|
||||
const_iterator begin() const { return mDeviceNodes.begin(); };
|
||||
/// @brief Returns an iterator past the last device node
|
||||
const_iterator end() const { return mDeviceNodes.end(); };
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
/// @brief Returns the NCCL communicator for a particular device
|
||||
ncclComm_t comm(int deviceId) const { return mComms[deviceId]; }
|
||||
#endif
|
||||
|
||||
/// @brief Returns whether or not peer to peer access is supported between two devices.
|
||||
bool canAccessPeer(int deviceId, int peerId) const { return mConnectivity[deviceId][peerId] & (1 << cudaDevP2PAttrAccessSupported); }
|
||||
|
||||
private:
|
||||
/// @brief Returns whether or not a device supports managed memory
|
||||
bool hasManagedMemory(int deviceId) const {
|
||||
int managedMemoryValue = 0;
|
||||
cudaDeviceGetAttribute(&managedMemoryValue, cudaDevAttrManagedMemory, deviceId);
|
||||
return static_cast<bool>(managedMemoryValue);
|
||||
}
|
||||
|
||||
DeviceVecT mDeviceNodes;
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
std::vector<ncclComm_t> mComms;
|
||||
#endif
|
||||
std::vector<std::vector<uint32_t>> mConnectivity;
|
||||
};
|
||||
|
||||
inline DeviceMesh::DeviceMesh()
|
||||
{
|
||||
detail::DeviceGuard deviceGuard;
|
||||
|
||||
int deviceCount = -1;
|
||||
cudaGetDeviceCount(&deviceCount);
|
||||
|
||||
for (int deviceId = 0; deviceId < deviceCount; ++deviceId) {
|
||||
NANOVDB_ASSERT(hasManagedMemory(deviceId));
|
||||
cudaSetDevice(deviceId);
|
||||
cudaStream_t stream;
|
||||
cudaStreamCreate(&stream);
|
||||
mDeviceNodes.push_back({deviceId, stream});
|
||||
}
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
mComms.resize(deviceCount);
|
||||
ncclCommInitAll(mComms.data(), deviceCount, nullptr);
|
||||
#endif
|
||||
|
||||
mConnectivity.resize(deviceCount);
|
||||
for (const auto& deviceNode : mDeviceNodes) {
|
||||
mConnectivity[deviceNode.id].resize(deviceCount);
|
||||
for (const auto& peerNode : mDeviceNodes) {
|
||||
mConnectivity[deviceNode.id][peerNode.id] = 0;
|
||||
if (deviceNode.id != peerNode.id) {
|
||||
int peerAccessSupportedValue = 0;
|
||||
cudaDeviceGetP2PAttribute(&peerAccessSupportedValue, cudaDevP2PAttrAccessSupported, deviceNode.id, peerNode.id);
|
||||
if (peerAccessSupportedValue) {
|
||||
mConnectivity[deviceNode.id][peerNode.id] |= (1 << cudaDevP2PAttrAccessSupported);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline DeviceMesh::DeviceMesh(DeviceMesh&& other) noexcept
|
||||
: mDeviceNodes(std::move(other.mDeviceNodes)),
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
mComms(std::move(other.mComms)),
|
||||
#endif
|
||||
mConnectivity(std::move(other.mConnectivity))
|
||||
{
|
||||
}
|
||||
|
||||
inline DeviceMesh::~DeviceMesh()
|
||||
{
|
||||
detail::DeviceGuard deviceGuard;
|
||||
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
std::for_each(mComms.begin(), mComms.end(), [](ncclComm_t comm) {
|
||||
ncclCommFinalize(comm);
|
||||
ncclCommDestroy(comm);
|
||||
});
|
||||
#endif
|
||||
|
||||
std::for_each(mDeviceNodes.begin(), mDeviceNodes.end(), [](DeviceNode& deviceNode) {
|
||||
cudaSetDevice(deviceNode.id);
|
||||
cudaStreamDestroy(deviceNode.stream);
|
||||
});
|
||||
}
|
||||
|
||||
inline DeviceMesh& DeviceMesh::operator=(DeviceMesh&& other) noexcept
|
||||
{
|
||||
mDeviceNodes = std::move(other.mDeviceNodes);
|
||||
#ifdef NANOVDB_USE_NCCL
|
||||
mComms = std::move(other.mComms);
|
||||
#endif
|
||||
mConnectivity = std::move(other.mConnectivity);
|
||||
return *this;
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
inline void* queryAllocationGranularityEntryPoint()
|
||||
{
|
||||
void* entryPoint = nullptr;
|
||||
#if CUDART_VERSION >= 12500 // cudaGetDriverEntryPointByVersion was added in CUDA 12.5 with cudaGetDriverEntryPoint being potentially deprecated
|
||||
cudaDriverEntryPointQueryResult queryResult = cudaDriverEntryPointSymbolNotFound;
|
||||
cudaCheck(cudaGetDriverEntryPointByVersion("cuMemGetAllocationGranularity", &entryPoint, 12000, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#elif CUDART_VERSION >= 12000 // queryResult argument was added in CUDA 12
|
||||
cudaDriverEntryPointQueryResult queryResult = cudaDriverEntryPointSymbolNotFound;
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#else
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault));
|
||||
#endif
|
||||
return entryPoint;
|
||||
}// queryAllocationGranularityEntryPoint
|
||||
|
||||
}
|
||||
|
||||
/// @brief Returns the minimum page size (in bytes) across all devices on the system
|
||||
inline size_t minDevicePageSize(const DeviceMesh& mesh)
|
||||
{
|
||||
using FuncT = CUresult(size_t*, const CUmemAllocationProp*, CUmemAllocationGranularity_flags);
|
||||
static FuncT* functPtr = reinterpret_cast<FuncT*>(detail::queryAllocationGranularityEntryPoint());
|
||||
|
||||
NANOVDB_ASSERT(functPtr);
|
||||
CUmemAllocationProp prop = {};
|
||||
prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
|
||||
prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
|
||||
size_t minGranularity = 0;
|
||||
for (const auto& node : mesh) {
|
||||
prop.location.id = node.id;
|
||||
size_t granularity = 0;
|
||||
(*functPtr)(&granularity, &prop, CU_MEM_ALLOC_GRANULARITY_MINIMUM);
|
||||
if (minGranularity < granularity) minGranularity = granularity;
|
||||
}
|
||||
return minGranularity;
|
||||
}// minDevicePageSize
|
||||
|
||||
} // namespace cuda
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICEMESH_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,35 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
#ifndef NANOVDB_CUDA_DEVICERESOURCE_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICERESOURCE_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda_runtime_api.h>
|
||||
#include <nanovdb/util/cuda/Util.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
class DeviceResource
|
||||
{
|
||||
public:
|
||||
// cudaMalloc aligns memory to 256 bytes by default
|
||||
static constexpr size_t DEFAULT_ALIGNMENT = 256;
|
||||
|
||||
static void* allocateAsync(size_t bytes, size_t, cudaStream_t stream) {
|
||||
void* p = nullptr;
|
||||
cudaCheck(util::cuda::mallocAsync(&p, bytes, stream));
|
||||
return p;
|
||||
}
|
||||
|
||||
static void deallocateAsync(void *p, size_t, size_t, cudaStream_t stream) {
|
||||
cudaCheck(util::cuda::freeAsync(p, stream));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
} // namespace nanovdb::cuda
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICERESOURCE_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,124 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file DeviceStreamMap.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date October 15, 2024
|
||||
|
||||
\brief nanovdb::cuda::DeviceStreamMap maps device IDs to CUDA streams,
|
||||
which is useful for multi-GPU applications.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_DEVICESTREAMMAP_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_DEVICESTREAMMAP_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda.h>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <nanovdb/util/cuda/Util.h>// for cudaCheck, deviceCount etc
|
||||
|
||||
namespace nanovdb {// ================================================================
|
||||
|
||||
namespace cuda {// ===================================================================
|
||||
|
||||
/// @brief map from a device ID to an associated cuda stream. Useful for multi-GPU applications.
|
||||
class DeviceStreamMap : public std::map<int, cudaStream_t>
|
||||
{
|
||||
using FuncT = CUresult(size_t*, const CUmemAllocationProp*, CUmemAllocationGranularity_flags);
|
||||
FuncT *mFunctPtr;
|
||||
|
||||
public:
|
||||
|
||||
enum DeviceType { Any = 0, PeerToPeer = 1, Unified = 3 };
|
||||
|
||||
/// @brief Initiates a map between CUDA device IDs and corresponding streams that satisfy certain constraints.
|
||||
/// All devices should be able to access memory on all the other devices!
|
||||
/// @param t Type of device to include in map. Any means all available devices, PeerToPeer means only devices that
|
||||
/// access all another devices are included, and Unified means all devices support unified memory, concurrent access,
|
||||
/// and can be access by all other devices.
|
||||
/// @param exclude optional list of device IDs to exclude from the map
|
||||
/// @param verbose 0 means quiet, 1 means print if a device is ignores and 2 means print is a device is included
|
||||
DeviceStreamMap(DeviceType t = DeviceType::Unified, std::vector<int> exclude = {}, int verbose = 0);
|
||||
|
||||
/// @brief Destructor
|
||||
~DeviceStreamMap();
|
||||
|
||||
/// @brief returns the minimum page size of all the devices in this map
|
||||
size_t getMinPageSize() const;
|
||||
|
||||
/// @brief Print information about all the devices included in this map
|
||||
void printDevInfo(std::FILE* file = stdout) const {for (auto &p : *this) util::cuda::printDevInfo(p.first, nullptr, file);}
|
||||
|
||||
/// @brief Returns the number of device associated with this map
|
||||
int deviceCount() const {return this->size();}
|
||||
|
||||
};// DeviceStreamMap
|
||||
|
||||
DeviceStreamMap::DeviceStreamMap(DeviceType t, std::vector<int> exclude, int verbose)
|
||||
{
|
||||
std::initializer_list<cudaDeviceAttr> filter = {cudaDevAttrUnifiedAddressing, cudaDevAttrConcurrentManagedAccess};
|
||||
const int devCount = util::cuda::deviceCount(), current = util::cuda::currentDevice();
|
||||
for (int dev = 0; dev < devCount; ++dev) {
|
||||
int check = 1;
|
||||
for (auto it=exclude.begin(); check && it!=exclude.end(); ++it) if (dev == *it) check = 0;
|
||||
for (auto it=filter.begin(); (t&2) && check && it!=filter.end(); ++it) cudaCheck(cudaDeviceGetAttribute( &check, *it, dev));
|
||||
for (auto it= this->begin(); (t&1) && check && it!= this->end(); ++it) cudaCheck(cudaDeviceCanAccessPeer(&check, dev, it->first));
|
||||
if (check) {
|
||||
cudaCheck(cudaSetDevice(dev));
|
||||
cudaStream_t stream;
|
||||
cudaCheck(cudaStreamCreate(&stream));
|
||||
if (verbose>1) util::cuda::printDevInfo(dev, "Using");
|
||||
(*this)[dev] = stream;
|
||||
} else if (verbose) util::cuda::printDevInfo(dev, "Ignoring");
|
||||
}
|
||||
cudaCheck(cudaSetDevice(current));// reset to the previous device
|
||||
|
||||
void* entryPoint = nullptr;
|
||||
#if CUDART_VERSION >= 13000
|
||||
cudaDriverEntryPointQueryResult queryResult;
|
||||
cudaCheck(cudaGetDriverEntryPointByVersion("cuMemGetAllocationGranularity", &entryPoint, 13000, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#elif CUDART_VERSION >= 12000// queryResult argument was added in CUDA 12
|
||||
cudaDriverEntryPointQueryResult queryResult;
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault, &queryResult));
|
||||
NANOVDB_ASSERT(queryResult == cudaDriverEntryPointSuccess);
|
||||
#else
|
||||
cudaCheck(cudaGetDriverEntryPoint("cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault));
|
||||
#endif
|
||||
mFunctPtr = reinterpret_cast<FuncT*>(entryPoint);
|
||||
}// DeviceStreamMap::DeviceStreamMap
|
||||
|
||||
DeviceStreamMap::~DeviceStreamMap()
|
||||
{
|
||||
const int current = util::cuda::currentDevice();
|
||||
for (auto& [device, stream] : *this) {
|
||||
cudaCheck(cudaSetDevice(device));
|
||||
cudaCheck(cudaStreamDestroy(stream));
|
||||
}
|
||||
cudaCheck(cudaSetDevice(current));// reset to the previous device
|
||||
}
|
||||
|
||||
inline size_t DeviceStreamMap::getMinPageSize() const
|
||||
{
|
||||
NANOVDB_ASSERT(mFunctPtr);
|
||||
CUmemAllocationProp prop = {};
|
||||
prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
|
||||
prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
|
||||
size_t minGranularity = 0;
|
||||
for (auto it = this->begin(); it!=this->end(); ++it) {
|
||||
prop.location.id = it->first;
|
||||
size_t granularity = 0;
|
||||
(*mFunctPtr)(&granularity, &prop, CU_MEM_ALLOC_GRANULARITY_MINIMUM);
|
||||
if (minGranularity < granularity) minGranularity = granularity;
|
||||
}
|
||||
return minGranularity;
|
||||
}// DeviceStreamMap::getMinPageSize
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
}// namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_DEVICESTREAMMAP_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,152 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/cuda/GridHandle.cuh
|
||||
|
||||
\author Ken Museth, Doyub Kim
|
||||
|
||||
\date August 3, 2023
|
||||
|
||||
\brief Contains cuda kernels for GridHandle
|
||||
|
||||
\warning The header file contains cuda device code so be sure
|
||||
to only include it in .cu files (or other .cuh files)
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_GRIDHANDLE_CUH_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_GRIDHANDLE_CUH_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>// required for instantiation of move c-tor of GridHandle
|
||||
#include <nanovdb/tools/cuda/GridChecksum.cuh>// for cuda::updateChecksum
|
||||
#include <nanovdb/GridHandle.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
namespace detail {
|
||||
|
||||
static __global__ void cpyGridHandleMeta(const GridData *d_data, GridHandleMetaData *d_meta)
|
||||
{
|
||||
nanovdb::cpyGridHandleMeta(d_data, d_meta);
|
||||
}
|
||||
|
||||
static __global__ void updateGridCount(GridData *d_data, uint32_t gridIndex, uint32_t gridCount, bool *d_dirty)
|
||||
{
|
||||
NANOVDB_ASSERT(gridIndex < gridCount);
|
||||
*d_dirty = (d_data->mGridIndex != gridIndex) || (d_data->mGridCount != gridCount);
|
||||
if (*d_dirty) {
|
||||
d_data->mGridIndex = gridIndex;
|
||||
d_data->mGridCount = gridCount;
|
||||
if (d_data->mChecksum.isEmpty()) *d_dirty = false;// no need to update checksum if it didn't already exist
|
||||
}
|
||||
}
|
||||
|
||||
}// namespace detail
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT = std::vector>
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, VectorT<GridHandle<BufferT>>>::type
|
||||
splitGridHandles(const GridHandle<BufferT> &handle, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{
|
||||
const void *ptr = handle.deviceData();
|
||||
if (ptr == nullptr) return VectorT<GridHandle<BufferT>>();
|
||||
VectorT<GridHandle<BufferT>> handles(handle.gridCount());
|
||||
bool dirty, *d_dirty;// use this to check if the checksum needs to be recomputed
|
||||
cudaCheck(util::cuda::mallocAsync((void**)&d_dirty, sizeof(bool), stream));
|
||||
int device = util::cuda::currentDevice();
|
||||
for (uint32_t n=0; n<handle.gridCount(); ++n) {
|
||||
auto buffer = BufferT::create(handle.gridSize(n), other, device, stream);
|
||||
GridData *dst = reinterpret_cast<GridData*>(buffer.deviceData());
|
||||
const GridData *src = reinterpret_cast<const GridData*>(ptr);
|
||||
cudaCheck(cudaMemcpyAsync(dst, src, handle.gridSize(n), cudaMemcpyDeviceToDevice, stream));
|
||||
detail::updateGridCount<<<1, 1, 0, stream>>>(dst, 0u, 1u, d_dirty);
|
||||
cudaCheckError();
|
||||
cudaCheck(cudaMemcpyAsync(&dirty, d_dirty, sizeof(bool), cudaMemcpyDeviceToHost, stream));
|
||||
cudaCheck(cudaStreamSynchronize(stream));
|
||||
if (dirty) tools::cuda::updateChecksum(dst, CheckMode::Partial, stream);
|
||||
handles[n] = nanovdb::GridHandle<BufferT>(std::move(buffer));
|
||||
ptr = util::PtrAdd(ptr, handle.gridSize(n));
|
||||
}
|
||||
cudaCheck(util::cuda::freeAsync(d_dirty, stream));
|
||||
return handles;
|
||||
}// cuda::splitGridHandles
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT>
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, GridHandle<BufferT>>::type
|
||||
mergeGridHandles(const VectorT<GridHandle<BufferT>> &handles, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{
|
||||
uint64_t size = 0u;
|
||||
uint32_t counter = 0u, gridCount = 0u;
|
||||
for (auto &h : handles) {
|
||||
gridCount += h.gridCount();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) size += h.gridSize(n);
|
||||
}
|
||||
int device = util::cuda::currentDevice();
|
||||
auto buffer = BufferT::create(size, other, device, stream);
|
||||
void *dst = buffer.deviceData();
|
||||
bool dirty, *d_dirty;// use this to check if the checksum needs to be recomputed
|
||||
cudaCheck(util::cuda::mallocAsync((void**)&d_dirty, sizeof(bool), stream));
|
||||
for (auto &h : handles) {
|
||||
const void *src = h.deviceData();
|
||||
for (uint32_t n=0; n<h.gridCount(); ++n) {
|
||||
cudaCheck(cudaMemcpyAsync(dst, src, h.gridSize(n), cudaMemcpyDeviceToDevice, stream));
|
||||
GridData *data = reinterpret_cast<GridData*>(dst);
|
||||
detail::updateGridCount<<<1, 1, 0, stream>>>(data, counter++, gridCount, d_dirty);
|
||||
cudaCheckError();
|
||||
cudaCheck(cudaMemcpyAsync(&dirty, d_dirty, sizeof(bool), cudaMemcpyDeviceToHost, stream));
|
||||
cudaCheck(cudaStreamSynchronize(stream));
|
||||
if (dirty) tools::cuda::updateChecksum(data, CheckMode::Partial, stream);
|
||||
dst = util::PtrAdd(dst, h.gridSize(n));
|
||||
src = util::PtrAdd(src, h.gridSize(n));
|
||||
}
|
||||
}
|
||||
cudaCheck(util::cuda::freeAsync(d_dirty, stream));
|
||||
return GridHandle<BufferT>(std::move(buffer));
|
||||
}// cuda::mergeGridHandles
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT = std::vector>
|
||||
[[deprecated("Use nanovdb::cuda::splitGridHandles instead")]]
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, VectorT<GridHandle<BufferT>>>::type
|
||||
splitDeviceGrids(const GridHandle<BufferT> &handle, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{ return cuda::splitGridHandles(handle, other, stream); }
|
||||
|
||||
template<typename BufferT, template <class, class...> class VectorT>
|
||||
[[deprecated("Use nanovdb::cuda::mergeGridHandles instead")]]
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, GridHandle<BufferT>>::type
|
||||
mergeDeviceGrids(const VectorT<GridHandle<BufferT>> &handles, const BufferT* other = nullptr, cudaStream_t stream = 0)
|
||||
{ return cuda::mergeGridHandles<BufferT, VectorT>(handles, other, stream); }
|
||||
|
||||
template<typename BufferT>
|
||||
template<typename T, typename util::enable_if<BufferTraits<T>::hasDeviceDual, int>::type>
|
||||
GridHandle<BufferT>::GridHandle(T&& buffer)
|
||||
{
|
||||
static_assert(util::is_same<T,BufferT>::value, "Expected U==BufferT");
|
||||
mBuffer = std::move(buffer);
|
||||
if (auto *data = reinterpret_cast<const GridData*>(mBuffer.data())) {
|
||||
if (!data->isValid()) throw std::runtime_error("GridHandle was constructed with an invalid host buffer");
|
||||
mMetaData.resize(data->mGridCount);
|
||||
cpyGridHandleMeta(data, mMetaData.data());
|
||||
} else {
|
||||
if (auto *d_data = reinterpret_cast<const GridData*>(mBuffer.deviceData())) {
|
||||
GridData tmp;
|
||||
cudaCheck(cudaMemcpy(&tmp, d_data, sizeof(GridData), cudaMemcpyDeviceToHost));
|
||||
if (!tmp.isValid()) throw std::runtime_error("GridHandle was constructed with an invalid device buffer");
|
||||
GridHandleMetaData *d_metaData;
|
||||
cudaMalloc((void**)&d_metaData, tmp.mGridCount*sizeof(GridHandleMetaData));
|
||||
cuda::detail::cpyGridHandleMeta<<<1,1>>>(d_data, d_metaData);
|
||||
mMetaData.resize(tmp.mGridCount);
|
||||
cudaCheck(cudaMemcpy(mMetaData.data(), d_metaData,tmp.mGridCount*sizeof(GridHandleMetaData), cudaMemcpyDeviceToHost));
|
||||
cudaCheck(cudaFree(d_metaData));
|
||||
}
|
||||
}
|
||||
}// GridHandle(T&& buffer)
|
||||
|
||||
// Dummy function that ensures instantiation of the move-constructor above when BufferT=cuda::DeviceBuffer
|
||||
namespace {auto __dummy(){return GridHandle<cuda::DeviceBuffer>(std::move(cuda::DeviceBuffer()));}}
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // NANOVDB_CUDA_GRIDHANDLE_CUH_HAS_BEEN_INCLUDED
|
||||
@@ -1,102 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file nanovdb/cuda/NodeManager.cuh
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date October 3, 2023
|
||||
|
||||
\brief Contains cuda kernels for NodeManager
|
||||
|
||||
\warning The header file contains cuda device code so be sure
|
||||
to only include it in .cu files (or other .cuh files)
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_NODE_MANAGER_CUH_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_NODE_MANAGER_CUH_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/util/cuda/Util.h>// for cuda::lambdaKernel
|
||||
#include <nanovdb/cuda/DeviceBuffer.h>
|
||||
#include <nanovdb/NodeManager.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
/// @brief Construct a NodeManager from a device grid pointer
|
||||
///
|
||||
/// @param d_grid device grid pointer whose nodes will be accessed sequentially
|
||||
/// @param buffer buffer from which to allocate the output handle
|
||||
/// @param stream cuda stream
|
||||
/// @return Handle that contains a device NodeManager
|
||||
template <typename BuildT, typename BufferT = DeviceBuffer>
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, NodeManagerHandle<BufferT>>::type
|
||||
createNodeManager(const NanoGrid<BuildT> *d_grid,
|
||||
const BufferT& pool = BufferT(),
|
||||
cudaStream_t stream = 0)
|
||||
{
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
auto buffer = BufferT::create(sizeof(NodeManagerData), &pool, device, stream);
|
||||
auto *d_data = (NodeManagerData*)buffer.deviceData();
|
||||
size_t size = 0u, *d_size;
|
||||
cudaCheck(util::cuda::mallocAsync((void**)&d_size, sizeof(size_t), stream));
|
||||
util::cuda::lambdaKernel<<<1, 1, 0, stream>>>(1, [=] __device__(size_t) {
|
||||
*d_data = NodeManagerData((void*)d_grid);
|
||||
*d_size = sizeof(NodeManagerData);
|
||||
auto &tree = d_grid->tree();
|
||||
if (NodeManager<BuildT>::FIXED_SIZE && d_grid->isBreadthFirst()) {
|
||||
d_data->mLinear = uint8_t(1u);
|
||||
d_data->mOff[0] = util::PtrDiff(tree.template getFirstNode<0>(), d_grid);
|
||||
d_data->mOff[1] = util::PtrDiff(tree.template getFirstNode<1>(), d_grid);
|
||||
d_data->mOff[2] = util::PtrDiff(tree.template getFirstNode<2>(), d_grid);
|
||||
} else {
|
||||
*d_size += sizeof(uint64_t)*tree.totalNodeCount();
|
||||
}
|
||||
});
|
||||
cudaCheckError();
|
||||
cudaCheck(cudaMemcpyAsync(&size, d_size, sizeof(size_t), cudaMemcpyDeviceToHost, stream));
|
||||
cudaCheck(util::cuda::freeAsync(d_size, stream));
|
||||
if (size > sizeof(NodeManagerData)) {
|
||||
auto tmp = BufferT::create(size, &pool, device, stream);// only allocate buffer on the device
|
||||
cudaCheck(cudaMemcpyAsync(tmp.deviceData(), buffer.deviceData(), sizeof(NodeManagerData), cudaMemcpyDeviceToDevice, stream));
|
||||
buffer = std::move(tmp);
|
||||
d_data = reinterpret_cast<NodeManagerData*>(buffer.deviceData());
|
||||
util::cuda::lambdaKernel<<<1, 1, 0, stream>>>(1, [=] __device__ (size_t) {
|
||||
auto &tree = d_grid->tree();
|
||||
int64_t *ptr0 = d_data->mPtr[0] = reinterpret_cast<int64_t*>(d_data + 1);
|
||||
int64_t *ptr1 = d_data->mPtr[1] = d_data->mPtr[0] + tree.nodeCount(0);
|
||||
int64_t *ptr2 = d_data->mPtr[2] = d_data->mPtr[1] + tree.nodeCount(1);
|
||||
// Performs depth first traversal but breadth first insertion
|
||||
for (auto it2 = tree.root().cbeginChild(); it2; ++it2) {
|
||||
*ptr2++ = util::PtrDiff(&*it2, d_grid);
|
||||
for (auto it1 = it2->cbeginChild(); it1; ++it1) {
|
||||
*ptr1++ = util::PtrDiff(&*it1, d_grid);
|
||||
for (auto it0 = it1->cbeginChild(); it0; ++it0) {
|
||||
*ptr0++ = util::PtrDiff(&*it0, d_grid);
|
||||
}// loop over child nodes of the lower internal node
|
||||
}// loop over child nodes of the upper internal node
|
||||
}// loop over child nodes of the root node
|
||||
});
|
||||
}
|
||||
|
||||
return NodeManagerHandle<BufferT>(toGridType<BuildT>(), std::move(buffer));
|
||||
}// cuda::createNodeManager
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
template <typename BuildT, typename BufferT = cuda::DeviceBuffer>
|
||||
[[deprecated("Use cuda::createNodeManager instead")]]
|
||||
inline typename util::enable_if<BufferTraits<BufferT>::hasDeviceDual, NodeManagerHandle<BufferT>>::type
|
||||
cudaCreateNodeManager(const NanoGrid<BuildT> *d_grid,
|
||||
const BufferT& pool = BufferT(),
|
||||
cudaStream_t stream = 0)
|
||||
{
|
||||
return cuda::createNodeManager<BuildT, BufferT>(d_grid, pool, stream);
|
||||
}
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // NANOVDB_CUDA_NODE_MANAGER_CUH_HAS_BEEN_INCLUDED
|
||||
@@ -1,66 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
/// @brief Defines a simple memory pool used to call cub functions that use dynamic temporary storage
|
||||
///
|
||||
/// @details See nanovdb/tools/cuda/PointToGrid.cuh and nanovdb/tools/cuda/DistributedPointToGrid.cuh
|
||||
/// for examples. Also note that this explains the somewhat unusual API with direct access to
|
||||
/// protected member data.
|
||||
//
|
||||
#ifndef NANOVDB_CUDA_TEMPPOOL_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_TEMPPOOL_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <nanovdb/cuda/DeviceResource.h>
|
||||
|
||||
namespace nanovdb {
|
||||
|
||||
namespace cuda {
|
||||
|
||||
template <class Resource>
|
||||
class TempPool {
|
||||
public:
|
||||
|
||||
/// @brief Default c-tor of an empty memory pool.
|
||||
TempPool() : mData(nullptr), mSize(0), mRequestedSize(0) {}
|
||||
|
||||
/// @brief Destructor
|
||||
~TempPool() {
|
||||
mRequestedSize = 0;
|
||||
Resource::deallocateAsync(mData, mSize, Resource::DEFAULT_ALIGNMENT, nullptr);
|
||||
mData = nullptr;
|
||||
mSize = 0;
|
||||
}
|
||||
|
||||
/// @brief Returns a non-const void pointer to the data managed by this instance.
|
||||
void* data() {return mData;}
|
||||
|
||||
/// @brief Returns a non-const reference to the actual size of the data managed by this instance.
|
||||
size_t& size() {return mSize;}
|
||||
|
||||
/// @brief Returns a non-const reference to the requested size of the data managed by this instance.
|
||||
/// @note This requested size should always be less than or smaller than the actual size().
|
||||
size_t& requestedSize() {return mRequestedSize;}
|
||||
|
||||
/// @brief Re-allocation of the data managed by this instance. Only has affect if the pool in empty or
|
||||
/// the requested memory is larger than the existing size.
|
||||
/// @param stream cuda stream used for asynchronous de-allocation and allocation.
|
||||
void reallocate(cudaStream_t stream) {
|
||||
if (!mData || mRequestedSize > mSize) {
|
||||
Resource::deallocateAsync(mData, mSize, Resource::DEFAULT_ALIGNMENT, stream);
|
||||
mData = Resource::allocateAsync(mRequestedSize, Resource::DEFAULT_ALIGNMENT, stream);
|
||||
mSize = mRequestedSize;
|
||||
}
|
||||
}
|
||||
private:
|
||||
void *mData;
|
||||
size_t mSize;
|
||||
size_t mRequestedSize;
|
||||
};// TempPool<Resource> class
|
||||
|
||||
using TempDevicePool = TempPool<DeviceResource>;
|
||||
|
||||
} // namespace cuda
|
||||
|
||||
} // namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_TEMPPOOL_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,326 +0,0 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/*!
|
||||
\file UnifiedBuffer.h
|
||||
|
||||
\author Ken Museth
|
||||
|
||||
\date October 15, 2024
|
||||
|
||||
\brief nanovdb::cuda::UnifiedBuffer that uses unified memory management
|
||||
|
||||
\note This file has no device-only kernel functions,
|
||||
which explains why it's a .h and not .cuh file.
|
||||
*/
|
||||
|
||||
#ifndef NANOVDB_CUDA_UNIFIEDBUFFER_H_HAS_BEEN_INCLUDED
|
||||
#define NANOVDB_CUDA_UNIFIEDBUFFER_H_HAS_BEEN_INCLUDED
|
||||
|
||||
#include <cuda.h>
|
||||
#include <memory>// for std::shared_ptr
|
||||
#include <nanovdb/HostBuffer.h>// for BufferTraits
|
||||
#include <nanovdb/util/cuda/Util.h>// for cudaCheck
|
||||
|
||||
namespace nanovdb {// ================================================================
|
||||
|
||||
namespace cuda {// ===================================================================
|
||||
|
||||
/// @brief buffer, used for instance by the GridHandle, to allocate unified memory that
|
||||
/// can be resized and shared between multiple devices and the host.
|
||||
class UnifiedBuffer
|
||||
{
|
||||
void *mPtr;
|
||||
size_t mSize, mCapacity;
|
||||
public:
|
||||
|
||||
using PtrT = std::shared_ptr<UnifiedBuffer>;
|
||||
|
||||
/// @brief Default constructor of an empty buffer
|
||||
UnifiedBuffer() : mPtr(nullptr), mSize(0), mCapacity(0){}
|
||||
|
||||
/// @brief Constructor that specifies both the size and capacity
|
||||
/// @param size size of the buffer in bytes, indication what is actually used
|
||||
/// @param capacity number of bytes in the virtual page table, i.e max size for growing
|
||||
/// @note Capacity can be over-estimated to allow for future growth. Memory is not allocated
|
||||
/// with this constructor, only a page table. Allocation happens on usage or when calling prefetch
|
||||
UnifiedBuffer(size_t size, size_t capacity) : mPtr(nullptr), mSize(size), mCapacity(capacity)
|
||||
{
|
||||
assert(mSize <= mCapacity);
|
||||
cudaCheck(cudaMallocManaged(&mPtr, mCapacity, cudaMemAttachGlobal));
|
||||
}
|
||||
|
||||
/// @brief Similar to the constructor above except the size and capacity are equal, so no future growth is supported
|
||||
UnifiedBuffer(size_t size) : UnifiedBuffer(size, size){}
|
||||
|
||||
/// @brief Constructor that specifies the size, capacity, and device (for prefetching)
|
||||
/// @param size
|
||||
/// @param capacity
|
||||
/// @param device
|
||||
/// @param stream
|
||||
UnifiedBuffer(uint64_t size, uint64_t capacity, int device, cudaStream_t stream = 0) : mPtr(nullptr), mSize(size), mCapacity(size)
|
||||
{
|
||||
assert(mSize <= mCapacity);
|
||||
cudaCheck(cudaMallocManaged(&mPtr, mCapacity, cudaMemAttachGlobal));
|
||||
cudaCheck(util::cuda::memAdvise(mPtr, size, cudaMemAdviseSetPreferredLocation, device));
|
||||
cudaCheck(util::cuda::memPrefetchAsync(mPtr, size, device, stream));
|
||||
}
|
||||
|
||||
/// @brief Constructor with a specified device
|
||||
/// @param size
|
||||
/// @param device
|
||||
/// @param stream
|
||||
UnifiedBuffer(uint64_t size, int device, cudaStream_t stream = 0) : UnifiedBuffer(size, size, device, stream){}
|
||||
|
||||
/// @brief Disallow copy-construction
|
||||
UnifiedBuffer(const UnifiedBuffer&) = delete;
|
||||
|
||||
/// @brief Move copy-constructor
|
||||
UnifiedBuffer(UnifiedBuffer&& other) noexcept
|
||||
: mPtr(other.mPtr)
|
||||
, mSize(other.mSize)
|
||||
, mCapacity(other.mCapacity)
|
||||
{
|
||||
other.mPtr = nullptr;
|
||||
other.mSize = other.mCapacity = 0;
|
||||
}
|
||||
|
||||
/// @brief Destructor
|
||||
~UnifiedBuffer(){cudaCheck(cudaFree(mPtr));}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
//@{
|
||||
/// @brief Factory methods that create an UnifiedBuffer instance and returns it with move semantics
|
||||
static UnifiedBuffer create(size_t size, size_t capacity) {return UnifiedBuffer(size, capacity);}
|
||||
static UnifiedBuffer create(size_t size) {return UnifiedBuffer(size);}
|
||||
///@}
|
||||
|
||||
//@{
|
||||
/// @brief Factory methods that create a shared pointer to an UnifiedBuffer instance
|
||||
static PtrT createPtr(size_t size, size_t capacity) {return std::make_shared<UnifiedBuffer>(size, capacity);}
|
||||
static PtrT createPtr(size_t size) {return std::make_shared<UnifiedBuffer>(size);}
|
||||
///@}
|
||||
|
||||
/// @brief Legacy factory method that mirrors DeviceBuffer. It creates a UnifiedBuffer from a size and a reference buffer.
|
||||
/// If a reference buffer is provided and its non-empty, it is used to defined the capacity of the new buffer
|
||||
/// @param size Size on bytes of the new buffer
|
||||
/// @param reference reference buffer optionally used to define the capacity
|
||||
/// @param host Ignored for now
|
||||
/// @param stream cuda stream
|
||||
/// @return An instance of a new UnifiedBuffer using move semantics
|
||||
static UnifiedBuffer create(size_t size, const UnifiedBuffer* reference, int device, cudaStream_t stream)
|
||||
{
|
||||
const size_t capacity = (reference && reference->capacity()) ? reference->capacity() : size;
|
||||
UnifiedBuffer buffer(size, capacity);
|
||||
cudaCheck(util::cuda::memAdvise(buffer.mPtr, size, cudaMemAdviseSetPreferredLocation, device));
|
||||
cudaCheck(util::cuda::memPrefetchAsync(buffer.mPtr, size, device, stream));
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/// @brief Factory method that created a buffer on the host of the specified size. If the
|
||||
/// reference buffer has a capacity it is used. Also the buffer is prefetched to the host
|
||||
/// @param size byte size of buffer initiated on the host
|
||||
/// @param reference optional reference buffer from which the capacity is derived
|
||||
static UnifiedBuffer create(size_t size, const UnifiedBuffer* reference){return create(size, reference, cudaCpuDeviceId, (cudaStream_t)0);}
|
||||
|
||||
/// @brief Factory method that created a buffer on the host or device of the specified size. If the
|
||||
/// reference buffer has a capacity it is used. Also the buffer is prefetched to the host or (current) device
|
||||
/// @param size byte size of buffer initiated on the device or host
|
||||
/// @param reference optional reference buffer from which the capacity is derived
|
||||
/// @param host If true the buffer will be prefetched to the host, else to the current device
|
||||
/// @param stream optional cuda stream
|
||||
static UnifiedBuffer create(size_t size, const UnifiedBuffer* reference, bool host, void* stream = nullptr)
|
||||
{
|
||||
int device = cudaCpuDeviceId;
|
||||
if (!host) cudaGetDevice(&device);
|
||||
return create(size, reference, device, (cudaStream_t)stream);
|
||||
}
|
||||
|
||||
/// @brief Free all memory and reset this instance to empty
|
||||
void clear()
|
||||
{
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
mPtr = nullptr;
|
||||
mSize = mCapacity = 0;
|
||||
}
|
||||
|
||||
/// @brief Disallow copy assignment operation
|
||||
UnifiedBuffer& operator=(const UnifiedBuffer&) = delete;
|
||||
|
||||
/// @brief Allow move assignment operation
|
||||
UnifiedBuffer& operator=(UnifiedBuffer&& other)
|
||||
{
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
mPtr = other.mPtr;
|
||||
mSize = other.mSize;
|
||||
mCapacity = other.mCapacity;
|
||||
other.mPtr = nullptr;
|
||||
other.mSize = other.mCapacity = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// @brief initialize buffer as a new with the specified size and capacity
|
||||
/// @param size size of memory block to be used in bytes
|
||||
/// @param capacity size of page table in bytes
|
||||
void init(size_t size, size_t capacity)
|
||||
{
|
||||
NANOVDB_ASSERT(size <= capacity);
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
mSize = size;
|
||||
mCapacity = capacity;
|
||||
cudaCheck(cudaMallocManaged(&mPtr, capacity, cudaMemAttachGlobal));
|
||||
}
|
||||
|
||||
/// @brief Resize the memory block managed by this buffer. If the current capacity is larger than the new size this method
|
||||
/// simply redefines size. Otherwise a new page-table is defined, with the specified advice, and the old block is copied to the new block.
|
||||
/// @param size size of the new memory block
|
||||
/// @param dev the device ID on which to apply each advice provided in list, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param list advices to be applied to the resized range
|
||||
void resize(size_t size, int dev = cudaCpuDeviceId, std::initializer_list<cudaMemoryAdvise> list = {cudaMemAdviseSetPreferredLocation})
|
||||
{
|
||||
if (size <= mCapacity) {
|
||||
mSize = size;
|
||||
} else {
|
||||
void *ptr = 0;
|
||||
cudaCheck(cudaMallocManaged(&ptr, size, cudaMemAttachGlobal));
|
||||
if (dev > -2) for (auto a : list) cudaCheck(util::cuda::memAdvise(ptr, size, a, dev));
|
||||
if (mSize > 0) {// copy over data from the old memory block
|
||||
cudaCheck(cudaMemcpy(ptr, mPtr, std::min(mSize, size), cudaMemcpyDefault));
|
||||
cudaCheck(cudaFree(mPtr));
|
||||
}
|
||||
mPtr = ptr;
|
||||
mSize = mCapacity = size;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Apply a single advise to a memory block
|
||||
/// @param byteOffset offset in bytes marking the beginning of the memory block to be advised
|
||||
/// @param size size in bytes of the memory block to be advised.
|
||||
/// @param dev the device ID on which to apply the advice provided in adv, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param adv advice to be applied to the resized range
|
||||
void advise(ptrdiff_t byteOffset, size_t size, int dev, cudaMemoryAdvise adv) const
|
||||
{
|
||||
cudaCheck(util::cuda::memAdvise(util::PtrAdd(mPtr, byteOffset), size, adv, dev));
|
||||
}
|
||||
|
||||
/// @brief Apply a list of advices to a memory block
|
||||
/// @param byteOffset offset in bytes marking the beginning of the memory block to be advised
|
||||
/// @param size size in bytes of the memory block to be advised.
|
||||
/// @param dev the device ID to prefetch to, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param list list of cuda advises
|
||||
void advise(ptrdiff_t byteOffset, size_t size, int dev, std::initializer_list<cudaMemoryAdvise> list) const
|
||||
{
|
||||
void *ptr = util::PtrAdd(mPtr, byteOffset);
|
||||
for (auto a : list) cudaCheck(util::cuda::memAdvise(ptr, size, a, dev));
|
||||
}
|
||||
|
||||
/// @brief Prefetches data to the specified device, i.e. ensure the device has an up-to-date copy of the memory specified
|
||||
/// @param byteOffset offset in bytes marking the beginning of the memory block to be prefetched
|
||||
/// @param size size in bytes of the memory block to be prefetched. The default value of zero means copy all @c this->size() bytes.
|
||||
/// @param dev the device ID to prefetch to, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param stream cuda stream
|
||||
void prefetch(ptrdiff_t byteOffset = 0, size_t size = 0, int dev = cudaCpuDeviceId, cudaStream_t stream = cudaStreamPerThread) const
|
||||
{
|
||||
cudaCheck(util::cuda::memPrefetchAsync(util::PtrAdd(mPtr, byteOffset), size ? size : mSize, dev, stream));
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Prefetches all data to the specified device
|
||||
/// @param device device ID, cudaCpuDeviceId = -1, 0, 1, ...
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
/// @note Legacy method included for compatibility with DeviceBuffer
|
||||
void deviceUpload(int device = 0, cudaStream_t stream = cudaStreamPerThread, bool sync = false) const
|
||||
{
|
||||
cudaCheck(util::cuda::memPrefetchAsync(mPtr, mSize, device, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
}
|
||||
void deviceUpload(int device, void* stream, bool sync) const{this->deviceUpload(device, cudaStream_t(stream));}
|
||||
|
||||
/// @brief Prefetches all data to the current device, as given by cudaGetDevice
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
/// @note Legacy method included for compatibility with DeviceBuffer
|
||||
void deviceUpload(void* stream, bool sync) const{
|
||||
int device = 0;
|
||||
cudaCheck(cudaGetDevice(&device));
|
||||
this->deviceUpload(device, cudaStream_t(stream), sync);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Prefetches all data to the host
|
||||
/// @param stream cuda stream
|
||||
/// @param sync if false the memory copy is asynchronous
|
||||
void deviceDownload(cudaStream_t stream = 0, bool sync = false) const
|
||||
{
|
||||
cudaCheck(util::cuda::memPrefetchAsync(mPtr, mSize, cudaCpuDeviceId, stream));
|
||||
if (sync) cudaCheck(cudaStreamSynchronize(stream));
|
||||
}
|
||||
|
||||
/// @brief Legacy
|
||||
/// @param stream
|
||||
/// @param sync
|
||||
void deviceDownload(void* stream, bool sync) const{this->deviceDownload(cudaStream_t(stream), sync);}
|
||||
|
||||
// used by GridHandle
|
||||
void deviceDownload(int dummmy, void* stream, bool sync) const{this->deviceDownload(cudaStream_t(stream), sync);}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @brief Returns a raw pointer to the unified memory managed by this instance.
|
||||
/// @warning Note that the pointer can be NULL!
|
||||
void* data() const {return mPtr;}
|
||||
|
||||
/// @brief Returns an offset pointer of a specific type from the allocated unified memory
|
||||
/// @tparam T Type of the pointer returned
|
||||
/// @param count Numbers of elements of @c parameter type T to skip (or offset) the return pointer
|
||||
/// @warning assumes that this instance is not empty!
|
||||
template <typename T>
|
||||
T* data(ptrdiff_t count = 0) const {
|
||||
NANOVDB_ASSERT(mPtr != nullptr || count == 0);
|
||||
return reinterpret_cast<T*>(mPtr) + count;
|
||||
}
|
||||
|
||||
/// @brief Returns a byte offset void pointer from the unified memory
|
||||
/// @param byteOffset Number of bytes to skip (or offset) the return pointer
|
||||
/// @warning assumes that this instance is not empty!
|
||||
void* data(ptrdiff_t byteOffset) const {
|
||||
NANOVDB_ASSERT(mPtr != nullptr || byteOffset == 0);
|
||||
return util::PtrAdd(mPtr, byteOffset);
|
||||
}
|
||||
|
||||
/// @brief Legacy
|
||||
/// @return
|
||||
void* deviceData() const {return mPtr;}
|
||||
void* deviceData(int) const {return mPtr;}
|
||||
|
||||
/// @brief Size of the allocated pages in this instance
|
||||
/// @return number bytes allocated by this instance
|
||||
size_t size() const {return mSize;}
|
||||
|
||||
/// @brief Capacity of this instance, i.e. room in page table
|
||||
/// @return number of bytes reserved, but not necessarily allocated, by this instance
|
||||
size_t capacity() const {return mCapacity;}
|
||||
|
||||
//@{
|
||||
/// @brief Returns true if this allocator is empty, i.e. has no allocated memory
|
||||
inline bool empty() const { return mPtr == nullptr; }
|
||||
inline bool isEmpty() const { return this->empty(); }
|
||||
//@}
|
||||
|
||||
};// UnifiedBuffer
|
||||
|
||||
}// namespace cuda
|
||||
|
||||
template<>
|
||||
struct BufferTraits<cuda::UnifiedBuffer>
|
||||
{
|
||||
static constexpr bool hasDeviceDual = true;
|
||||
};
|
||||
|
||||
}// namespace nanovdb
|
||||
|
||||
#endif // end of NANOVDB_CUDA_UNIFIEDBUFFER_H_HAS_BEEN_INCLUDED
|
||||
@@ -1,5 +1,3 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# find_package(doxygen REQUIRED dot )
|
||||
if(WIN32)
|
||||
set(DOXYGEN_EXECUTABLE "C:/Program Files/doxygen/bin/doxygen.exe")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
project(NanoVDBExamples LANGUAGES CXX)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
@@ -78,17 +78,16 @@ function(NANOVDB_EXAMPLE)
|
||||
target_include_directories(${EXAMPLE_NAME} PUBLIC ex_util)
|
||||
target_link_libraries(${EXAMPLE_NAME} PRIVATE nanovdb)
|
||||
|
||||
install(TARGETS ${EXAMPLE_NAME} DESTINATION ${NANOVDB_INSTALL_DOCDIR}/examples)
|
||||
install(TARGETS ${EXAMPLE_NAME} DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples)
|
||||
endfunction()
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
#if(NANOVDB_BUILD_BENCHMARK)
|
||||
# add_subdirectory(benchmark)
|
||||
#endif()
|
||||
if(NANOVDB_BUILD_BENCHMARK)
|
||||
add_subdirectory(benchmark)
|
||||
endif()
|
||||
|
||||
nanovdb_example(NAME "ex_make_custom_nanovdb")
|
||||
nanovdb_example(NAME "ex_make_custom_nanovdb_cuda")
|
||||
nanovdb_example(NAME "ex_make_funny_nanovdb")
|
||||
nanovdb_example(NAME "ex_make_typed_grids")
|
||||
nanovdb_example(NAME "ex_make_nanovdb_sphere")
|
||||
@@ -99,25 +98,12 @@ nanovdb_example(NAME "ex_openvdb_to_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_read_nanovdb_sphere")
|
||||
nanovdb_example(NAME "ex_read_nanovdb_sphere_accessor")
|
||||
nanovdb_example(NAME "ex_read_nanovdb_sphere_accessor_cuda")
|
||||
nanovdb_example(NAME "ex_index_grid_cuda")
|
||||
nanovdb_example(NAME "ex_nodemanager_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_voxels_to_grid_cuda")
|
||||
nanovdb_example(NAME "ex_voxels_to_grid_mgpu")
|
||||
nanovdb_example(NAME "ex_modify_nanovdb_thrust")
|
||||
nanovdb_example(NAME "ex_map_pool_buffer")
|
||||
nanovdb_example(NAME "ex_bump_pool_buffer")
|
||||
nanovdb_example(NAME "ex_collide_level_set")
|
||||
nanovdb_example(NAME "ex_raytrace_fog_volume")
|
||||
nanovdb_example(NAME "ex_raytrace_level_set")
|
||||
nanovdb_example(NAME "ex_dilate_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_merge_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_refine_nanovdb_cuda" OPENVDB)
|
||||
nanovdb_example(NAME "ex_coarsen_nanovdb_cuda" OPENVDB)
|
||||
|
||||
if(CUDAToolkit_FOUND)
|
||||
nanovdb_example(NAME "ex_make_mgpu_nanovdb") # requires cuRAND
|
||||
target_link_libraries(ex_make_mgpu_nanovdb PRIVATE CUDA::curand)
|
||||
endif()
|
||||
|
||||
if(NANOVDB_USE_MAGICAVOXEL)
|
||||
nanovdb_example(NAME "ex_vox_to_nanovdb")
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
/// @file BenchKernels_dense.cu
|
||||
///
|
||||
/// @author Ken Museth
|
||||
///
|
||||
/// @brief CUDA kernel for a simple ray-tracing benchmark test.
|
||||
|
||||
#include "DenseGrid.h"
|
||||
#include <nanovdb/util/CudaDeviceBuffer.h> // for CUDA memory management
|
||||
#include <nanovdb/util/Ray.h> // for nanovdb::Ray
|
||||
#include <nanovdb/util/HDDA.h> // for nanovdb::DDA
|
||||
|
||||
#include "Image.h"
|
||||
#include "Camera.h"
|
||||
|
||||
// Comment out to disable timing of the CUDA kernel
|
||||
#define CUDA_TIMING
|
||||
|
||||
// This is called by the device
|
||||
__global__ void render_kernel(const nanovdb::DenseGrid<float>& grid,
|
||||
const nanovdb::Camera<float>& camera,
|
||||
nanovdb::Image& img)
|
||||
{
|
||||
using RealT = float;
|
||||
using Vec3T = nanovdb::Vec3<RealT>;
|
||||
using CoordT = nanovdb::Coord;
|
||||
using RayT = nanovdb::Ray<RealT>;
|
||||
using ColorRGB = nanovdb::Image::ColorRGB;
|
||||
|
||||
const int w = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
const int h = blockIdx.y * blockDim.y + threadIdx.y;
|
||||
if (w >= img.width() || h >= img.height()) return;
|
||||
RayT ray = camera.getRay(img.u(w), img.v(h));// ray in world space
|
||||
ray = ray.worldToIndexF(grid);// ray in index space
|
||||
if (ray.clip(grid.indexBBox().expandBy(-1))) {// clip to the index bounding box
|
||||
nanovdb::DDA<RayT> dda(ray);
|
||||
const float v0 = grid.getValue(dda.voxel());
|
||||
while( dda.step() ) {
|
||||
CoordT ijk = dda.voxel();
|
||||
const float v1 = grid.getValue(ijk);
|
||||
if (v0*v1>0) continue;
|
||||
#if 1// second-order central difference
|
||||
Vec3T grad(grid.getValue(ijk.offsetBy(1,0,0)) - grid.getValue(ijk.offsetBy(-1,0,0)),
|
||||
grid.getValue(ijk.offsetBy(0,1,0)) - grid.getValue(ijk.offsetBy(0,-1,0)),
|
||||
grid.getValue(ijk.offsetBy(0,0,1)) - grid.getValue(ijk.offsetBy(0,0,-1)));
|
||||
#else// first order single-sided difference
|
||||
Vec3T grad(-v0);
|
||||
ijk[0] += 1;
|
||||
grad[0] += grid.getValue(ijk);
|
||||
ijk[0] -= 1;
|
||||
ijk[1] += 1;
|
||||
grad[1] += grid.getValue(ijk);
|
||||
ijk[1] -= 1;
|
||||
ijk[2] += 1;
|
||||
grad[2] += grid.getValue(ijk);
|
||||
#endif
|
||||
grad *= rnorm3df(grad[0], grad[1], grad[2]);
|
||||
img(w, h) = ColorRGB(abs(grad.dot(ray.dir())), 0, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
const int checkerboard = 1 << 7;
|
||||
img(w, h) = ((h & checkerboard) ^ (w & checkerboard)) ? ColorRGB(1, 1, 1) : ColorRGB(0, 0, 0);
|
||||
}
|
||||
|
||||
// This is called by the host
|
||||
extern "C" float launch_kernels(const nanovdb::DenseGridHandle<nanovdb::CudaDeviceBuffer>& gridHandle,
|
||||
nanovdb::ImageHandle<nanovdb::CudaDeviceBuffer>& imgHandle,
|
||||
const nanovdb::Camera<float>* camera,
|
||||
cudaStream_t stream)
|
||||
{
|
||||
const auto* img = imgHandle.image(); // host image!
|
||||
auto round = [](int a, int b) { return (a + b - 1) / b; };
|
||||
const dim3 threadsPerBlock(8, 8), numBlocks(round(img->width(), threadsPerBlock.x), round(img->height(), threadsPerBlock.y));
|
||||
auto* deviceGrid = gridHandle.deviceGrid<float>(); // note this cannot be de-referenced since it points to a memory address on the GPU!
|
||||
auto* deviceImage = imgHandle.deviceImage(); // note this cannot be de-referenced since it points to a memory address on the GPU!
|
||||
assert(deviceGrid && deviceImage);
|
||||
|
||||
#ifdef CUDA_TIMING
|
||||
cudaEvent_t start, stop;
|
||||
cudaEventCreate(&start);
|
||||
cudaEventCreate(&stop);
|
||||
cudaEventRecord(start, stream);
|
||||
#endif
|
||||
|
||||
// kernal syntax: <<<blocks per grid, threads per block, dynamic shared memory per block, stream >>>
|
||||
render_kernel<<<numBlocks, threadsPerBlock, 0, stream>>>(*deviceGrid, *camera, *deviceImage);
|
||||
|
||||
float elapsedTime = 0.0f;
|
||||
#ifdef CUDA_TIMING
|
||||
cudaEventRecord(stop, stream);
|
||||
cudaEventSynchronize(stop);
|
||||
|
||||
cudaEventElapsedTime(&elapsedTime, start, stop);
|
||||
//printf("DenseGrid: GPU kernel with %i rays ... completed in %5.3f milliseconds\n", imgHandle.image()->size(), elapsedTime);
|
||||
cudaError_t errCode = cudaGetLastError();
|
||||
if (errCode != cudaSuccess) {
|
||||
fprintf(stderr, "CUDA Runtime Error: %s %s %d\n", cudaGetErrorString(errCode), __FILE__, __LINE__);
|
||||
exit(errCode);
|
||||
}
|
||||
cudaEventDestroy(start);
|
||||
cudaEventDestroy(stop);
|
||||
#endif
|
||||
return elapsedTime;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user