|
| 1 | +Minutes from OpenVDB TSC meeting, March 25th, 2026, (EDT) |
| 2 | + |
| 3 | +Attendees: *Jeff* L., *Nick* A., *Dan* B., *Andre* P. |
| 4 | + |
| 5 | +Additional Attendees: N/A |
| 6 | + |
| 7 | +Regrets: *Ken* M. |
| 8 | + |
| 9 | +Agenda: |
| 10 | + |
| 11 | +1) Confirm quorum |
| 12 | +2) Secretary |
| 13 | +3) Website & File Caches |
| 14 | +4) DCO/CLA PR Policy |
| 15 | +5) I/O Rewrite: PR Walkthrough |
| 16 | +6) Next meeting |
| 17 | + |
| 18 | +-------------------- |
| 19 | + |
| 20 | +1) Confirm quorum |
| 21 | + |
| 22 | +Quorum is present (four of seven TSC members). |
| 23 | + |
| 24 | +2) Secretary |
| 25 | + |
| 26 | +Secretary was Dan Bailey. |
| 27 | + |
| 28 | +3) Website & File Caches |
| 29 | + |
| 30 | +Dan confirmed that old VDB sample file caches have been migrated to |
| 31 | +GitLab LFS under the website repository; all links updated, files are |
| 32 | +at format version 223. Nick to close related open issues. |
| 33 | + |
| 34 | +A known issue remains: two Doxygen HTML outputs share the same filename |
| 35 | +under different capitalizations (NanoVDB IO.h vs OpenVDB IO.h), causing |
| 36 | +conflicts on case-insensitive filesystems (Windows, and to a lesser |
| 37 | +extent macOS). Website repository changes currently require a Linux |
| 38 | +machine to avoid this problem. |
| 39 | + |
| 40 | +4) DCO/CLA PR Policy |
| 41 | + |
| 42 | +Several open PRs are missing DCO sign-off or a signed CLA, making them |
| 43 | +un-mergeable. Agreed approach: |
| 44 | + |
| 45 | +- Dan to post comments on all affected PRs giving contributors one week |
| 46 | + to resolve sign-off; PRs that remain unaddressed will be closed with |
| 47 | + an invitation to reopen once the requirements are met. |
| 48 | +- Dan to add an explicit policy statement to the contribution |
| 49 | + guidelines so contributors are aware of this policy up front. |
| 50 | + |
| 51 | +5) I/O Rewrite: PR Walkthrough |
| 52 | + |
| 53 | +Dan shared his screen and walked through a series of PRs on the |
| 54 | +io_point_codecs feature branch. Dan noted these have been broken into |
| 55 | +small reviewable pieces; feedback on each is welcome before they are |
| 56 | +merged. |
| 57 | + |
| 58 | +a) Test CMakeLists: wildcard removal |
| 59 | + |
| 60 | +Removed the implicit wildcard appended to test-name filters in CMake so |
| 61 | +that passing "tree" no longer also runs unrelated tests prefixed with |
| 62 | +"tree". Callers can restore the old behavior with an explicit glob |
| 63 | +pattern (e.g., "tree*"). Jeff and Nick approved. |
| 64 | + |
| 65 | +b) Unit test: stderr suppression |
| 66 | + |
| 67 | +Redirected stderr around a section of unit tests that intentionally |
| 68 | +invokes an API path expected to emit a warning, to reduce noise when |
| 69 | +running with GTEST_BRIEF. Jeff raised the concern that silencing output |
| 70 | +may mask future unexpected warnings. Nick noted that in this specific |
| 71 | +case the warning is the correct behavior of the API under test. Jeff |
| 72 | +approved. |
| 73 | + |
| 74 | +c) TreeBase: readTopology / writeTopology made pure virtual |
| 75 | + |
| 76 | +Moved legacy buffer-count read/write (a pre-open-source 32-bit integer |
| 77 | +always valued 1) from TreeBase into the Tree derived class, and made the |
| 78 | +virtual methods pure virtual on TreeBase. ABI is unchanged (vtable slot |
| 79 | +preserved). This is technically a breaking change for anyone subclassing |
| 80 | +TreeBase directly; judged to be extremely rare. Nick to verify there is |
| 81 | +no impact on a streaming VDB implementation at Weta. |
| 82 | + |
| 83 | +d) PointDataIO.H — new header, multi-pass restriction, |
| 84 | + out-of-core atomic removal |
| 85 | + |
| 86 | +Three changes bundled together: |
| 87 | + |
| 88 | +- New PointDataIO.H header isolates readCompressedValues for |
| 89 | + PointDataIndex32, removing the dependency on the full PointDataGrid |
| 90 | + header for I/O code. |
| 91 | +- Multi-pass I/O restricted to PointDataLeaf only via a static_assert |
| 92 | + type-trait; the generic multi-pass unit test is removed. This |
| 93 | + simplifies codec implementation for all non-point tree types. |
| 94 | + Nick suggested renaming the multi-pass tag class to be more |
| 95 | + explicitly PointData-specific, or moving it into PointDataIO.H, so |
| 96 | + that the restriction is obvious at the point of use; Dan agreed to |
| 97 | + investigate. |
| 98 | +- Out-of-core atomic removed from AttributeArray read/write paths in |
| 99 | + this branch (delayed loading not supported); removal guarded by an |
| 100 | + ABI_14 macro for eventual full removal in the next ABI version. |
| 101 | + |
| 102 | +e) Large I/O refactoring (Archive / File / Stream) |
| 103 | + |
| 104 | +A significant refactoring pass to consolidate grid I/O: |
| 105 | + |
| 106 | +- All grid-level I/O now flows through two methods — archiveReadGrid |
| 107 | + and archiveWriteGrid — eliminating several scattered grid creation |
| 108 | + sites; grid objects are now created in a single location inside |
| 109 | + readGrid. |
| 110 | +- Pimpl pattern removed from File and Stream; data members inlined. |
| 111 | + Jeff flagged a potential header-bloat concern; Dan confirmed no new |
| 112 | + includes were required. The pimpl was likely introduced for |
| 113 | + delayed-loading and Boost isolation reasons; no longer warranted. |
| 114 | + Nick noted symbol visibility as an additional historical motivation |
| 115 | + but agreed removal is acceptable here. |
| 116 | +- GridDescriptor::read() deprecated (not removed); it created a grid |
| 117 | + object that callers never used. readHeader and readStreamPosition |
| 118 | + introduced as explicit replacements. Nick confirmed that Weta uses |
| 119 | + the stream-level API, not the GridDescriptor API directly. |
| 120 | +- readGridPartial read-topology flag removed (always called with |
| 121 | + false in practice); partial-read folded into readGrid as a boolean |
| 122 | + argument. |
| 123 | +- World-space bounding box conversion to index-space deferred until |
| 124 | + the last moment inside readGrid, eliminating the intermediate local |
| 125 | + readBuffers struct and simplifying the call path. |
| 126 | + |
| 127 | +Nick and Jeff approved with the suggestions above incorporated. |
| 128 | + |
| 129 | +f) ReadOptions / WriteOptions API |
| 130 | + |
| 131 | +ReadOptions and WriteOptions objects are now passed uniformly to all I/O |
| 132 | +API entry points. |
| 133 | + |
| 134 | +- ReadOptions currently holds: world-space clip bounding box and |
| 135 | + topology-only read mode (matching the two options previously passed |
| 136 | + as separate arguments). |
| 137 | +- WriteOptions currently empty; reserved for future extension. |
| 138 | +- All public API methods default-construct these objects; internal |
| 139 | + methods do not. |
| 140 | + |
| 141 | +Feedback: |
| 142 | + |
| 143 | +- Jeff: C++20 aggregate (named) brace initialization would give |
| 144 | + keyword-argument ergonomics; Dan to verify and document once VDB |
| 145 | + requires C++20. |
| 146 | +- Nick: virtual destructor on the structs should be removed if nothing |
| 147 | + derives from them; Dan to confirm ReadOptions is not subclassed |
| 148 | + (per-codec options use a separate typed-options map). |
| 149 | +- Nick / Andre: shared_ptr typedefs should be removed if unused; prefer |
| 150 | + unique_ptr or no typedef. Shared-ptr usage likely a legacy of the |
| 151 | + pimpl pattern now removed; agreed to clean up. |
| 152 | + |
| 153 | +g) Codec framework — IOCodec, TopologyCodec, BoolCodec, registry |
| 154 | + |
| 155 | +New framework for pluggable grid I/O codecs: |
| 156 | + |
| 157 | +- IOCodec base class exposes: readTopology, writeTopology, readBuffers, |
| 158 | + writeBuffers, and createData (pure virtual). |
| 159 | +- TopologyCodec intermediate class implements standard depth-first tree |
| 160 | + topology read/write; multiple variants are planned for different |
| 161 | + compression schemes. Jeff clarified the hierarchy: codecs that need |
| 162 | + a specific topology compression derive from the appropriate |
| 163 | + TopologyCodec variant and only implement buffer methods; fully custom |
| 164 | + codecs (e.g., a neural codec) derive directly from IOCodec. |
| 165 | +- BoolCodec is the first concrete codec, deriving from TopologyCodec |
| 166 | + and overriding the buffer methods. |
| 167 | +- Codec registry mirrors the GridRegistry and MetaMap patterns; the |
| 168 | + codec is looked up by grid-type string inside archiveReadGrid and |
| 169 | + falls back to existing behavior when no codec is registered. |
| 170 | +- createData hook on the codec allows it to return a different grid type |
| 171 | + than the one it is registered under (e.g., reading a float grid as a |
| 172 | + half grid). |
| 173 | +- Per-codec options: ReadOptions contains a std::map<string, |
| 174 | + TypedOptions> for type-specific settings (e.g., filtering VDB Points |
| 175 | + attributes by name). Jeff suggested using each codec's globally-unique |
| 176 | + identifier string as a key prefix to avoid collisions; Dan agreed and |
| 177 | + will document the convention. |
| 178 | +- Error / warning reporting: currently throws on the first error. Jeff |
| 179 | + requested a mechanism for non-fatal warnings (e.g., a partial read |
| 180 | + silently loading the full grid because the codec does not support |
| 181 | + clipping); Dan to design a message list with string + severity-level |
| 182 | + fields, keeping hard errors as exceptions. |
| 183 | + |
| 184 | +Dan noted the branch is still in progress; once these foundational PRs |
| 185 | +are merged, additional codecs (scalar, point-data, etc.) will follow. |
| 186 | + |
| 187 | +6) Next meeting |
| 188 | + |
| 189 | +April 8th, 2026, usual time. |
0 commit comments