/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const int width, const int height, const float time, const Vec3fa& vx, const Vec3fa& vy, const Vec3fa& vz, const Vec3fa& p) { /* recompute levels */ updateEdgeLevelBuffer(g_scene,0,p); /* rebuild scene */ #if !defined(PARALLEL_COMMIT) rtcCommit (g_scene); #else launch[ getNumHWThreads() ] parallelCommit(g_scene); #endif /* render image */ const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; launch_renderTile(numTilesX*numTilesY,pixels,width,height,time,vx,vy,vz,p,numTilesX,numTilesY); rtcDebug(); }
void updateEdgeLevels(ISPCScene* scene_in, const Vec3fa& cam_pos) { /* first update small meshes */ #if defined(ISPC) parallel_for(size_t(0),size_t( scene_in->numGeometries ),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) updateMeshEdgeLevelBufferTask((int)i,threadIndex,scene_in,cam_pos); }); #endif /* now update large meshes */ for (size_t g=0; g<scene_in->numGeometries; g++) { ISPCGeometry* geometry = g_ispc_scene->geometries[g]; if (geometry->type != SUBDIV_MESH) continue; ISPCSubdivMesh* mesh = (ISPCSubdivMesh*) geometry; #if defined(ISPC) if (mesh->numFaces < 10000) continue; parallel_for(size_t(0),size_t( (mesh->numFaces+4095)/4096 ),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) updateSubMeshEdgeLevelBufferTask((int)i,threadIndex,mesh,cam_pos); }); #else updateEdgeLevelBuffer(mesh,cam_pos,0,mesh->numFaces); #endif rtcUpdateBuffer(g_scene,mesh->geom.geomID,RTC_LEVEL_BUFFER); } }
void updateSubMeshEdgeLevelBufferTask (int taskIndex, int threadIndex, ISPCSubdivMesh* mesh, const Vec3fa& cam_pos ) { const size_t size = mesh->numFaces; const size_t startID = ((taskIndex+0)*size)/taskCount; const size_t endID = ((taskIndex+1)*size)/taskCount; updateEdgeLevelBuffer(mesh,cam_pos,startID,endID); }
void updateMeshEdgeLevelBufferTask (int taskIndex, int threadIndex, ISPCScene* scene_in, const Vec3fa& cam_pos ) { ISPCGeometry* geometry = g_ispc_scene->geometries[taskIndex]; if (geometry->type != SUBDIV_MESH) return; ISPCSubdivMesh* mesh = (ISPCSubdivMesh*) geometry; unsigned int geomID = mesh->geom.geomID; if (mesh->numFaces < 10000) { updateEdgeLevelBuffer(mesh,cam_pos,0,mesh->numFaces); rtcUpdateBuffer(g_scene,mesh->geom.geomID,RTC_LEVEL_BUFFER); } }