Skip to content

Commit dfd71db

Browse files
author
Felix Igelbrink
committed
fixed visibility mask and made struct dtypes accessible from python
1 parent 9d57510 commit dfd71db

3 files changed

Lines changed: 20 additions & 15 deletions

File tree

optix/build.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ cdef class Instance(OptixObject):
429429
self.instance.instanceId = instance_id
430430
self.instance.flags = flags.value
431431
self.instance.sbtOffset = sbt_offset
432-
visibility_mask = int(visibility_mask)
432+
visibility_mask = int(visibility_mask) if visibility_mask is not None else 0
433433
if visibility_mask.bit_length() > self.traversable.context.num_bits_instances_visibility_mask:
434434
raise ValueError(f"Too many entries in visibility mask. Got {visibility_mask.bit_length()} but supported are only {self.traversable.context.num_bits_instances_visibility_mask}")
435435
self.instance.visibilityMask = visibility_mask
@@ -464,7 +464,7 @@ cdef class BuildInputInstanceArray(BuildInputArray):
464464
cdef vector[OptixInstance] c_instances
465465
c_instances.reserve(len(instances))
466466
for inst in instances:
467-
c_instances.push_back(inst._instance)
467+
c_instances.push_back((<Instance>inst).instance)
468468

469469
cp.cuda.runtime.memcpy(self._d_instances.ptr, <size_t>c_instances.data(), size, cp.cuda.runtime.memcpyHostToDevice)
470470

@@ -581,7 +581,7 @@ cdef class AccelerationStructure(OptixContextObject):
581581
if isinstance(build_inputs[0], BuildInputInstanceArray):
582582
if inputs_size > 1:
583583
raise ValueError("Only a single build input allowed for instance builds")
584-
self._instances = build_inputs[0].instances # keep the instances so the buffers do not get deleted
584+
self._instances = (<BuildInputInstanceArray>build_inputs[0]).instances # keep the instances so the buffers do not get deleted
585585

586586
cdef vector[OptixAccelBuildOptions] accel_options# = vector[OptixAccelBuildOptions](inputs_size)
587587
self._init_accel_options(inputs_size, self._build_flags, OPTIX_BUILD_OPERATION_BUILD, accel_options)

optix/struct.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ cdef extern from "optix_includes.h" nogil:
1212

1313

1414
cdef class _StructHelper(OptixObject):
15-
cdef object dtype
15+
cdef object _dtype
1616
cdef dict array_values
1717
cdef object _array
1818

optix/struct.pyx

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,24 @@ cdef class _StructHelper:
8181
formats = ensure_iterable(formats)
8282

8383
self.array_values = {} # init dict
84-
self.dtype = self._convert_to_aligned_dtype(names, formats, alignment)
84+
self._dtype = self._convert_to_aligneddtype(names, formats, alignment)
8585
self._array = self._create(size)
8686

8787
if values is not None:
8888
for name, value in names, values:
8989
if value is not None:
9090
self.__setitem__(name, value)
91+
92+
@property
93+
def dtype(self):
94+
return self._dtype
95+
9196
@property
9297
def array(self):
9398
return self._array
9499

95100
@classmethod
96-
def from_dtype(cls, dtype, values=None, size=1, alignment=1):
101+
def fromdtype(cls, dtype, values=None, size=1, alignment=1):
97102
"""
98103
Create the struct from a numpy structured dtype.
99104
@@ -153,7 +158,7 @@ cdef class _StructHelper:
153158
values.append(v[1])
154159
return cls(names=names, formats=formats, values=values, size=size, alignment=1)
155160

156-
def _convert_to_aligned_dtype(self, names, formats, alignment):
161+
def _convert_to_aligneddtype(self, names, formats, alignment):
157162
"""
158163
Construct an aligned dtype from the names and formats
159164
@@ -180,14 +185,14 @@ cdef class _StructHelper:
180185
return array
181186

182187
def _create(self, size):
183-
array = np.zeros(size, dtype=self.dtype)
188+
array = np.zeros(size, dtype=self._dtype)
184189
array = self._prepare_array(array)
185190
return array
186191

187192
def __setitem__(self, key, value):
188193
value = (value,) if not isinstance(value, (list, tuple)) else value
189194
# special hook for cupy arrays if a pointer is to be stored
190-
if np.issubdtype(self.dtype.fields[key][0], 'u8') and all(isinstance(v, cp.ndarray) for v in value):
195+
if np.issubdtype(self._dtype.fields[key][0], 'u8') and all(isinstance(v, cp.ndarray) for v in value):
191196
self.array_values[key] = value
192197
value = [v.data.ptr for v in value]
193198
self.array[key] = value
@@ -196,13 +201,13 @@ cdef class _StructHelper:
196201
return self.array[key]
197202

198203
def __len__(self):
199-
return len(self.dtype.fields)
204+
return len(self._dtype.fields)
200205

201206
def __iter__(self):
202207
yield from self.keys()
203208

204209
def __contains__(self, item):
205-
return item in self.dtype.fields
210+
return item in self._dtype.fields
206211

207212
def get(self, item, value=None):
208213
try:
@@ -211,7 +216,7 @@ cdef class _StructHelper:
211216
return value
212217

213218
def keys(self):
214-
yield from self.dtype.fields
219+
yield from self._dtype.fields
215220

216221
def values(self):
217222
for k in self.keys():
@@ -236,19 +241,19 @@ cdef class _StructHelper:
236241
"""
237242
size = self.array.shape[0]
238243
mem = array_to_device_memory(self.array, stream=stream)
239-
array = cp.ndarray(size, dtype=self.dtype, memptr=mem)
244+
array = cp.ndarray(size, dtype=self._dtype, memptr=mem)
240245
return array
241246

242247
@property
243248
def itemsize(self):
244-
return self.dtype.itemsize
249+
return self._dtype.itemsize
245250

246251
@property
247252
def size(self):
248253
return self._array.shape[0]
249254

250255
def _repr_details(self):
251-
return f"size {self.size}, dtype {self.dtype}"
256+
return f"size {self.size}, dtype {self._dtype}"
252257

253258

254259
cdef class SbtRecord(_StructHelper):

0 commit comments

Comments
 (0)