summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py53
1 files changed, 51 insertions, 2 deletions
diff --git a/geometry.py b/geometry.py
index 3a11daf..e3748e6 100644
--- a/geometry.py
+++ b/geometry.py
@@ -1,5 +1,7 @@
import numpy as np
from itertools import chain
+import pycuda.driver as cuda
+from pycuda import gpuarray
def compress(data, selectors):
"""
@@ -235,8 +237,8 @@ class Geometry(object):
self.lower_bounds = np.empty((len(nodes),3))
self.upper_bounds = np.empty((len(nodes),3))
- self.child_map = np.empty(len(nodes))
- self.child_len = np.empty(len(nodes))
+ self.child_map = np.empty(len(nodes), dtype=np.uint32)
+ self.child_len = np.empty(len(nodes), dtype=np.uint32)
self.first_leaf = None
for i, node in enumerate(nodes):
@@ -256,3 +258,50 @@ class Geometry(object):
if self.first_leaf is None:
self.first_leaf = i
+
+ def load(self, module):
+ """
+ Load the bounding volume hierarchy onto the GPU module,
+ bind it to the appropriate textures, and return a list
+ of the texture references.
+ """
+ mesh = np.empty(self.mesh.shape[0]*3, dtype=gpuarray.vec.float4)
+ mesh['x'] = self.mesh[:,:,0].flatten()
+ mesh['y'] = self.mesh[:,:,1].flatten()
+ mesh['z'] = self.mesh[:,:,2].flatten()
+
+ lower_bounds = np.empty(self.lower_bounds.shape[0], dtype=gpuarray.vec.float4)
+ lower_bounds['x'] = self.lower_bounds[:,0]
+ lower_bounds['y'] = self.lower_bounds[:,1]
+ lower_bounds['z'] = self.lower_bounds[:,2]
+
+ upper_bounds = np.empty(self.upper_bounds.shape[0], dtype=gpuarray.vec.float4)
+ upper_bounds['x'] = self.upper_bounds[:,0]
+ upper_bounds['y'] = self.upper_bounds[:,1]
+ upper_bounds['z'] = self.upper_bounds[:,2]
+
+ self.mesh_gpu = cuda.to_device(mesh)
+ self.lower_bounds_gpu = cuda.to_device(lower_bounds)
+ self.upper_bounds_gpu = cuda.to_device(upper_bounds)
+ self.child_map_gpu = cuda.to_device(self.child_map)
+ self.child_len_gpu = cuda.to_device(self.child_len)
+
+ mesh_tex = module.get_texref('mesh')
+ lower_bounds_tex = module.get_texref('lower_bounds')
+ upper_bounds_tex = module.get_texref('upper_bounds')
+ child_map_tex = module.get_texref('child_map_arr')
+ child_len_tex = module.get_texref('child_len_arr')
+
+ mesh_tex.set_address(self.mesh_gpu, mesh.nbytes)
+ lower_bounds_tex.set_address(self.lower_bounds_gpu, lower_bounds.nbytes)
+ upper_bounds_tex.set_address(self.upper_bounds_gpu, upper_bounds.nbytes)
+ child_map_tex.set_address(self.child_map_gpu, self.child_map.nbytes)
+ child_len_tex.set_address(self.child_len_gpu, self.child_len.nbytes)
+
+ mesh_tex.set_format(cuda.array_format.FLOAT, 4)
+ lower_bounds_tex.set_format(cuda.array_format.FLOAT, 4)
+ upper_bounds_tex.set_format(cuda.array_format.FLOAT, 4)
+ child_map_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1)
+ child_len_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1)
+
+ return [mesh_tex, lower_bounds_tex, upper_bounds_tex, child_map_tex, child_len_tex]