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); } }
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); } }
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()); }