Skip to content

Commit 5f20f5b

Browse files
committed
Switch to pre-allocate arrays in BVH construction rather than relying on push_back
1 parent 950b815 commit 5f20f5b

2 files changed

Lines changed: 30 additions & 43 deletions

File tree

include/xdg/geometry/dp_math.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ namespace dp {
2525

2626
#else
2727
#include "xdg/vec3da.h"
28-
#include "xdg/util/linalg.h"
2928

3029
// C++ compilation map dp::vec3 -> xdg::Vec3da
3130
namespace dp {

src/gprt/ray_tracer.cpp

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -128,45 +128,39 @@ GPRTRayTracer::create_surface_tree(const std::shared_ptr<MeshManager>& mesh_mana
128128
std::vector<gprt::Instance> surfaceBlasInstances; // BLAS for each (surface) geometry in this volume
129129

130130
for (const auto &surf : volume_surfaces) {
131-
auto num_faces = mesh_manager->num_surface_faces(surf);
132-
133-
// get the sense of this surface with respect to the volume
134-
Sense triangle_sense {Sense::UNSET};
135-
auto surf_to_vol_senses = mesh_manager->get_parent_volumes(surf);
136-
if (volume_id == surf_to_vol_senses.first) triangle_sense = Sense::FORWARD;
137-
else if (volume_id == surf_to_vol_senses.second) triangle_sense = Sense::REVERSE;
138-
139131
DPTriangleGeomData* geom_data = nullptr;
140132
auto triangleGeom = gprtGeomCreate<DPTriangleGeomData>(context_, trianglesGeomType_);
141133
geom_data = gprtGeomGetParameters(triangleGeom); // pointer to assign data to
142134

143135
// Get storage for vertices and indices
144136
auto vertices = mesh_manager->get_surface_vertices(surf);
145137
auto indices = mesh_manager->get_surface_connectivity(surf);
146-
std::vector<double3> dbl3Vertices;
147-
dbl3Vertices.reserve(vertices.size());
148-
for (const auto &vertex : vertices) {
149-
dbl3Vertices.push_back({vertex.x, vertex.y, vertex.z});
138+
if (indices.size() % 3 != 0) {
139+
fatal_error("Surface {} connectivity size ({}) is not divisible by 3 for triangles", surf, indices.size());
140+
}
141+
std::vector<double3> dbl3Vertices(vertices.size());
142+
for (size_t i = 0; i < vertices.size(); ++i) {
143+
const auto& vertex = vertices[i];
144+
dbl3Vertices[i] = {vertex.x, vertex.y, vertex.z};
150145
}
151146

152147
// Get storage for indices
153-
std::vector<uint3> ui3Indices;
154-
ui3Indices.reserve(indices.size() / 3);
155-
for (size_t i = 0; i < indices.size(); i += 3) {
156-
ui3Indices.emplace_back(indices[i], indices[i + 1], indices[i + 2]);
148+
std::vector<uint3> ui3Indices(indices.size() / 3);
149+
for (size_t i = 0, triIdx = 0; i < indices.size(); i += 3, ++triIdx) {
150+
ui3Indices[triIdx] = uint3(indices[i], indices[i + 1], indices[i + 2]);
157151
}
158152

159153
// Get storage for normals
160-
std::vector<double3> normals;
161-
std::vector<GPRTPrimitiveRef> primitive_refs;
162-
primitive_refs.reserve(num_faces);
163-
normals.reserve(num_faces);
164-
for (const auto &face : mesh_manager->get_surface_faces(surf)) {
154+
auto surface_faces = mesh_manager->get_surface_faces(surf);
155+
const size_t num_faces = surface_faces.size();
156+
157+
std::vector<double3> normals(surface_faces.size());
158+
std::vector<GPRTPrimitiveRef> primitive_refs(surface_faces.size());
159+
for (size_t i = 0; i < surface_faces.size(); ++i) {
160+
const auto face = surface_faces[i];
165161
auto norm = mesh_manager->face_normal(face);
166-
normals.push_back({norm.x, norm.y, norm.z});
167-
GPRTPrimitiveRef prim_ref;
168-
prim_ref.id = face;
169-
primitive_refs.push_back(prim_ref);
162+
normals[i] = {norm.x, norm.y, norm.z};
163+
primitive_refs[i].id = face;
170164
}
171165

172166
auto vertex_buffer = gprtDeviceBufferCreate<double3>(context_, dbl3Vertices.size(), dbl3Vertices.data());
@@ -197,9 +191,6 @@ GPRTRayTracer::create_surface_tree(const std::shared_ptr<MeshManager>& mesh_mana
197191
// Store in maps
198192
surface_to_geometry_map_[surf] = triangleGeom;
199193

200-
geom_data = gprtGeomGetParameters(triangleGeom);
201-
instance = gprtAccelGetInstance(blas);
202-
instance.mask = 0xff;
203194
surfaceBlasInstances.push_back(instance);
204195
globalBlasInstances_.push_back(instance);
205196

@@ -240,26 +231,23 @@ GPRTRayTracer::create_element_tree(const std::shared_ptr<MeshManager>& mesh_mana
240231

241232
auto vertices = mesh_manager->get_volume_vertices(volume_id);
242233
auto indices = mesh_manager->get_volume_connectivity(volume_id);
243-
std::vector<double3> dbl3Vertices;
244-
dbl3Vertices.reserve(vertices.size());
245-
for (const auto &vertex : vertices) {
246-
dbl3Vertices.push_back({vertex.x, vertex.y, vertex.z});
234+
235+
std::vector<double3> dbl3Vertices(vertices.size());
236+
for (size_t i = 0; i < vertices.size(); ++i) {
237+
const auto& vertex = vertices[i];
238+
dbl3Vertices[i] = {vertex.x, vertex.y, vertex.z};
247239
}
248240

249241
// Get storage for indices
250-
std::vector<uint4> ui4Indices;
251-
ui4Indices.reserve(indices.size() / 4);
252-
for (size_t i = 0; i + 3 < indices.size(); i += 4) {
253-
ui4Indices.emplace_back(indices[i], indices[i + 1], indices[i + 2], indices[i + 3]);
242+
std::vector<uint4> ui4Indices(indices.size() / 4);
243+
for (size_t i = 0, tetIdx = 0; i < indices.size(); i += 4, ++tetIdx) {
244+
ui4Indices[tetIdx] = uint4(indices[i], indices[i + 1], indices[i + 2], indices[i + 3]);
254245
}
255246

256247
// Get storage for prim IDs
257-
std::vector<GPRTPrimitiveRef> primitive_refs;
258-
primitive_refs.reserve(mesh_manager->num_volume_elements(volume_id));
259-
for (const auto &element : mesh_manager->get_volume_elements(volume_id)) {
260-
GPRTPrimitiveRef prim_ref;
261-
prim_ref.id = element;
262-
primitive_refs.push_back(prim_ref);
248+
std::vector<GPRTPrimitiveRef> primitive_refs(volume_elements.size());
249+
for (size_t i = 0; i < volume_elements.size(); ++i) {
250+
primitive_refs[i].id = volume_elements[i];
263251
}
264252

265253
auto vertex_buffer = gprtDeviceBufferCreate<double3>(context_, dbl3Vertices.size(), dbl3Vertices.data());

0 commit comments

Comments
 (0)