예제 #1
0
 MultiThreadedSplitter<Heuristic,PrimRefBlockList>::MultiThreadedSplitter(size_t threadIndex, size_t threadCount, TaskScheduler::Event* event, 
                                                                          PrimRefAlloc* alloc, const RTCGeometry* geom,
                                                                          PrimRefBlockList& prims_i, const PrimInfo& pinfo, const Split& split, 
                                                                          TaskScheduler::completeFunction cfun, void* cptr)
   : alloc(alloc), prims(prims_i), pinfo(pinfo), split(split), geom(geom), cfun(cfun), cptr(cptr)
 {
   /* if split was not successfull enforce some split */
   if (unlikely(split.linfo.size() == 0 || split.rinfo.size() == 0)) {
     FallBackSplitter<Heuristic,PrimRefBlockList>::split(threadIndex,alloc,geom,prims,pinfo,lprims,linfo,lsplit,rprims,rinfo,rsplit);
     cfun(cptr,threadIndex,threadCount,event);
   } 
   /* perform spatial split */
   else if (unlikely(split.spatial())) 
   {
     new (&task) TaskScheduler::Task(event,
                                     _task_split_parallel_spatial,this,numTasks,
                                     _task_split_parallel_reduce,this,
                                     "build::parsplit");
     TaskScheduler::addTask(threadIndex,TaskScheduler::GLOBAL_FRONT,&task);
   }
   /* otherwise perform normal split */
   else {
     new (&task) TaskScheduler::Task(event,
                                     _task_split_parallel,       this,numTasks,
                                     _task_split_parallel_reduce,this,
                                     "build::parsplit");
     TaskScheduler::addTask(threadIndex,TaskScheduler::GLOBAL_FRONT,&task);
   }
 }
예제 #2
0
파일: splitter.cpp 프로젝트: GHF/trayrace
 Splitter<Heuristic>::Splitter (const TaskScheduler::ThreadInfo& thread, PrimRefAlloc* alloc, const BuildTriangle* triangles, const Vec3fa* vertices,
                                atomic_set<PrimRefBlock>& prims, const PrimInfo& pinfo, const Split& psplit)
 {
   /* if split was not successfull enforce some split */
   if (unlikely(psplit.linfo.size() == 0 || psplit.rinfo.size() == 0)) {
     FallBackSplitter<Heuristic,atomic_set<PrimRefBlock> >::split(thread,alloc,triangles,vertices,prims,pinfo,lprims,linfo,lsplit,rprims,rinfo,rsplit);
   }
   /* split with support for duplications */
   else if (unlikely(psplit.spatial())) {
     split_spatial(thread,alloc,triangles,vertices,prims,pinfo,psplit);
   }
   /* otherwise perform normal split */
   else {
     split(thread,alloc,triangles,vertices,prims,pinfo,psplit);
   }
 }
예제 #3
0
 Splitter<Heuristic>::Splitter (size_t thread, PrimRefAlloc* alloc, const RTCGeometry* geom,
                                atomic_set<PrimRefBlock>& prims, const PrimInfo& pinfo, const Split& psplit)
 {
   /* if split was not successfull enforce some split */
   if (unlikely(psplit.linfo.size() == 0 || psplit.rinfo.size() == 0)) {
     FallBackSplitter<Heuristic,atomic_set<PrimRefBlock> >::split(thread,alloc,geom,prims,pinfo,lprims,linfo,lsplit,rprims,rinfo,rsplit);
   }
   /* split with support for duplications */
   else if (unlikely(psplit.spatial())) {
     split_spatial(thread,alloc,geom,prims,pinfo,psplit);
   }
   /* otherwise perform normal split */
   else {
     split(thread,alloc,geom,prims,pinfo,psplit);
   }
   assert(linfo.size());
   assert(rinfo.size());
 }