GCC Code Coverage Report


Directory: ./
File: openvdb_ax/openvdb_ax/codegen/VolumeFunctions.cc
Date: 2022-07-25 17:40:05
Exec Total Coverage
Lines: 328 372 88.2%
Functions: 81 104 77.9%
Branches: 305 712 42.8%

Line Branch Exec Source
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3
4 /// @file codegen/VolumeFunctions.cc
5 ///
6 /// @authors Nick Avramoussis, Richard Jones
7 ///
8 /// @brief Contains the function objects that define the functions used in
9 /// volume compute function generation, to be inserted into the FunctionRegistry.
10 /// These define the functions available when operating on volumes.
11 /// Also includes the definitions for the volume value retrieval and setting.
12 ///
13
14 #include "Functions.h"
15 #include "FunctionTypes.h"
16 #include "Types.h"
17 #include "Utils.h"
18
19 #include "openvdb_ax/compiler/CompilerOptions.h"
20 #include "openvdb_ax/Exceptions.h"
21
22 #include <openvdb/version.h>
23
24 #include <unordered_map>
25 #include <cstdlib>
26 #include <cstring>
27
28 namespace openvdb {
29 OPENVDB_USE_VERSION_NAMESPACE
30 namespace OPENVDB_VERSION_NAME {
31
32 namespace ax {
33 namespace codegen {
34
35
36 namespace {
37
38 #define OPENVDB_AX_CHECK_MODULE_CONTEXT(B) \
39 { \
40 const llvm::Function* F = B.GetInsertBlock()->getParent(); \
41 const llvm::Module* M = F ? F->getParent() : nullptr; \
42 if (!M || M->getName() != "ax.volume.module") { \
43 OPENVDB_THROW(AXCompilerError, "Function \"" << (F ? F->getName().str() : "unknown") << \
44 "\" cannot be called for the current target:\"" << (M ? M->getName().str() : "unknown") << \
45 "\". This function only runs on OpenVDB Grids (not OpenVDB Point Grids)."); \
46 } \
47 }
48
49 }
50
51 2 inline FunctionGroup::UniquePtr axcoordtooffset(const FunctionOptions& op)
52 {
53 using LeafNodeT = openvdb::BoolGrid::TreeType::LeafNodeType;
54
55 /// @warning This function assumes that the node in question is a LeafNode!
56 /// This means that the result of this method is ONLY correct if the
57 /// origin points to an existing leaf node, OR if the offset is zero.
58 /// Currently the VolumeExectuable processes non-leaf nodes (active tiles)
59 /// individually, so the offset for these nodes is always zero. Should
60 /// we need to processes a non-leaf node with a non-zero offset, this
61 /// function should be extended to take a "level" param from the parent
62 /// which identifies the node level and can thus be used to call the
63 /// appropriate offset logic.
64
65 static auto generate = [](const std::vector<llvm::Value*>& args,
66 llvm::IRBuilder<>& B) -> llvm::Value*
67 {
68 assert(args.size() == 1);
69 OPENVDB_AX_CHECK_MODULE_CONTEXT(B);
70 llvm::Value* x = B.CreateConstGEP2_64(args[0], 0, 0);
71 llvm::Value* y = B.CreateConstGEP2_64(args[0], 0, 1);
72 llvm::Value* z = B.CreateConstGEP2_64(args[0], 0, 2);
73 llvm::Value* dimmin1 = LLVMType<int32_t>::get(B.getContext(), int32_t(LeafNodeT::DIM-1u));
74 llvm::Value* l2d2 = LLVMType<int32_t>::get(B.getContext(), int32_t(2*LeafNodeT::LOG2DIM));
75 llvm::Value* l2d = LLVMType<int32_t>::get(B.getContext(), int32_t(LeafNodeT::LOG2DIM));
76
77 // ((xyz[0] & (DIM-1u)) << 2*Log2Dim)
78 x = B.CreateLoad(x);
79 x = binaryOperator(x, dimmin1, ast::tokens::BITAND, B);
80 x = binaryOperator(x, l2d2, ast::tokens::SHIFTLEFT, B);
81
82 // ((xyz[1] & (DIM-1u)) << Log2Dim)
83 y = B.CreateLoad(y);
84 y = binaryOperator(y, dimmin1, ast::tokens::BITAND, B);
85 y = binaryOperator(y, l2d, ast::tokens::SHIFTLEFT, B);
86
87 // (xyz[2] & (DIM-1u))
88 z = B.CreateLoad(z);
89 z = binaryOperator(z, dimmin1, ast::tokens::BITAND, B);
90
91 return
92 binaryOperator(z,
93 binaryOperator(x, y, ast::tokens::PLUS, B),
94 ast::tokens::PLUS, B);
95 };
96
97 static auto coordtooffset =
98 [](const openvdb::math::Vec3<int32_t>* iscoord)
99 {
100 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(iscoord);
101 return int32_t(LeafNodeT::coordToOffset(*ijk));
102 };
103
104 2 return FunctionBuilder("coordtooffset")
105 .addSignature<int32_t(const openvdb::math::Vec3<int32_t>*)>(generate,
106 4 (int32_t(*)(const openvdb::math::Vec3<int32_t>*))(coordtooffset))
107
3/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
4 .setArgumentNames({"coord"})
108
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 .addFunctionAttribute(llvm::Attribute::ReadOnly)
109
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 .addFunctionAttribute(llvm::Attribute::NoRecurse)
110
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 .addFunctionAttribute(llvm::Attribute::NoUnwind)
111 2 .addFunctionAttribute(llvm::Attribute::AlwaysInline)
112
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 .setConstantFold(op.mConstantFoldCBindings)
113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
114 .setDocumentation("Return the linear table offset of the given global or local coordinates.")
115
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 .get();
116 }
117
118 14 inline FunctionGroup::UniquePtr axoffsettocoord(const FunctionOptions& op)
119 {
120 using LeafNodeT = openvdb::BoolGrid::TreeType::LeafNodeType;
121
122 /// @warning This function assumes that the node in question is a LeafNode!
123 /// This means that the result of this method is ONLY correct if the
124 /// origin points to an existing leaf node, OR if the offset is zero.
125 /// Currently the VolumeExectuable processes non-leaf nodes (active tiles)
126 /// individually, so the offset for these nodes is always zero. Should
127 /// we need to processes a non-leaf node with a non-zero offset, this
128 /// function should be extended to take a "level" param from the parent
129 /// which identifies the node level and can thus be used to call the
130 /// appropriate offset logic.
131
132
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 static auto generate = [](const std::vector<llvm::Value*>& args,
133 llvm::IRBuilder<>& B) -> llvm::Value*
134 {
135
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 assert(args.size() == 2);
136
3/24
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
12 OPENVDB_AX_CHECK_MODULE_CONTEXT(B);
137
138 12 llvm::Value* ijk = args[0];
139 12 llvm::Value* offset = args[1];
140
141 12 llvm::Value* l2d2 = LLVMType<int32_t>::get(B.getContext(), int32_t(2*LeafNodeT::LOG2DIM));
142 12 llvm::Value* l2d = LLVMType<int32_t>::get(B.getContext(), int32_t(LeafNodeT::LOG2DIM));
143
144 // (offset >> 2*Log2Dim)
145 12 llvm::Value* x = binaryOperator(offset, l2d2, ast::tokens::SHIFTRIGHT, B);
146 24 B.CreateStore(x, B.CreateConstGEP2_64(ijk, 0, 0));
147
148 // (offset &= ((1<<2*Log2Dim)-1))
149 static constexpr int32_t ymask = ((1<<2*LeafNodeT::LOG2DIM)-1);
150 12 offset = binaryOperator(offset, B.getInt32(ymask), ast::tokens::BITAND, B);
151
152 // (n >> Log2Dim)
153 12 llvm::Value* y = binaryOperator(offset, l2d, ast::tokens::SHIFTRIGHT, B);
154 24 B.CreateStore(y, B.CreateConstGEP2_64(ijk, 0, 1));
155
156 // (n & ((1<<Log2Dim)-1))
157 static constexpr int32_t zmask = ((1<<LeafNodeT::LOG2DIM)-1);
158 12 llvm::Value* z = binaryOperator(offset, B.getInt32(zmask), ast::tokens::BITAND, B);
159 24 B.CreateStore(z, B.CreateConstGEP2_64(ijk, 0, 2));
160 12 return nullptr;
161 };
162
163 static auto offsetToCoord =
164 [](openvdb::math::Vec3<int32_t>* out, const int32_t offset)
165 {
166 *out = LeafNodeT::offsetToLocalCoord(offset).asVec3i();
167 };
168
169 using OffsetToCoordT = void(openvdb::math::Vec3<int32_t>*, const int32_t);
170
171 14 return FunctionBuilder("offsettocoord")
172 28 .addSignature<OffsetToCoordT, true>(generate, (OffsetToCoordT*)(offsetToCoord))
173
3/8
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 14 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
28 .setArgumentNames({"offset"})
174
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 .addParameterAttribute(0, llvm::Attribute::NoAlias)
175
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 .addParameterAttribute(0, llvm::Attribute::WriteOnly)
176
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 .addParameterAttribute(0, llvm::Attribute::NoCapture)
177
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 .addFunctionAttribute(llvm::Attribute::NoUnwind)
178
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 .addFunctionAttribute(llvm::Attribute::NoRecurse)
179 14 .addFunctionAttribute(llvm::Attribute::AlwaysInline)
180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 .setConstantFold(op.mConstantFoldCBindings)
181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
182 .setDocumentation("")
183
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
28 .get();
184 }
185
186 20 inline FunctionGroup::UniquePtr axoffsettoglobalcoord(const FunctionOptions& op)
187 {
188 using LeafNodeT = openvdb::BoolGrid::TreeType::LeafNodeType;
189
190 /// @warning This function assumes that the node in question is a LeafNode!
191 /// This means that the result of this method is ONLY correct if the
192 /// origin points to an existing leaf node, OR if the offset is zero.
193 /// Currently the VolumeExectuable processes non-leaf nodes (active tiles)
194 /// individually, so the offset for these nodes is always zero. Should
195 /// we need to processes a non-leaf node with a non-zero offset, this
196 /// function should be extended to take a "level" param from the parent
197 /// which identifies the node level and can thus be used to call the
198 /// appropriate offset logic.
199
200
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 auto generate = [op](const std::vector<llvm::Value*>& args,
201 llvm::IRBuilder<>& B) -> llvm::Value*
202 {
203
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 assert(args.size() == 3);
204
3/24
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
12 OPENVDB_AX_CHECK_MODULE_CONTEXT(B);
205
206 12 llvm::Value* result = args[0];
207 12 llvm::Value* offset = args[1];
208 12 llvm::Value* origin = args[2];
209
210
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
24 llvm::Value* local = axoffsettocoord(op)->execute({offset}, B);
211
212
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 12 times.
48 for (size_t i = 0; i < 3; ++i){
213 36 llvm::Value* lx = B.CreateConstGEP2_64(local, 0, i);
214 36 llvm::Value* ox = B.CreateConstGEP2_64(origin, 0, i);
215 36 ox = binaryOperator(B.CreateLoad(ox), B.CreateLoad(lx), ast::tokens::PLUS, B);
216 72 B.CreateStore(ox, B.CreateConstGEP2_64(result, 0, i));
217 }
218
219 12 return nullptr;
220 20 };
221
222 static auto offsetToGlobalCoord =
223 [](openvdb::math::Vec3<int32_t>* out, const int32_t offset, const openvdb::math::Vec3<int32_t>* in)
224 {
225 auto coord = LeafNodeT::offsetToLocalCoord(offset);
226 out->x() = coord.x() + in->x();
227 out->y() = coord.y() + in->y();
228 out->z() = coord.z() + in->z();
229 };
230
231 using OffsetToGlobalCoordT = void(openvdb::math::Vec3<int32_t>*,const int32_t,const openvdb::math::Vec3<int32_t>*);
232
233 20 return FunctionBuilder("offsettoglobalcoord")
234 40 .addSignature<OffsetToGlobalCoordT, true>(generate, (OffsetToGlobalCoordT*)(offsetToGlobalCoord))
235
3/8
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 20 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
40 .setArgumentNames({"offset", "coord"})
236
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 .addParameterAttribute(0, llvm::Attribute::NoAlias)
237
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 .addParameterAttribute(0, llvm::Attribute::WriteOnly)
238
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 .addParameterAttribute(2, llvm::Attribute::NoAlias)
239
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 .addParameterAttribute(2, llvm::Attribute::ReadOnly)
240
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 .addFunctionAttribute(llvm::Attribute::NoUnwind)
241 20 .addFunctionAttribute(llvm::Attribute::AlwaysInline)
242
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
20 .setConstantFold(op.mConstantFoldCBindings)
243
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
20 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
244 .setDocumentation("")
245
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
40 .get();
246 }
247
248 7 inline FunctionGroup::UniquePtr axindextoworld(const FunctionOptions& op)
249 {
250 static auto indexToWorld =
251 2097665 [](openvdb::math::Vec3<double>* out,
252 const openvdb::math::Vec3<int32_t>* coord,
253 const void* transform)
254 {
255 const openvdb::math::Transform* const transformPtr =
256 static_cast<const openvdb::math::Transform*>(transform);
257 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(coord);
258 2097665 *out = transformPtr->indexToWorld(*ijk);
259 2097665 };
260
261 using IndexToWorldT = void(openvdb::math::Vec3<double>*, const openvdb::math::Vec3<int32_t>*, const void*);
262
263 7 return FunctionBuilder("indextoworld")
264
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 .addSignature<IndexToWorldT, true>((IndexToWorldT*)(indexToWorld))
265
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
14 .setArgumentNames({"coord", "transform"})
266
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 .addParameterAttribute(0, llvm::Attribute::NoAlias)
267
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 .addParameterAttribute(0, llvm::Attribute::WriteOnly)
268
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 .addParameterAttribute(1, llvm::Attribute::NoAlias)
269
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 .addParameterAttribute(1, llvm::Attribute::ReadOnly)
270
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 .addFunctionAttribute(llvm::Attribute::NoUnwind)
271
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 .addFunctionAttribute(llvm::Attribute::AlwaysInline)
272 .setConstantFold(false)
273
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
274 .setDocumentation("Converted the given index space coordiante to a world space value based on the currently executing volume.")
275
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
14 .get();
276 }
277
278 22 inline FunctionGroup::UniquePtr axgetcoord(const FunctionOptions& op)
279 {
280
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 auto generate = [op](const std::vector<llvm::Value*>&,
281 llvm::IRBuilder<>& B) -> llvm::Value*
282 {
283 // Pull out parent function arguments
284 llvm::Function* compute = B.GetInsertBlock()->getParent();
285
10/24
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✓ Branch 5 taken 4 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 23 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 4 times.
✗ Branch 28 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
46 OPENVDB_AX_CHECK_MODULE_CONTEXT(B);
286
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
14 llvm::Value* origin = extractArgument(compute, "origin");
287
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
14 llvm::Value* offset = extractArgument(compute, "offset");
288
2/4
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
28 return axoffsettoglobalcoord(op)->execute({offset, origin}, B);
289 22 };
290
291 22 return FunctionBuilder("getcoord")
292
1/2
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
44 .addSignature<openvdb::math::Vec3<int32_t>*()>(generate)
293 .setEmbedIR(true)
294 .setConstantFold(false)
295 22 .addDependency("offsettoglobalcoord")
296
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
297 .setDocumentation("Returns the current voxel's ijk index space coordiante.")
298
1/2
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
44 .get();
299 }
300
301 template <size_t Index>
302 30 inline FunctionGroup::UniquePtr axgetcoord(const FunctionOptions& op)
303 {
304 static_assert(Index <= 2, "Invalid index for axgetcoord");
305
306 44 auto generate = [op](const std::vector<llvm::Value*>&,
307 llvm::IRBuilder<>& B) -> llvm::Value*
308 {
309
6/6
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
✓ Branch 8 taken 3 times.
✓ Branch 9 taken 1 times.
✓ Branch 14 taken 6 times.
✓ Branch 15 taken 1 times.
28 llvm::Value* coord = axgetcoord(op)->execute({}, B);
310 22 return B.CreateLoad(B.CreateConstGEP2_64(coord, 0, Index));
311 };
312
313 return FunctionBuilder((Index == 0 ? "getcoordx" : Index == 1 ? "getcoordy" : "getcoordz"))
314 .addSignature<int32_t()>(generate)
315
1/2
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
60 .setEmbedIR(true)
316 .setConstantFold(false)
317 30 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
318
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
30 .addDependency("getcoord")
319
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
30 .setDocumentation((
320 Index == 0 ? "Returns the current voxel's X index value in index space as an integer." :
321 Index == 1 ? "Returns the current voxel's Y index value in index space as an integer." :
322 "Returns the current voxel's Z index value in index space as an integer."))
323
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
60 .get();
324 }
325
326 5 inline FunctionGroup::UniquePtr axgetvoxelpws(const FunctionOptions& op)
327 {
328
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 auto generate = [op](const std::vector<llvm::Value*>&,
329 llvm::IRBuilder<>& B) -> llvm::Value*
330 {
331
11/26
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
10 OPENVDB_AX_CHECK_MODULE_CONTEXT(B);
332 llvm::Function* compute = B.GetInsertBlock()->getParent();
333
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 llvm::Value* transform = extractArgument(compute, "transforms");
334
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 llvm::Value* wi = extractArgument(compute, "write_index");
335 2 transform = B.CreateGEP(transform, wi);
336 2 transform = B.CreateLoad(transform);
337
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 llvm::Value* coord = axgetcoord(op)->execute({}, B);
338
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
4 return axindextoworld(op)->execute({coord, transform}, B);
339 5 };
340
341 5 return FunctionBuilder("getvoxelpws")
342
1/2
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
10 .addSignature<openvdb::math::Vec3<double>*()>(generate)
343 .setEmbedIR(true)
344 .setConstantFold(false)
345
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 .addDependency("getcoord")
346 5 .addDependency("indextoworld")
347
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
348 .setDocumentation("Returns the current voxel's position in world space as a vector float.")
349
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
10 .get();
350 }
351
352 2 inline FunctionGroup::UniquePtr axisactive(const FunctionOptions& op)
353 {
354 static auto generate = [](const std::vector<llvm::Value*>&,
355 llvm::IRBuilder<>& B) -> llvm::Value*
356 {
357 OPENVDB_AX_CHECK_MODULE_CONTEXT(B);
358 // Pull out parent function arguments
359 llvm::Function* compute = B.GetInsertBlock()->getParent();
360 return extractArgument(compute, "active");
361 };
362
363 2 return FunctionBuilder("isactive")
364
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 .addSignature<bool()>(generate)
365 .setEmbedIR(true)
366 .setConstantFold(false)
367
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
368 .setDocumentation("Returns whether the current voxel or tile is active.")
369
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 .get();
370 }
371
372 719 inline FunctionGroup::UniquePtr axsetvoxel(const FunctionOptions& op)
373 {
374 static auto setvoxelptr =
375 160686 [](void* accessor,
376 const openvdb::math::Vec3<int32_t>* coord,
377 const int32_t level,
378 const bool ison,
379 const auto value)
380 {
381 using ValueType = typename std::remove_const
382 <typename std::remove_pointer
383 <decltype(value)>::type>::type;
384 using GridType = typename openvdb::BoolGrid::ValueConverter<ValueType>::Type;
385 using RootNodeType = typename GridType::TreeType::RootNodeType;
386 using AccessorType = typename GridType::Accessor;
387
388
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80343 times.
160686 assert(accessor);
389
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80343 times.
160686 assert(coord);
390
391 // set value only to avoid changing topology
392 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(coord);
393 AccessorType* const accessorPtr = static_cast<AccessorType*>(accessor);
394
395
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80343 times.
160686 if (level != -1) {
396 assert(level >= 0);
397 accessorPtr->addTile(Index(level), *ijk, *value, ison);
398 }
399 else {
400 // Check the depth to avoid creating voxel topology for higher levels
401 // @note This option is not configurable outside of the executable
402 160686 const int depth = accessorPtr->getValueDepth(*ijk);
403
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80343 times.
160686 if (depth == static_cast<int>(RootNodeType::LEVEL)) {
404 // voxel/leaf level
405 assert(accessorPtr->probeConstLeaf(*ijk));
406 if (ison) accessorPtr->setValueOn(*ijk, *value);
407 else accessorPtr->setValueOff(*ijk, *value);
408 }
409 else {
410 // If the current depth is not the maximum (i.e voxel/leaf level) then
411 // we're iterating over tiles of an internal node (NodeT0 is the leaf level).
412 // We can't call setValueOnly or other variants as this will forcer voxel
413 // topology to be created. Whilst the VolumeExecutables runs in such a
414 // way that this is safe, it's not desirable; we just want to change the
415 // tile value. There is no easy way to do this; we have to set a new tile
416 // with the same active state.
417 // @warning This code assume that getValueDepth() is always called to force
418 // a node cache.
419 using NodeT1 = typename AccessorType::NodeT1;
420 using NodeT2 = typename AccessorType::NodeT2;
421
2/2
✓ Branch 0 taken 12598 times.
✓ Branch 1 taken 67745 times.
160686 if (NodeT1* node = accessorPtr->template getNode<NodeT1>()) {
422 const openvdb::Index index = node->coordToOffset(*ijk);
423
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12598 times.
25196 assert(node->isChildMaskOff(index));
424 25196 node->addTile(index, *value, ison);
425 }
426
2/2
✓ Branch 0 taken 67740 times.
✓ Branch 1 taken 5 times.
135490 else if (NodeT2* node = accessorPtr->template getNode<NodeT2>()) {
427 const openvdb::Index index = node->coordToOffset(*ijk);
428
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67740 times.
135480 assert(node->isChildMaskOff(index));
429 135480 node->addTile(index, *value, ison);
430 }
431 else {
432 10 const int level = RootNodeType::LEVEL - depth;
433 10 accessorPtr->addTile(level, *ijk, *value, ison);
434 }
435 }
436 }
437 160686 };
438
439 static auto setvoxelstr =
440 102 [](void* accessor,
441 const openvdb::math::Vec3<int32_t>* coord,
442 const int32_t level,
443 const bool ison,
444 codegen::String* value)
445 {
446 const std::string copy(value->str());
447
1/2
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
102 setvoxelptr(accessor, coord, level, ison, &copy);
448 102 };
449
450 static auto setvoxel =
451 [](void* accessor,
452 const openvdb::math::Vec3<int32_t>* coord,
453 const int32_t level,
454 const bool ison,
455 const auto value) {
456 setvoxelptr(accessor, coord, level, ison, &value);
457 };
458
459 using SetVoxelD = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const double);
460 using SetVoxelF = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const float);
461 using SetVoxelI64 = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const int64_t);
462 using SetVoxelI32 = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const int32_t);
463 using SetVoxelI16 = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const int16_t);
464 using SetVoxelB = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const bool);
465 using SetVoxelV2D = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec2<double>*);
466 using SetVoxelV2F = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec2<float>*);
467 using SetVoxelV2I = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec2<int32_t>*);
468 using SetVoxelV3D = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec3<double>*);
469 using SetVoxelV3F = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec3<float>*);
470 using SetVoxelV3I = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec3<int32_t>*);
471 using SetVoxelV4D = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec4<double>*);
472 using SetVoxelV4F = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec4<float>*);
473 using SetVoxelV4I = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Vec4<int32_t>*);
474 using SetVoxelM3D = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Mat3<double>*);
475 using SetVoxelM3F = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Mat3<float>*);
476 using SetVoxelM4D = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Mat4<double>*);
477 using SetVoxelM4F = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, const openvdb::math::Mat4<float>*);
478 using SetVoxelStr = void(void*, const openvdb::math::Vec3<int32_t>*, const int32_t, const bool, codegen::String*);
479
480 1438 return FunctionBuilder("setvoxel")
481
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelD>((SetVoxelD*)(setvoxel))
482
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelF>((SetVoxelF*)(setvoxel))
483
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelI64>((SetVoxelI64*)(setvoxel))
484
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelI32>((SetVoxelI32*)(setvoxel))
485
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelI16>((SetVoxelI16*)(setvoxel))
486
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelB>((SetVoxelB*)(setvoxel))
487
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::NoAlias)
488
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::ReadOnly)
489
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::NoCapture)
490
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(1, llvm::Attribute::ReadOnly)
491
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(1, llvm::Attribute::NoCapture)
492
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addFunctionAttribute(llvm::Attribute::NoUnwind)
493
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addFunctionAttribute(llvm::Attribute::NoRecurse)
494 .setConstantFold(false)
495
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV2D>((SetVoxelV2D*)(setvoxelptr))
496
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV2F>((SetVoxelV2F*)(setvoxelptr))
497
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV2I>((SetVoxelV2I*)(setvoxelptr))
498
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV3D>((SetVoxelV3D*)(setvoxelptr))
499
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV3F>((SetVoxelV3F*)(setvoxelptr))
500
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV3I>((SetVoxelV3I*)(setvoxelptr))
501
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV4D>((SetVoxelV4D*)(setvoxelptr))
502
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV4F>((SetVoxelV4F*)(setvoxelptr))
503
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelV4I>((SetVoxelV4I*)(setvoxelptr))
504
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelM3D>((SetVoxelM3D*)(setvoxelptr))
505
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelM3F>((SetVoxelM3F*)(setvoxelptr))
506
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelM4D>((SetVoxelM4D*)(setvoxelptr))
507
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelM4F>((SetVoxelM4F*)(setvoxelptr))
508
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<SetVoxelStr>((SetVoxelStr*)(setvoxelstr))
509
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::NoAlias)
510
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::ReadOnly)
511
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::NoCapture)
512
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(1, llvm::Attribute::ReadOnly)
513
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(1, llvm::Attribute::NoCapture)
514
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(4, llvm::Attribute::NoAlias)
515
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(4, llvm::Attribute::ReadOnly)
516
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(4, llvm::Attribute::NoCapture)
517
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addFunctionAttribute(llvm::Attribute::NoUnwind)
518
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 487 times.
719 .addFunctionAttribute(llvm::Attribute::NoRecurse)
519 .setConstantFold(false)
520
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 487 times.
719 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
521 .setDocumentation("Internal function for setting the value of a voxel.")
522
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
1438 .get();
523 }
524
525 721 inline FunctionGroup::UniquePtr axgetvoxel(const FunctionOptions& op)
526 {
527 static auto getvoxel =
528 [](void* accessor,
529 const openvdb::math::Vec3<int32_t>* coord,
530 auto value)
531 {
532 using ValueType = typename std::remove_pointer<decltype(value)>::type;
533 using GridType = typename openvdb::BoolGrid::ValueConverter<ValueType>::Type;
534 using AccessorType = typename GridType::Accessor;
535
536 assert(accessor);
537 assert(coord);
538 assert(value);
539
540 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(coord);
541 (*value) = static_cast<const AccessorType*>(accessor)->getValue(*ijk);
542 };
543
544 static auto getvoxelstr =
545 [](void* accessor,
546 const openvdb::math::Vec3<int32_t>* coord,
547 codegen::String* value)
548 {
549 using GridType = openvdb::BoolGrid::ValueConverter<std::string>::Type;
550 using AccessorType = GridType::Accessor;
551
552 assert(accessor);
553 assert(coord);
554 assert(value);
555
556 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(coord);
557 const std::string& str = static_cast<const AccessorType*>(accessor)->getValue(*ijk);
558 // Copy the string to AX's required representation
559 *value = str;
560 };
561
562 static auto getvoxel_s2t =
563 8392919708 [](void* accessor,
564 void* sourceTransform,
565 void* targetTransform,
566 const openvdb::math::Vec3<int32_t>* origin,
567 const int32_t offset,
568 auto value)
569 {
570 using ValueType = typename std::remove_pointer<decltype(value)>::type;
571 using GridType = typename openvdb::BoolGrid::ValueConverter<ValueType>::Type;
572 using LeafNodeT = typename GridType::TreeType::LeafNodeType;
573 using AccessorType = typename GridType::Accessor;
574
575
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4196459854 times.
8392919708 assert(accessor);
576
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4196459854 times.
8392919708 assert(origin);
577
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4196459854 times.
8392919708 assert(sourceTransform);
578
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4196459854 times.
8392919708 assert(targetTransform);
579
580 const AccessorType* const accessorPtr = static_cast<const AccessorType*>(accessor);
581 const openvdb::math::Transform* const sourceTransformPtr =
582 static_cast<const openvdb::math::Transform*>(sourceTransform);
583 const openvdb::math::Transform* const targetTransformPtr =
584 static_cast<const openvdb::math::Transform*>(targetTransform);
585
586 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(origin);
587 8392919708 auto coord = *ijk + LeafNodeT::offsetToLocalCoord(offset);
588 8392919708 coord = targetTransformPtr->worldToIndexCellCentered(sourceTransformPtr->indexToWorld(coord));
589 8392919708 (*value) = accessorPtr->getValue(coord);
590 8392919708 };
591
592 static auto getvoxelstr_s2t =
593 88124378 [](void* accessor,
594 void* sourceTransform,
595 void* targetTransform,
596 const openvdb::math::Vec3<int32_t>* origin,
597 const int32_t offset,
598 codegen::String* value)
599 {
600 using GridType = typename openvdb::BoolGrid::ValueConverter<std::string>::Type;
601 using LeafNodeT = typename GridType::TreeType::LeafNodeType;
602 using AccessorType = typename GridType::Accessor;
603
604
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 88124378 times.
88124378 assert(accessor);
605
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 88124378 times.
88124378 assert(origin);
606
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 88124378 times.
88124378 assert(sourceTransform);
607
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 88124378 times.
88124378 assert(targetTransform);
608
609 const AccessorType* const accessorPtr = static_cast<const AccessorType*>(accessor);
610 const openvdb::math::Transform* const sourceTransformPtr =
611 static_cast<const openvdb::math::Transform*>(sourceTransform);
612 const openvdb::math::Transform* const targetTransformPtr =
613 static_cast<const openvdb::math::Transform*>(targetTransform);
614
615 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(origin);
616 88124378 auto coord = *ijk + LeafNodeT::offsetToLocalCoord(offset);
617 88124378 coord = targetTransformPtr->worldToIndexCellCentered(sourceTransformPtr->indexToWorld(coord));
618 88124378 const std::string& str = accessorPtr->getValue(coord);
619 // Copy the string to AX's required representation
620 88124378 *value = str;
621 88124378 };
622
623 using GetVoxelS2T_D = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, double*);
624 using GetVoxelS2T_F = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, float*);
625 using GetVoxelS2T_I64 = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, int64_t*);
626 using GetVoxelS2T_I32 = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, int32_t*);
627 using GetVoxelS2T_I16 = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, int16_t*);
628 using GetVoxelS2T_B = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, bool*);
629 using GetVoxelS2T_V2D = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec2<double>*);
630 using GetVoxelS2T_V2F = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec2<float>*);
631 using GetVoxelS2T_V2I = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec2<int32_t>*);
632 using GetVoxelS2T_V3D = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec3<double>*);
633 using GetVoxelS2T_V3F = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec3<float>*);
634 using GetVoxelS2T_V3I = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec3<int32_t>*);
635 using GetVoxelS2T_V4D = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec4<double>*);
636 using GetVoxelS2T_V4F = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec4<float>*);
637 using GetVoxelS2T_V4I = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Vec4<int32_t>*);
638 using GetVoxelS2T_M3D = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Mat3<double>*);
639 using GetVoxelS2T_M3F = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Mat3<float>*);
640 using GetVoxelS2T_M4D = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Mat4<double>*);
641 using GetVoxelS2T_M4F = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, openvdb::math::Mat4<float>*);
642 using GetVoxelS2T_Str = void(void*, void*, void*, const openvdb::math::Vec3<int32_t>*, int32_t, codegen::String*);
643
644 using GetVoxelD = void(void*, const openvdb::math::Vec3<int32_t>*, double*);
645 using GetVoxelF = void(void*, const openvdb::math::Vec3<int32_t>*, float*);
646 using GetVoxelI64 = void(void*, const openvdb::math::Vec3<int32_t>*, int64_t*);
647 using GetVoxelI32 = void(void*, const openvdb::math::Vec3<int32_t>*, int32_t*);
648 using GetVoxelI16 = void(void*, const openvdb::math::Vec3<int32_t>*, int16_t*);
649 using GetVoxelB = void(void*, const openvdb::math::Vec3<int32_t>*, bool*);
650 using GetVoxelV2D = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec2<double>*);
651 using GetVoxelV2F = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec2<float>*);
652 using GetVoxelV2I = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec2<int32_t>*);
653 using GetVoxelV3D = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec3<double>*);
654 using GetVoxelV3F = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec3<float>*);
655 using GetVoxelV3I = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec3<int32_t>*);
656 using GetVoxelV4D = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec4<double>*);
657 using GetVoxelV4F = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec4<float>*);
658 using GetVoxelV4I = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Vec4<int32_t>*);
659 using GetVoxelM3D = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Mat3<double>*);
660 using GetVoxelM3F = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Mat3<float>*);
661 using GetVoxelM4D = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Mat4<double>*);
662 using GetVoxelM4F = void(void*, const openvdb::math::Vec3<int32_t>*, openvdb::math::Mat4<float>*);
663 using GetVoxelStr = void(void*, const openvdb::math::Vec3<int32_t>*, codegen::String*);
664
665 1442 return FunctionBuilder("getvoxel")
666
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelD>((GetVoxelD*)(getvoxel))
667
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelF>((GetVoxelF*)(getvoxel))
668
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelI64>((GetVoxelI64*)(getvoxel))
669
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelI32>((GetVoxelI32*)(getvoxel))
670
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelI16>((GetVoxelI16*)(getvoxel))
671
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelB>((GetVoxelB*)(getvoxel))
672
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV2D>((GetVoxelV2D*)(getvoxel))
673
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV2F>((GetVoxelV2F*)(getvoxel))
674
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV2I>((GetVoxelV2I*)(getvoxel))
675
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV3D>((GetVoxelV3D*)(getvoxel))
676
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV3F>((GetVoxelV3F*)(getvoxel))
677
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV3I>((GetVoxelV3I*)(getvoxel))
678
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV4D>((GetVoxelV4D*)(getvoxel))
679
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV4F>((GetVoxelV4F*)(getvoxel))
680
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelV4I>((GetVoxelV4I*)(getvoxel))
681
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelM3F>((GetVoxelM3F*)(getvoxel))
682
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelM3D>((GetVoxelM3D*)(getvoxel))
683
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelM4F>((GetVoxelM4F*)(getvoxel))
684
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelM4D>((GetVoxelM4D*)(getvoxel))
685
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelStr>((GetVoxelStr*)(getvoxelstr))
686
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(0, llvm::Attribute::NoAlias)
687
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(1, llvm::Attribute::NoAlias)
688
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(1, llvm::Attribute::ReadOnly)
689
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(2, llvm::Attribute::WriteOnly)
690
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(2, llvm::Attribute::NoAlias)
691
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addFunctionAttribute(llvm::Attribute::NoUnwind)
692
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addFunctionAttribute(llvm::Attribute::NoRecurse)
693 .setConstantFold(false)
694
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_D>((GetVoxelS2T_D*)(getvoxel_s2t))
695
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_F>((GetVoxelS2T_F*)(getvoxel_s2t))
696
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_I64>((GetVoxelS2T_I64*)(getvoxel_s2t))
697
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_I32>((GetVoxelS2T_I32*)(getvoxel_s2t))
698
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_I16>((GetVoxelS2T_I16*)(getvoxel_s2t))
699
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_B>((GetVoxelS2T_B*)(getvoxel_s2t))
700
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V2D>((GetVoxelS2T_V2D*)(getvoxel_s2t))
701
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V2F>((GetVoxelS2T_V2F*)(getvoxel_s2t))
702
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V2I>((GetVoxelS2T_V2I*)(getvoxel_s2t))
703
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V3D>((GetVoxelS2T_V3D*)(getvoxel_s2t))
704
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V3F>((GetVoxelS2T_V3F*)(getvoxel_s2t))
705
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V3I>((GetVoxelS2T_V3I*)(getvoxel_s2t))
706
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V4D>((GetVoxelS2T_V4D*)(getvoxel_s2t))
707
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V4F>((GetVoxelS2T_V4F*)(getvoxel_s2t))
708
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_V4I>((GetVoxelS2T_V4I*)(getvoxel_s2t))
709
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_M3F>((GetVoxelS2T_M3F*)(getvoxel_s2t))
710
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_M3D>((GetVoxelS2T_M3D*)(getvoxel_s2t))
711
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_M4F>((GetVoxelS2T_M4F*)(getvoxel_s2t))
712
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_M4D>((GetVoxelS2T_M4D*)(getvoxel_s2t))
713
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addSignature<GetVoxelS2T_Str>((GetVoxelS2T_Str*)(getvoxelstr_s2t))
714
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(0, llvm::Attribute::NoAlias)
715
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(1, llvm::Attribute::NoAlias)
716
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(1, llvm::Attribute::ReadOnly)
717
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(2, llvm::Attribute::ReadOnly)
718
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(3, llvm::Attribute::WriteOnly)
719
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addParameterAttribute(3, llvm::Attribute::NoAlias)
720
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
721 .addFunctionAttribute(llvm::Attribute::NoUnwind)
721
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 489 times.
721 .addFunctionAttribute(llvm::Attribute::NoRecurse)
722 .setConstantFold(false)
723
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 489 times.
721 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
724 .setDocumentation("Internal function for setting the value of a voxel.")
725
1/2
✓ Branch 1 taken 721 times.
✗ Branch 2 not taken.
1442 .get();
726 }
727
728 719 inline FunctionGroup::UniquePtr axprobevalue(const FunctionOptions& op)
729 {
730 static auto probe =
731 160482 [](void* accessor,
732 const openvdb::math::Vec3<int32_t>* coord,
733 bool* ison,
734 auto value)
735 {
736 using ValueType = typename std::remove_pointer<decltype(value)>::type;
737 using GridType = typename openvdb::BoolGrid::ValueConverter<ValueType>::Type;
738 using AccessorType = typename GridType::Accessor;
739
740
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80241 times.
160482 assert(accessor);
741
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80241 times.
160482 assert(coord);
742
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80241 times.
160482 assert(value);
743
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80241 times.
160482 assert(ison);
744
745 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(coord);
746 160482 *ison = static_cast<const AccessorType*>(accessor)->probeValue(*ijk, *value);
747 160482 };
748
749 static auto probestr =
750 102 [](void* accessor,
751 const openvdb::math::Vec3<int32_t>* coord,
752 bool* ison,
753 codegen::String* value)
754 {
755 using GridType = openvdb::BoolGrid::ValueConverter<std::string>::Type;
756 using AccessorType = GridType::Accessor;
757
758
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102 times.
102 assert(accessor);
759
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102 times.
102 assert(coord);
760
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102 times.
102 assert(value);
761
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102 times.
102 assert(ison);
762
763 const openvdb::Coord* ijk = reinterpret_cast<const openvdb::Coord*>(coord);
764
765 std::string str;
766
1/2
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
102 *ison = static_cast<const AccessorType*>(accessor)->probeValue(*ijk, str);
767 // Copy the string to AX's required representation
768 102 *value = str;
769 102 };
770
771 using ProbeValueD = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, double*);
772 using ProbeValueF = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, float*);
773 using ProbeValueI64 = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, int64_t*);
774 using ProbeValueI32 = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, int32_t*);
775 using ProbeValueI16 = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, int16_t*);
776 using ProbeValueB = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, bool*);
777 using ProbeValueV2D = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec2<double>*);
778 using ProbeValueV2F = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec2<float>*);
779 using ProbeValueV2I = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec2<int32_t>*);
780 using ProbeValueV3D = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec3<double>*);
781 using ProbeValueV3F = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec3<float>*);
782 using ProbeValueV3I = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec3<int32_t>*);
783 using ProbeValueV4D = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec4<double>*);
784 using ProbeValueV4F = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec4<float>*);
785 using ProbeValueV4I = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Vec4<int32_t>*);
786 using ProbeValueM3D = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Mat3<double>*);
787 using ProbeValueM3F = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Mat3<float>*);
788 using ProbeValueM4D = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Mat4<double>*);
789 using ProbeValueM4F = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, openvdb::math::Mat4<float>*);
790 using ProbeValueStr = void(void*, const openvdb::math::Vec3<int32_t>*, bool*, codegen::String*);
791
792 1438 return FunctionBuilder("probevalue")
793
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueD>((ProbeValueD*)(probe))
794
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueF>((ProbeValueF*)(probe))
795
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueI64>((ProbeValueI64*)(probe))
796
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueI32>((ProbeValueI32*)(probe))
797
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueI16>((ProbeValueI16*)(probe))
798
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueB>((ProbeValueB*)(probe))
799
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV2D>((ProbeValueV2D*)(probe))
800
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV2F>((ProbeValueV2F*)(probe))
801
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV2I>((ProbeValueV2I*)(probe))
802
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV3D>((ProbeValueV3D*)(probe))
803
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV3F>((ProbeValueV3F*)(probe))
804
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV3I>((ProbeValueV3I*)(probe))
805
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV4D>((ProbeValueV4D*)(probe))
806
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV4F>((ProbeValueV4F*)(probe))
807
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueV4I>((ProbeValueV4I*)(probe))
808
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueM3F>((ProbeValueM3F*)(probe))
809
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueM3D>((ProbeValueM3D*)(probe))
810
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueM4F>((ProbeValueM4F*)(probe))
811
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueM4D>((ProbeValueM4D*)(probe))
812
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addSignature<ProbeValueStr>((ProbeValueStr*)(probestr))
813
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(0, llvm::Attribute::NoAlias)
814
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(1, llvm::Attribute::NoAlias)
815
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(1, llvm::Attribute::ReadOnly)
816
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(2, llvm::Attribute::WriteOnly)
817
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(2, llvm::Attribute::NoAlias)
818
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(3, llvm::Attribute::WriteOnly)
819
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addParameterAttribute(3, llvm::Attribute::NoAlias)
820
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
719 .addFunctionAttribute(llvm::Attribute::NoUnwind)
821
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 487 times.
719 .addFunctionAttribute(llvm::Attribute::NoRecurse)
822 .setConstantFold(false)
823
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 487 times.
719 .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C)
824 .setDocumentation("Internal function for getting the value of a voxel and its active state.")
825
1/2
✓ Branch 1 taken 719 times.
✗ Branch 2 not taken.
1438 .get();
826 }
827
828 ////////////////////////////////////////////////////////////////////////
829 ////////////////////////////////////////////////////////////////////////
830
831 1487 void insertVDBVolumeFunctions(FunctionRegistry& registry,
832 const FunctionOptions* options)
833 {
834
4/4
✓ Branch 0 taken 1486 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1485 times.
✓ Branch 3 taken 1 times.
1487 const bool create = options && !options->mLazyFunctions;
835 19331 auto add = [&](const std::string& name,
836 const FunctionRegistry::ConstructorT creator,
837 const bool internal = false)
838 {
839
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 19318 times.
19331 if (create) registry.insertAndCreate(name, creator, *options, internal);
840 19318 else registry.insert(name, creator, internal);
841 20818 };
842
843 // volume functions
844
845
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("coordtooffset", axcoordtooffset, true);
846
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("offsettocoord", axoffsettocoord, true);
847
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("offsettoglobalcoord", axoffsettoglobalcoord, true);
848
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("indextoworld", axindextoworld, true);
849
850
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("getcoord", axgetcoord);
851
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("getcoordx", axgetcoord<0>);
852
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("getcoordy", axgetcoord<1>);
853
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("getcoordz", axgetcoord<2>);
854
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("getvoxelpws", axgetvoxelpws);
855
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("isactive", axisactive, true); // needs tests
856
857
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("getvoxel", axgetvoxel, true);
858
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("setvoxel", axsetvoxel, true);
859
2/4
✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
1487 add("probevalue", axprobevalue, true);
860 1487 }
861
862 } // namespace codegen
863 } // namespace ax
864 } // namespace OPENVDB_VERSION_NAME
865 } // namespace openvdb
866
867