scene.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "default.h"
  5. #include "device.h"
  6. #include "builder.h"
  7. #include "scene_triangle_mesh.h"
  8. #include "scene_quad_mesh.h"
  9. #include "scene_user_geometry.h"
  10. #include "scene_instance.h"
  11. #include "scene_instance_array.h"
  12. #include "scene_curves.h"
  13. #include "scene_line_segments.h"
  14. #include "scene_subdiv_mesh.h"
  15. #include "scene_grid_mesh.h"
  16. #include "scene_points.h"
  17. #include "../subdiv/tessellation_cache.h"
  18. #include "acceln.h"
  19. #include "geometry.h"
  20. #if defined(EMBREE_SYCL_SUPPORT)
  21. #include "../sycl/rthwif_embree_builder.h"
  22. #endif
  23. #if !defined(EMBREE_SYCL_SUPPORT)
  24. namespace sycl {
  25. struct queue;
  26. }
  27. #endif
  28. namespace embree
  29. {
  30. struct TaskGroup;
  31. /*! Base class all scenes are derived from */
  32. class __aligned(16) Scene : public AccelN
  33. {
  34. public:
  35. template<typename Ty, bool mblur = false>
  36. class Iterator
  37. {
  38. public:
  39. Iterator () {}
  40. Iterator (Scene* scene, bool all = false)
  41. : scene(scene), all(all) {}
  42. __forceinline Ty* at(const size_t i)
  43. {
  44. Geometry* geom = scene->geometries[i].ptr;
  45. if (geom == nullptr) return nullptr;
  46. if (!all && !geom->isEnabled()) return nullptr;
  47. const size_t mask = geom->getTypeMask() & Ty::geom_type;
  48. if (!(mask)) return nullptr;
  49. if ((geom->numTimeSteps != 1) != mblur) return nullptr;
  50. return (Ty*) geom;
  51. }
  52. __forceinline Ty* operator[] (const size_t i) {
  53. return at(i);
  54. }
  55. __forceinline size_t numPrimitives() const {
  56. return scene->getNumPrimitives(Ty::geom_type,mblur);
  57. }
  58. __forceinline size_t maxPrimitivesPerGeometry()
  59. {
  60. size_t ret = 0;
  61. for (size_t i=0; i<scene->size(); i++) {
  62. Ty* mesh = at(i);
  63. if (mesh == nullptr) continue;
  64. ret = max(ret,mesh->size());
  65. }
  66. return ret;
  67. }
  68. __forceinline unsigned int maxGeomID()
  69. {
  70. unsigned int ret = 0;
  71. for (size_t i=0; i<scene->size(); i++) {
  72. Ty* mesh = at(i);
  73. if (mesh == nullptr) continue;
  74. ret = max(ret,(unsigned int)i);
  75. }
  76. return ret;
  77. }
  78. __forceinline unsigned maxTimeStepsPerGeometry()
  79. {
  80. unsigned ret = 0;
  81. for (size_t i=0; i<scene->size(); i++) {
  82. Ty* mesh = at(i);
  83. if (mesh == nullptr) continue;
  84. ret = max(ret,mesh->numTimeSteps);
  85. }
  86. return ret;
  87. }
  88. __forceinline size_t size() const {
  89. return scene->size();
  90. }
  91. private:
  92. Scene* scene;
  93. bool all;
  94. };
  95. class Iterator2
  96. {
  97. public:
  98. Iterator2 () {}
  99. Iterator2 (Scene* scene, Geometry::GTypeMask typemask, bool mblur)
  100. : scene(scene), typemask(typemask), mblur(mblur) {}
  101. __forceinline Geometry* at(const size_t i)
  102. {
  103. Geometry* geom = scene->geometries[i].ptr;
  104. if (geom == nullptr) return nullptr;
  105. if (!geom->isEnabled()) return nullptr;
  106. if (!(geom->getTypeMask() & typemask)) return nullptr;
  107. if ((geom->numTimeSteps != 1) != mblur) return nullptr;
  108. return geom;
  109. }
  110. __forceinline Geometry* operator[] (const size_t i) {
  111. return at(i);
  112. }
  113. __forceinline size_t size() const {
  114. return scene->size();
  115. }
  116. private:
  117. Scene* scene;
  118. Geometry::GTypeMask typemask;
  119. bool mblur;
  120. };
  121. public:
  122. /*! Scene construction */
  123. Scene (Device* device);
  124. /*! Scene destruction */
  125. ~Scene () noexcept;
  126. private:
  127. /*! class is non-copyable */
  128. Scene (const Scene& other) DELETED; // do not implement
  129. Scene& operator= (const Scene& other) DELETED; // do not implement
  130. public:
  131. void createTriangleAccel();
  132. void createTriangleMBAccel();
  133. void createQuadAccel();
  134. void createQuadMBAccel();
  135. void createHairAccel();
  136. void createHairMBAccel();
  137. void createSubdivAccel();
  138. void createSubdivMBAccel();
  139. void createUserGeometryAccel();
  140. void createUserGeometryMBAccel();
  141. void createInstanceAccel();
  142. void createInstanceMBAccel();
  143. void createInstanceExpensiveAccel();
  144. void createInstanceExpensiveMBAccel();
  145. void createInstanceArrayAccel();
  146. void createInstanceArrayMBAccel();
  147. void createGridAccel();
  148. void createGridMBAccel();
  149. /*! prints statistics about the scene */
  150. void printStatistics();
  151. /*! clears the scene */
  152. void clear();
  153. /*! detaches some geometry */
  154. void detachGeometry(size_t geomID);
  155. void setBuildQuality(RTCBuildQuality quality_flags);
  156. RTCBuildQuality getBuildQuality() const;
  157. void setSceneFlags(RTCSceneFlags scene_flags);
  158. RTCSceneFlags getSceneFlags() const;
  159. void build_cpu_accels();
  160. void build_gpu_accels();
  161. void commit_internal (bool join);
  162. #if defined(EMBREE_SYCL_SUPPORT)
  163. sycl::event commit (bool join, sycl::queue queue);
  164. #endif
  165. void commit (bool join);
  166. void commit_task ();
  167. void build () {}
  168. Scene* getTraversable();
  169. /* return number of geometries */
  170. #if defined(__SYCL_DEVICE_ONLY__)
  171. __forceinline size_t size() const { return num_geometries; }
  172. #else
  173. __forceinline size_t size() const { return geometries.size(); }
  174. #endif
  175. /* bind geometry to the scene */
  176. unsigned int bind (unsigned geomID, Ref<Geometry> geometry);
  177. /* determines if scene is modified */
  178. __forceinline bool isModified() const { return modified; }
  179. /* sets modified flag */
  180. __forceinline void setModified(bool f = true) {
  181. modified = f;
  182. }
  183. __forceinline bool hasMotionBlur() const { return maxTimeSegments > 1; };
  184. __forceinline uint32_t getMaxTimeSegments() const { return maxTimeSegments; };
  185. #if !defined(__SYCL_DEVICE_ONLY__)
  186. __forceinline bool isGeometryModified(size_t geomID)
  187. {
  188. Ref<Geometry>& g = geometries[geomID];
  189. if (!g) return false;
  190. return g->getModCounter() > geometryModCounters_[geomID];
  191. }
  192. #endif
  193. protected:
  194. void checkIfModifiedAndSet ();
  195. public:
  196. #if defined(__SYCL_DEVICE_ONLY__)
  197. /* get mesh by ID */
  198. __forceinline Geometry* get(size_t i) { return geometries_device[i]; }
  199. __forceinline const Geometry* get(size_t i) const { return geometries_device[i]; }
  200. template<typename Mesh>
  201. __forceinline Mesh* get(size_t i) {
  202. return (Mesh*)geometries_device[i];
  203. }
  204. template<typename Mesh>
  205. __forceinline const Mesh* get(size_t i) const {
  206. return (Mesh*)geometries_device[i];
  207. }
  208. template<typename Mesh>
  209. __forceinline Mesh* getSafe(size_t i) {
  210. if (geometries_device[i] == nullptr) return nullptr;
  211. if (!(geometries_device[i]->getTypeMask() & Mesh::geom_type)) return nullptr;
  212. else return (Mesh*) geometries_device[i];
  213. }
  214. #else
  215. /* get mesh by ID */
  216. __forceinline Geometry* get(size_t i) { assert(i < geometries.size()); return geometries[i].ptr; }
  217. __forceinline const Geometry* get(size_t i) const { assert(i < geometries.size()); return geometries[i].ptr; }
  218. template<typename Mesh>
  219. __forceinline Mesh* get(size_t i) {
  220. assert(i < geometries.size());
  221. assert(geometries[i]->getTypeMask() & Mesh::geom_type);
  222. return (Mesh*)geometries[i].ptr;
  223. }
  224. template<typename Mesh>
  225. __forceinline const Mesh* get(size_t i) const {
  226. assert(i < geometries.size());
  227. assert(geometries[i]->getTypeMask() & Mesh::geom_type);
  228. return (Mesh*)geometries[i].ptr;
  229. }
  230. template<typename Mesh>
  231. __forceinline Mesh* getSafe(size_t i) {
  232. assert(i < geometries.size());
  233. if (geometries[i] == null) return nullptr;
  234. if (!(geometries[i]->getTypeMask() & Mesh::geom_type)) return nullptr;
  235. else return (Mesh*) geometries[i].ptr;
  236. }
  237. #endif
  238. #if !defined(__SYCL_DEVICE_ONLY__)
  239. __forceinline Ref<Geometry> get_locked(size_t i) {
  240. Lock<MutexSys> lock(geometriesMutex);
  241. assert(i < geometries.size());
  242. return geometries[i];
  243. }
  244. #endif
  245. /* flag decoding */
  246. __forceinline bool isFastAccel() const { return !isCompactAccel() && !isRobustAccel(); }
  247. __forceinline bool isCompactAccel() const { return scene_flags & RTC_SCENE_FLAG_COMPACT; }
  248. __forceinline bool isRobustAccel() const { return scene_flags & RTC_SCENE_FLAG_ROBUST; }
  249. __forceinline bool isStaticAccel() const { return !(scene_flags & RTC_SCENE_FLAG_DYNAMIC); }
  250. __forceinline bool isDynamicAccel() const { return scene_flags & RTC_SCENE_FLAG_DYNAMIC; }
  251. __forceinline bool hasArgumentFilterFunction() const {
  252. return scene_flags & RTC_SCENE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS;
  253. }
  254. __forceinline bool hasGeometryFilterFunction() {
  255. return world.numFilterFunctions != 0;
  256. }
  257. __forceinline bool hasFilterFunction() {
  258. return hasArgumentFilterFunction() || hasGeometryFilterFunction();
  259. }
  260. void* createQBVH6Accel();
  261. #if defined(EMBREE_SYCL_SUPPORT)
  262. private:
  263. void syncWithDevice();
  264. sycl::event syncWithDevice(sycl::queue queue);
  265. #endif
  266. public:
  267. Device* device;
  268. Scene* scene_device;
  269. public:
  270. IDPool<unsigned,0xFFFFFFFE> id_pool;
  271. Device::vector<Ref<Geometry>> geometries = device; //!< list of all user geometries
  272. avector<unsigned int> geometryModCounters_;
  273. Device::vector<float*> vertices = device;
  274. public:
  275. /* these are to detect if we need to recreate the acceleration structures */
  276. bool flags_modified;
  277. unsigned int enabled_geometry_types;
  278. RTCSceneFlags scene_flags;
  279. RTCBuildQuality quality_flags;
  280. MutexSys buildMutex;
  281. MutexSys geometriesMutex;
  282. #if defined(EMBREE_SYCL_SUPPORT)
  283. public:
  284. AccelBuffer accelBuffer;
  285. #endif
  286. private:
  287. bool modified; //!< true if scene got modified
  288. uint32_t maxTimeSegments; //!< maximal number of motion blur time segments in scene
  289. #if defined(EMBREE_SYCL_SUPPORT)
  290. Geometry** geometries_device; //!< list of all geometries on device
  291. char* geometry_data_device; //!< data buffer of all geometries on device
  292. size_t num_geometries;
  293. size_t geometry_data_byte_size;
  294. // host buffers used for creating representation of scene/geometry for device
  295. // will be freed after scene commit if the scene is static, otherwise the
  296. // buffers will stay for quicker rebuild.
  297. size_t *offsets;
  298. Geometry **geometries_host;
  299. char *geometry_data_host;
  300. #endif
  301. public:
  302. std::unique_ptr<TaskGroup> taskGroup;
  303. public:
  304. struct BuildProgressMonitorInterface : public BuildProgressMonitor {
  305. BuildProgressMonitorInterface(Scene* scene)
  306. : scene(scene) {}
  307. void operator() (size_t dn) const { scene->progressMonitor(double(dn)); }
  308. private:
  309. Scene* scene;
  310. };
  311. BuildProgressMonitorInterface progressInterface;
  312. RTCProgressMonitorFunction progress_monitor_function;
  313. void* progress_monitor_ptr;
  314. std::atomic<size_t> progress_monitor_counter;
  315. void progressMonitor(double nprims);
  316. void setProgressMonitorFunction(RTCProgressMonitorFunction func, void* ptr);
  317. private:
  318. GeometryCounts world; //!< counts for geometry
  319. public:
  320. __forceinline size_t numPrimitives() const {
  321. return world.size();
  322. }
  323. __forceinline size_t getNumPrimitives(Geometry::GTypeMask mask, bool mblur) const
  324. {
  325. size_t count = 0;
  326. if (mask & Geometry::MTY_TRIANGLE_MESH)
  327. count += mblur ? world.numMBTriangles : world.numTriangles;
  328. if (mask & Geometry::MTY_QUAD_MESH)
  329. count += mblur ? world.numMBQuads : world.numQuads;
  330. if (mask & Geometry::MTY_CURVE2)
  331. count += mblur ? world.numMBLineSegments : world.numLineSegments;
  332. if (mask & Geometry::MTY_CURVE4)
  333. count += mblur ? world.numMBBezierCurves : world.numBezierCurves;
  334. if (mask & Geometry::MTY_POINTS)
  335. count += mblur ? world.numMBPoints : world.numPoints;
  336. if (mask & Geometry::MTY_SUBDIV_MESH)
  337. count += mblur ? world.numMBSubdivPatches : world.numSubdivPatches;
  338. if (mask & Geometry::MTY_USER_GEOMETRY)
  339. count += mblur ? world.numMBUserGeometries : world.numUserGeometries;
  340. if (mask & Geometry::MTY_INSTANCE_CHEAP)
  341. count += mblur ? world.numMBInstancesCheap : world.numInstancesCheap;
  342. if (mask & Geometry::MTY_INSTANCE_EXPENSIVE)
  343. count += mblur ? world.numMBInstancesExpensive : world.numInstancesExpensive;
  344. if (mask & Geometry::MTY_INSTANCE_ARRAY)
  345. count += mblur ? world.numMBInstanceArrays : world.numInstanceArrays;
  346. if (mask & Geometry::MTY_GRID_MESH)
  347. count += mblur ? world.numMBGrids : world.numGrids;
  348. return count;
  349. }
  350. __forceinline size_t getNumSubPrimitives(Geometry::GTypeMask mask, bool mblur) const
  351. {
  352. size_t count = 0;
  353. if (mask & Geometry::MTY_GRID_MESH)
  354. count += mblur ? world.numMBSubGrids : world.numSubGrids;
  355. Geometry::GTypeMask new_mask = (Geometry::GTypeMask)(mask & ~Geometry::MTY_GRID_MESH);
  356. count += getNumPrimitives(new_mask, mblur);
  357. return count;
  358. }
  359. template<typename Mesh, bool mblur>
  360. __forceinline unsigned getNumTimeSteps()
  361. {
  362. if (!mblur)
  363. return 1;
  364. Scene::Iterator<Mesh,mblur> iter(this);
  365. return iter.maxTimeStepsPerGeometry();
  366. }
  367. template<typename Mesh, bool mblur>
  368. __forceinline unsigned int getMaxGeomID()
  369. {
  370. Scene::Iterator<Mesh,mblur> iter(this);
  371. return iter.maxGeomID();
  372. }
  373. };
  374. }