OpenVDB 10.0.1
Loading...
Searching...
No Matches
pnanovdb_validate_strides.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: MPL-2.0
3
4/*!
5 \file pnanovdb_validate_strides.h
6
7 \author Andrew Reidmeyer
8
9 \brief This header implements validation tests for the strides used
10 in PNanaoVDB.h (instead of pointers). It can be used both for
11 unit-testing (hence its location), but also to update PNanoVDB.h
12 if the ABI changes in NanoVDB.h.
13*/
14
15#ifndef NANOVDB_PNANOVDB_VALIDATE_STRIDES_H_HAS_BEEN_INCLUDED
16#define NANOVDB_PNANOVDB_VALIDATE_STRIDES_H_HAS_BEEN_INCLUDED
17
18#include <nanovdb/PNanoVDB.h>
19
20static pnanovdb_uint32_t allocate(pnanovdb_uint32_t* poffset, pnanovdb_uint32_t size, pnanovdb_uint32_t alignment)
21{
22 if (alignment > 0u)
23 {
24 (*poffset) = alignment * (((*poffset) + (alignment - 1)) / alignment);
25 }
26 pnanovdb_uint32_t ret = (*poffset);
27 (*poffset) += size;
28 return ret;
29}
30
32 pnanovdb_uint32_t grid_type,
33 pnanovdb_uint32_t* background_off,
34 pnanovdb_uint32_t* min_off, pnanovdb_uint32_t* max_off,
35 pnanovdb_uint32_t* ave_off, pnanovdb_uint32_t* stddev_off,
36 pnanovdb_uint32_t* total_size)
37{
38 pnanovdb_uint32_t offset = 0u;
39 allocate(&offset, PNANOVDB_ROOT_BASE_SIZE, 32u);
40
41 pnanovdb_uint32_t minmaxStride = pnanovdb_grid_type_minmax_strides_bits[grid_type] / 8u;
42 pnanovdb_uint32_t minmaxAlign = pnanovdb_grid_type_minmax_aligns_bits[grid_type] / 8u;
43 pnanovdb_uint32_t statStride = pnanovdb_grid_type_stat_strides_bits[grid_type] / 8u;
44
45 *background_off = allocate(&offset, minmaxStride, minmaxAlign);
46 *min_off = allocate(&offset, minmaxStride, minmaxAlign);
47 *max_off = allocate(&offset, minmaxStride, minmaxAlign);
48 *ave_off = allocate(&offset, statStride, statStride);
49 *stddev_off = allocate(&offset, statStride, statStride);
50 *total_size = allocate(&offset, 0u, 32u);
51}
52
53static void compute_tile_strides(pnanovdb_uint32_t grid_type, pnanovdb_uint32_t* value_off, pnanovdb_uint32_t* total_size)
54{
55 pnanovdb_uint32_t offset = 0u;
57
58 pnanovdb_uint32_t valueStride = pnanovdb_grid_type_minmax_strides_bits[grid_type] / 8u;
59 pnanovdb_uint32_t valueAlign = pnanovdb_grid_type_minmax_aligns_bits[grid_type] / 8u;
60
61 *value_off = allocate(&offset, valueStride, valueAlign);
62 *total_size = allocate(&offset, 0u, 32u);
63}
64
66 pnanovdb_uint32_t grid_type,
67 pnanovdb_uint32_t nodeLevel,
68 pnanovdb_uint32_t* min_off, pnanovdb_uint32_t* max_off,
69 pnanovdb_uint32_t* ave_off, pnanovdb_uint32_t* stddev_off,
70 pnanovdb_uint32_t* table_off,
71 pnanovdb_uint32_t* total_size)
72{
73 static const pnanovdb_uint32_t node_size[3] = { PNANOVDB_LEAF_BASE_SIZE, PNANOVDB_LOWER_BASE_SIZE, PNANOVDB_UPPER_BASE_SIZE };
74 static const pnanovdb_uint32_t node_elements[3] = { PNANOVDB_LEAF_TABLE_COUNT, PNANOVDB_LOWER_TABLE_COUNT, PNANOVDB_UPPER_TABLE_COUNT };
75 pnanovdb_uint32_t offset = 0u;
76 allocate(&offset, node_size[nodeLevel], 32u);
77
78 pnanovdb_uint32_t valueStrideBits = pnanovdb_grid_type_value_strides_bits[grid_type];
79 pnanovdb_uint32_t tableStrideBits = nodeLevel == 0u ? valueStrideBits : pnanovdb_grid_type_table_strides_bits[grid_type];
80 pnanovdb_uint32_t tableAlign = 32u;
81 pnanovdb_uint32_t tableFullStride = (tableStrideBits * node_elements[nodeLevel]) / 8u;
82
83 pnanovdb_uint32_t minmaxStride = pnanovdb_grid_type_minmax_strides_bits[grid_type] / 8u;
84 pnanovdb_uint32_t minmaxAlign = pnanovdb_grid_type_minmax_aligns_bits[grid_type] / 8u;
85 pnanovdb_uint32_t statStride = pnanovdb_grid_type_stat_strides_bits[grid_type] / 8u;
86 pnanovdb_uint32_t postStatStride = 0u;
87 if (nodeLevel == 0u)
88 {
90 {
91 minmaxStride = 0u;
92 minmaxAlign = 0u;
93 statStride = 0u;
94 }
96 {
97 minmaxStride = 2u;
98 minmaxAlign = 2u;
99 statStride = 2u;
100 // allocate minimum and quantum
101 allocate(&offset, 4u, 4u);
102 allocate(&offset, 4u, 4u);
103 }
105 {
106 minmaxStride = 0u;
107 minmaxAlign = 0u;
108 statStride = 0u;
109 postStatStride = 8u;
110 tableAlign = 8u;
111 tableFullStride = 8u;
112 }
113 }
114 *min_off = allocate(&offset, minmaxStride, minmaxAlign);
115 *max_off = allocate(&offset, minmaxStride, minmaxAlign);
116 *ave_off = allocate(&offset, statStride, statStride);
117 *stddev_off = allocate(&offset, statStride, statStride);
118 allocate(&offset, postStatStride, postStatStride);
119 *table_off = allocate(&offset, tableFullStride, tableAlign);
120 *total_size = allocate(&offset, 0u, 32u);
121}
122
123static bool validate_strides(int(*local_printf)(const char* format, ...))
124{
126
127 for (pnanovdb_uint32_t idx = 0u; idx < PNANOVDB_GRID_TYPE_END; idx++)
128 {
129
130 pnanovdb_uint32_t root_background, root_min, root_max, root_ave, root_stddev, root_size;
131 compute_root_strides(idx, &root_background, &root_min, &root_max, &root_ave, &root_stddev, &root_size);
132
133 pnanovdb_uint32_t tile_value, tile_size;
134 compute_tile_strides(idx, &tile_value, &tile_size);
135
136 pnanovdb_uint32_t upper_min, upper_max, upper_ave, upper_stddev, upper_table, upper_size;
137 compute_node_strides(idx, 2, &upper_min, &upper_max, &upper_ave, &upper_stddev, &upper_table, &upper_size);
138
139 pnanovdb_uint32_t lower_min, lower_max, lower_ave, lower_stddev, lower_table, lower_size;
140 compute_node_strides(idx, 1, &lower_min, &lower_max, &lower_ave, &lower_stddev, &lower_table, &lower_size);
141
142 pnanovdb_uint32_t leaf_min, leaf_max, leaf_ave, leaf_stddev, leaf_table, leaf_size;
143 compute_node_strides(idx, 0, &leaf_min, &leaf_max, &leaf_ave, &leaf_stddev, &leaf_table, &leaf_size);
144
145 pnanovdb_uint32_t valueStrideBits = pnanovdb_grid_type_value_strides_bits[idx];
146 pnanovdb_uint32_t tableStrideBits = pnanovdb_grid_type_table_strides_bits[idx];
147 pnanovdb_uint32_t tableStride = tableStrideBits / 8u;
148
149 // For FP, always return the base of the table
151 {
152 valueStrideBits = 0u;
153 }
154
155 pnanovdb_grid_type_constants_t local_constants = {
156 root_background, root_min, root_max, root_ave, root_stddev, root_size,
157 valueStrideBits, tableStride, tile_value, tile_size,
158 upper_min, upper_max, upper_ave, upper_stddev, upper_table, upper_size,
159 lower_min, lower_max, lower_ave, lower_stddev, lower_table, lower_size,
160 leaf_min, leaf_max, leaf_ave, leaf_stddev, leaf_table, leaf_size
161 };
162 constants[idx] = local_constants;
163 }
164
165 bool mismatch = false;
166 for (pnanovdb_uint32_t idx = 0u; idx < PNANOVDB_GRID_TYPE_END; idx++)
167 {
168 pnanovdb_grid_type_constants_t c = constants[idx];
170 if (memcmp(&c, &t, sizeof(pnanovdb_grid_type_constants_t)) != 0)
171 {
172 mismatch = true;
173 }
174 }
175 if (mismatch)
176 {
177 local_printf("Error: Mismatch between constant tables.\n");
178 for (pnanovdb_uint32_t pass = 0u; pass < 2u; pass++)
179 {
180 if (pass == 0u)
181 {
182 local_printf("Printing expected values:\n");
183 }
184 else
185 {
186 local_printf("Printing current header values:\n");
187 }
188 for (pnanovdb_uint32_t idx = 0u; idx < PNANOVDB_GRID_TYPE_END; idx++)
189 {
190 pnanovdb_grid_type_constants_t c = (pass == 0u) ? constants[idx] : pnanovdb_grid_type_constants[idx];
191 local_printf("{%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d},\n",
197 );
198 }
199 }
200 }
201 return !mismatch;
202}
203
204#endif// end of NANOVDB_PNANOVDB_VALIDATE_STRIDES_H_HAS_BEEN_INCLUDED
This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port of NanoVDB.h, which is compatible with...
#define PNANOVDB_LEAF_TYPE_LITE
Definition PNanoVDB.h:679
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[20]
Definition PNanoVDB.h:683
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[20]
Definition PNanoVDB.h:686
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[20]
Definition PNanoVDB.h:685
#define PNANOVDB_ROOT_BASE_SIZE
Definition PNanoVDB.h:967
#define PNANOVDB_LEAF_TYPE_FP
Definition PNanoVDB.h:680
#define PNANOVDB_UPPER_BASE_SIZE
Definition PNanoVDB.h:1026
#define PNANOVDB_LOWER_BASE_SIZE
Definition PNanoVDB.h:1067
#define PNANOVDB_GRID_TYPE_END
Definition PNanoVDB.h:657
#define PNANOVDB_LEAF_TYPE_INDEX
Definition PNanoVDB.h:681
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[20]
Definition PNanoVDB.h:687
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[20]
Definition PNanoVDB.h:684
#define PNANOVDB_ROOT_TILE_BASE_SIZE
Definition PNanoVDB.h:995
#define PNANOVDB_LOWER_TABLE_COUNT
Definition PNanoVDB.h:1066
#define PNANOVDB_LEAF_TABLE_COUNT
Definition PNanoVDB.h:1105
PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[20]
Definition PNanoVDB.h:1160
#define PNANOVDB_UPPER_TABLE_COUNT
Definition PNanoVDB.h:1025
#define PNANOVDB_LEAF_BASE_SIZE
Definition PNanoVDB.h:1106
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[20]
Definition PNanoVDB.h:688
static void compute_root_strides(pnanovdb_uint32_t grid_type, pnanovdb_uint32_t *background_off, pnanovdb_uint32_t *min_off, pnanovdb_uint32_t *max_off, pnanovdb_uint32_t *ave_off, pnanovdb_uint32_t *stddev_off, pnanovdb_uint32_t *total_size)
Definition pnanovdb_validate_strides.h:31
static void compute_node_strides(pnanovdb_uint32_t grid_type, pnanovdb_uint32_t nodeLevel, pnanovdb_uint32_t *min_off, pnanovdb_uint32_t *max_off, pnanovdb_uint32_t *ave_off, pnanovdb_uint32_t *stddev_off, pnanovdb_uint32_t *table_off, pnanovdb_uint32_t *total_size)
Definition pnanovdb_validate_strides.h:65
static pnanovdb_uint32_t allocate(pnanovdb_uint32_t *poffset, pnanovdb_uint32_t size, pnanovdb_uint32_t alignment)
Definition pnanovdb_validate_strides.h:20
static void compute_tile_strides(pnanovdb_uint32_t grid_type, pnanovdb_uint32_t *value_off, pnanovdb_uint32_t *total_size)
Definition pnanovdb_validate_strides.h:53
static bool validate_strides(int(*local_printf)(const char *format,...))
Definition pnanovdb_validate_strides.h:123
Definition PNanoVDB.h:1128
pnanovdb_uint32_t leaf_off_stddev
Definition PNanoVDB.h:1154
pnanovdb_uint32_t leaf_off_ave
Definition PNanoVDB.h:1153
pnanovdb_uint32_t upper_off_min
Definition PNanoVDB.h:1139
pnanovdb_uint32_t leaf_size
Definition PNanoVDB.h:1156
pnanovdb_uint32_t root_size
Definition PNanoVDB.h:1134
pnanovdb_uint32_t leaf_off_table
Definition PNanoVDB.h:1155
pnanovdb_uint32_t upper_off_max
Definition PNanoVDB.h:1140
pnanovdb_uint32_t upper_off_ave
Definition PNanoVDB.h:1141
pnanovdb_uint32_t table_stride
Definition PNanoVDB.h:1136
pnanovdb_uint32_t upper_off_table
Definition PNanoVDB.h:1143
pnanovdb_uint32_t root_tile_size
Definition PNanoVDB.h:1138
pnanovdb_uint32_t leaf_off_min
Definition PNanoVDB.h:1151
pnanovdb_uint32_t lower_size
Definition PNanoVDB.h:1150
pnanovdb_uint32_t lower_off_min
Definition PNanoVDB.h:1145
pnanovdb_uint32_t upper_size
Definition PNanoVDB.h:1144
pnanovdb_uint32_t value_stride_bits
Definition PNanoVDB.h:1135
pnanovdb_uint32_t root_off_min
Definition PNanoVDB.h:1130
pnanovdb_uint32_t root_tile_off_value
Definition PNanoVDB.h:1137
pnanovdb_uint32_t root_off_ave
Definition PNanoVDB.h:1132
pnanovdb_uint32_t lower_off_stddev
Definition PNanoVDB.h:1148
pnanovdb_uint32_t root_off_stddev
Definition PNanoVDB.h:1133
pnanovdb_uint32_t root_off_background
Definition PNanoVDB.h:1129
pnanovdb_uint32_t root_off_max
Definition PNanoVDB.h:1131
pnanovdb_uint32_t lower_off_table
Definition PNanoVDB.h:1149
pnanovdb_uint32_t lower_off_max
Definition PNanoVDB.h:1146
pnanovdb_uint32_t leaf_off_max
Definition PNanoVDB.h:1152
pnanovdb_uint32_t upper_off_stddev
Definition PNanoVDB.h:1142
pnanovdb_uint32_t lower_off_ave
Definition PNanoVDB.h:1147