Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/viennaray/gpu/raygLaunchParams.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ struct LaunchParams {
float sticking = 1.f;
float cosineExponent = 1.f;
int *materialIds;
int *materialMap;
float *materialSticking;
void *customData;

Expand Down
20 changes: 17 additions & 3 deletions include/viennaray/gpu/raygTrace.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ template <class T, int D> class Trace {

if (materialIdsBuffer_.sizeInBytes != 0) {
launchParams_.materialIds = (int *)materialIdsBuffer_.dPointer();
launchParams_.materialMap = (int *)materialMapBuffer_.dPointer();
}

launchParams_.seed = config_.rngSeed + config_.runNumber++;
Expand Down Expand Up @@ -243,14 +244,24 @@ template <class T, int D> class Trace {

template <class NumericType>
void setMaterialIds(const std::vector<NumericType> &materialIds,
const bool mapToConsecutive = true) {
const bool mapToConsecutive = true,
const std::set<int> &pUniqueMaterialIds = {}) {
assert(materialIds.size() == launchParams_.numElements);

if (mapToConsecutive) {
uniqueMaterialIds_.clear();
uniqueMaterialIds_.clear();
if (!pUniqueMaterialIds.empty()) {
uniqueMaterialIds_ = pUniqueMaterialIds;
} else {
for (auto &matId : materialIds) {
uniqueMaterialIds_.insert(static_cast<int>(matId));
}
}

std::vector<int> materialMap(uniqueMaterialIds_.begin(),
uniqueMaterialIds_.end());
materialMapBuffer_.allocUpload(materialMap);

if (mapToConsecutive) {
std::unordered_map<NumericType, unsigned> materialIdMap;
int currentId = 0;
for (auto &uniqueMaterialId : uniqueMaterialIds_) {
Expand All @@ -266,6 +277,7 @@ template <class T, int D> class Trace {
materialIdsBuffer_.allocUpload(materialIdsMapped);
} else {
std::vector<int> materialIdsMapped(launchParams_.numElements);
#pragma omp parallel for
for (int i = 0; i < launchParams_.numElements; i++) {
materialIdsMapped[i] = static_cast<int>(materialIds[i]);
}
Expand Down Expand Up @@ -347,6 +359,7 @@ template <class T, int D> class Trace {
buffer.free();
}
materialIdsBuffer_.free();
materialMapBuffer_.free();
for (auto &buffer : materialStickingBuffer_) {
buffer.free();
}
Expand Down Expand Up @@ -749,6 +762,7 @@ template <class T, int D> class Trace {
std::vector<Particle<T>> particles_;
CudaBuffer dataPerParticleBuffer_; // same for all particles
std::vector<CudaBuffer> materialStickingBuffer_; // different for particles
CudaBuffer materialMapBuffer_;

// sbt data
CudaBuffer cellDataBuffer_;
Expand Down