123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 |
- // Copyright 2009-2021 Intel Corporation
- // SPDX-License-Identifier: Apache-2.0
-
- #pragma once
- #include "default.h"
- #include "device.h"
- #include "builder.h"
- #include "scene_triangle_mesh.h"
- #include "scene_quad_mesh.h"
- #include "scene_user_geometry.h"
- #include "scene_instance.h"
- #include "scene_instance_array.h"
- #include "scene_curves.h"
- #include "scene_line_segments.h"
- #include "scene_subdiv_mesh.h"
- #include "scene_grid_mesh.h"
- #include "scene_points.h"
- #include "../subdiv/tessellation_cache.h"
- #include "acceln.h"
- #include "geometry.h"
- #if defined(EMBREE_SYCL_SUPPORT)
- #include "../sycl/rthwif_embree_builder.h"
- #endif
- #if !defined(EMBREE_SYCL_SUPPORT)
- namespace sycl {
- struct queue;
- }
- #endif
- namespace embree
- {
- struct TaskGroup;
- /*! Base class all scenes are derived from */
- class __aligned(16) Scene : public AccelN
- {
- public:
- template<typename Ty, bool mblur = false>
- class Iterator
- {
- public:
- Iterator () {}
-
- Iterator (Scene* scene, bool all = false)
- : scene(scene), all(all) {}
-
- __forceinline Ty* at(const size_t i)
- {
- Geometry* geom = scene->geometries[i].ptr;
- if (geom == nullptr) return nullptr;
- if (!all && !geom->isEnabled()) return nullptr;
- const size_t mask = geom->getTypeMask() & Ty::geom_type;
- if (!(mask)) return nullptr;
- if ((geom->numTimeSteps != 1) != mblur) return nullptr;
- return (Ty*) geom;
- }
- __forceinline Ty* operator[] (const size_t i) {
- return at(i);
- }
- __forceinline size_t numPrimitives() const {
- return scene->getNumPrimitives(Ty::geom_type,mblur);
- }
- __forceinline size_t maxPrimitivesPerGeometry()
- {
- size_t ret = 0;
- for (size_t i=0; i<scene->size(); i++) {
- Ty* mesh = at(i);
- if (mesh == nullptr) continue;
- ret = max(ret,mesh->size());
- }
- return ret;
- }
- __forceinline unsigned int maxGeomID()
- {
- unsigned int ret = 0;
- for (size_t i=0; i<scene->size(); i++) {
- Ty* mesh = at(i);
- if (mesh == nullptr) continue;
- ret = max(ret,(unsigned int)i);
- }
- return ret;
- }
- __forceinline unsigned maxTimeStepsPerGeometry()
- {
- unsigned ret = 0;
- for (size_t i=0; i<scene->size(); i++) {
- Ty* mesh = at(i);
- if (mesh == nullptr) continue;
- ret = max(ret,mesh->numTimeSteps);
- }
- return ret;
- }
- __forceinline size_t size() const {
- return scene->size();
- }
-
-
- private:
- Scene* scene;
- bool all;
- };
- class Iterator2
- {
- public:
- Iterator2 () {}
-
- Iterator2 (Scene* scene, Geometry::GTypeMask typemask, bool mblur)
- : scene(scene), typemask(typemask), mblur(mblur) {}
-
- __forceinline Geometry* at(const size_t i)
- {
- Geometry* geom = scene->geometries[i].ptr;
- if (geom == nullptr) return nullptr;
- if (!geom->isEnabled()) return nullptr;
- if (!(geom->getTypeMask() & typemask)) return nullptr;
- if ((geom->numTimeSteps != 1) != mblur) return nullptr;
- return geom;
- }
- __forceinline Geometry* operator[] (const size_t i) {
- return at(i);
- }
- __forceinline size_t size() const {
- return scene->size();
- }
-
- private:
- Scene* scene;
- Geometry::GTypeMask typemask;
- bool mblur;
- };
- public:
-
- /*! Scene construction */
- Scene (Device* device);
- /*! Scene destruction */
- ~Scene () noexcept;
- private:
-
- /*! class is non-copyable */
- Scene (const Scene& other) DELETED; // do not implement
- Scene& operator= (const Scene& other) DELETED; // do not implement
- public:
- void createTriangleAccel();
- void createTriangleMBAccel();
- void createQuadAccel();
- void createQuadMBAccel();
- void createHairAccel();
- void createHairMBAccel();
- void createSubdivAccel();
- void createSubdivMBAccel();
- void createUserGeometryAccel();
- void createUserGeometryMBAccel();
- void createInstanceAccel();
- void createInstanceMBAccel();
- void createInstanceExpensiveAccel();
- void createInstanceExpensiveMBAccel();
- void createInstanceArrayAccel();
- void createInstanceArrayMBAccel();
- void createGridAccel();
- void createGridMBAccel();
- /*! prints statistics about the scene */
- void printStatistics();
- /*! clears the scene */
- void clear();
- /*! detaches some geometry */
- void detachGeometry(size_t geomID);
- void setBuildQuality(RTCBuildQuality quality_flags);
- RTCBuildQuality getBuildQuality() const;
-
- void setSceneFlags(RTCSceneFlags scene_flags);
- RTCSceneFlags getSceneFlags() const;
- void build_cpu_accels();
- void build_gpu_accels();
- void commit_internal (bool join);
- #if defined(EMBREE_SYCL_SUPPORT)
- sycl::event commit (bool join, sycl::queue queue);
- #endif
- void commit (bool join);
- void commit_task ();
- void build () {}
- Scene* getTraversable();
- /* return number of geometries */
- #if defined(__SYCL_DEVICE_ONLY__)
- __forceinline size_t size() const { return num_geometries; }
- #else
- __forceinline size_t size() const { return geometries.size(); }
- #endif
-
- /* bind geometry to the scene */
- unsigned int bind (unsigned geomID, Ref<Geometry> geometry);
-
- /* determines if scene is modified */
- __forceinline bool isModified() const { return modified; }
- /* sets modified flag */
- __forceinline void setModified(bool f = true) {
- modified = f;
- }
- __forceinline bool hasMotionBlur() const { return maxTimeSegments > 1; };
- __forceinline uint32_t getMaxTimeSegments() const { return maxTimeSegments; };
- #if !defined(__SYCL_DEVICE_ONLY__)
- __forceinline bool isGeometryModified(size_t geomID)
- {
- Ref<Geometry>& g = geometries[geomID];
- if (!g) return false;
- return g->getModCounter() > geometryModCounters_[geomID];
- }
- #endif
- protected:
- void checkIfModifiedAndSet ();
- public:
- #if defined(__SYCL_DEVICE_ONLY__)
- /* get mesh by ID */
- __forceinline Geometry* get(size_t i) { return geometries_device[i]; }
- __forceinline const Geometry* get(size_t i) const { return geometries_device[i]; }
- template<typename Mesh>
- __forceinline Mesh* get(size_t i) {
- return (Mesh*)geometries_device[i];
- }
- template<typename Mesh>
- __forceinline const Mesh* get(size_t i) const {
- return (Mesh*)geometries_device[i];
- }
- template<typename Mesh>
- __forceinline Mesh* getSafe(size_t i) {
- if (geometries_device[i] == nullptr) return nullptr;
- if (!(geometries_device[i]->getTypeMask() & Mesh::geom_type)) return nullptr;
- else return (Mesh*) geometries_device[i];
- }
- #else
- /* get mesh by ID */
- __forceinline Geometry* get(size_t i) { assert(i < geometries.size()); return geometries[i].ptr; }
- __forceinline const Geometry* get(size_t i) const { assert(i < geometries.size()); return geometries[i].ptr; }
- template<typename Mesh>
- __forceinline Mesh* get(size_t i) {
- assert(i < geometries.size());
- assert(geometries[i]->getTypeMask() & Mesh::geom_type);
- return (Mesh*)geometries[i].ptr;
- }
- template<typename Mesh>
- __forceinline const Mesh* get(size_t i) const {
- assert(i < geometries.size());
- assert(geometries[i]->getTypeMask() & Mesh::geom_type);
- return (Mesh*)geometries[i].ptr;
- }
- template<typename Mesh>
- __forceinline Mesh* getSafe(size_t i) {
- assert(i < geometries.size());
- if (geometries[i] == null) return nullptr;
- if (!(geometries[i]->getTypeMask() & Mesh::geom_type)) return nullptr;
- else return (Mesh*) geometries[i].ptr;
- }
- #endif
- #if !defined(__SYCL_DEVICE_ONLY__)
- __forceinline Ref<Geometry> get_locked(size_t i) {
- Lock<MutexSys> lock(geometriesMutex);
- assert(i < geometries.size());
- return geometries[i];
- }
- #endif
- /* flag decoding */
- __forceinline bool isFastAccel() const { return !isCompactAccel() && !isRobustAccel(); }
- __forceinline bool isCompactAccel() const { return scene_flags & RTC_SCENE_FLAG_COMPACT; }
- __forceinline bool isRobustAccel() const { return scene_flags & RTC_SCENE_FLAG_ROBUST; }
- __forceinline bool isStaticAccel() const { return !(scene_flags & RTC_SCENE_FLAG_DYNAMIC); }
- __forceinline bool isDynamicAccel() const { return scene_flags & RTC_SCENE_FLAG_DYNAMIC; }
-
- __forceinline bool hasArgumentFilterFunction() const {
- return scene_flags & RTC_SCENE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS;
- }
-
- __forceinline bool hasGeometryFilterFunction() {
- return world.numFilterFunctions != 0;
- }
-
- __forceinline bool hasFilterFunction() {
- return hasArgumentFilterFunction() || hasGeometryFilterFunction();
- }
-
- void* createQBVH6Accel();
-
- #if defined(EMBREE_SYCL_SUPPORT)
- private:
- void syncWithDevice();
- sycl::event syncWithDevice(sycl::queue queue);
- #endif
- public:
- Device* device;
- Scene* scene_device;
- public:
- IDPool<unsigned,0xFFFFFFFE> id_pool;
- Device::vector<Ref<Geometry>> geometries = device; //!< list of all user geometries
- avector<unsigned int> geometryModCounters_;
- Device::vector<float*> vertices = device;
-
- public:
- /* these are to detect if we need to recreate the acceleration structures */
- bool flags_modified;
- unsigned int enabled_geometry_types;
-
- RTCSceneFlags scene_flags;
- RTCBuildQuality quality_flags;
- MutexSys buildMutex;
- MutexSys geometriesMutex;
- #if defined(EMBREE_SYCL_SUPPORT)
- public:
- AccelBuffer accelBuffer;
- #endif
-
- private:
- bool modified; //!< true if scene got modified
- uint32_t maxTimeSegments; //!< maximal number of motion blur time segments in scene
- #if defined(EMBREE_SYCL_SUPPORT)
- Geometry** geometries_device; //!< list of all geometries on device
- char* geometry_data_device; //!< data buffer of all geometries on device
- size_t num_geometries;
- size_t geometry_data_byte_size;
- // host buffers used for creating representation of scene/geometry for device
- // will be freed after scene commit if the scene is static, otherwise the
- // buffers will stay for quicker rebuild.
- size_t *offsets;
- Geometry **geometries_host;
- char *geometry_data_host;
- #endif
- public:
- std::unique_ptr<TaskGroup> taskGroup;
-
- public:
- struct BuildProgressMonitorInterface : public BuildProgressMonitor {
- BuildProgressMonitorInterface(Scene* scene)
- : scene(scene) {}
- void operator() (size_t dn) const { scene->progressMonitor(double(dn)); }
- private:
- Scene* scene;
- };
- BuildProgressMonitorInterface progressInterface;
- RTCProgressMonitorFunction progress_monitor_function;
- void* progress_monitor_ptr;
- std::atomic<size_t> progress_monitor_counter;
- void progressMonitor(double nprims);
- void setProgressMonitorFunction(RTCProgressMonitorFunction func, void* ptr);
- private:
- GeometryCounts world; //!< counts for geometry
- public:
- __forceinline size_t numPrimitives() const {
- return world.size();
- }
- __forceinline size_t getNumPrimitives(Geometry::GTypeMask mask, bool mblur) const
- {
- size_t count = 0;
-
- if (mask & Geometry::MTY_TRIANGLE_MESH)
- count += mblur ? world.numMBTriangles : world.numTriangles;
-
- if (mask & Geometry::MTY_QUAD_MESH)
- count += mblur ? world.numMBQuads : world.numQuads;
-
- if (mask & Geometry::MTY_CURVE2)
- count += mblur ? world.numMBLineSegments : world.numLineSegments;
-
- if (mask & Geometry::MTY_CURVE4)
- count += mblur ? world.numMBBezierCurves : world.numBezierCurves;
-
- if (mask & Geometry::MTY_POINTS)
- count += mblur ? world.numMBPoints : world.numPoints;
-
- if (mask & Geometry::MTY_SUBDIV_MESH)
- count += mblur ? world.numMBSubdivPatches : world.numSubdivPatches;
-
- if (mask & Geometry::MTY_USER_GEOMETRY)
- count += mblur ? world.numMBUserGeometries : world.numUserGeometries;
-
- if (mask & Geometry::MTY_INSTANCE_CHEAP)
- count += mblur ? world.numMBInstancesCheap : world.numInstancesCheap;
-
- if (mask & Geometry::MTY_INSTANCE_EXPENSIVE)
- count += mblur ? world.numMBInstancesExpensive : world.numInstancesExpensive;
- if (mask & Geometry::MTY_INSTANCE_ARRAY)
- count += mblur ? world.numMBInstanceArrays : world.numInstanceArrays;
- if (mask & Geometry::MTY_GRID_MESH)
- count += mblur ? world.numMBGrids : world.numGrids;
-
- return count;
- }
- __forceinline size_t getNumSubPrimitives(Geometry::GTypeMask mask, bool mblur) const
- {
- size_t count = 0;
-
- if (mask & Geometry::MTY_GRID_MESH)
- count += mblur ? world.numMBSubGrids : world.numSubGrids;
- Geometry::GTypeMask new_mask = (Geometry::GTypeMask)(mask & ~Geometry::MTY_GRID_MESH);
- count += getNumPrimitives(new_mask, mblur);
-
- return count;
- }
-
- template<typename Mesh, bool mblur>
- __forceinline unsigned getNumTimeSteps()
- {
- if (!mblur)
- return 1;
- Scene::Iterator<Mesh,mblur> iter(this);
- return iter.maxTimeStepsPerGeometry();
- }
- template<typename Mesh, bool mblur>
- __forceinline unsigned int getMaxGeomID()
- {
- Scene::Iterator<Mesh,mblur> iter(this);
- return iter.maxGeomID();
- }
- };
- }
|