commit 7b25850885890e45e21b83f3c031acdd9fd6481a
parent a6c78644de5d314813a68a48f0a365dddc968e58
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 6 Oct 2016 14:54:46 +0200
Create the Embree handle of a scene only if RT is required
Do not create the Embree scene on a scene view created without the
S3D_TRACE flag. This drastically reduces the memory when a lot of scene
views are created (e.g. several instantiated scenes) since the Embree
scene handle is quite heavy.
Diffstat:
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/src/s3d_scene_view.c b/src/s3d_scene_view.c
@@ -319,10 +319,27 @@ static INLINE res_T
scene_view_setup_embree(struct s3d_scene_view* scnview)
{
struct htable_geom_iterator it, end;
+ const RTCSceneFlags rtc_scene_mask =
+ RTC_SCENE_DYNAMIC
+ | RTC_SCENE_INCOHERENT
+ | RTC_SCENE_ROBUST;
+ const RTCAlgorithmFlags rtc_algorithm_mask =
+ RTC_INTERSECT1
+ | RTC_INTERSECT4;
int rtc_outdated = 0;
res_T res = RES_OK;
ASSERT(scnview);
+ /* The rtc_scn could be already allocated since the scene views are cached */
+ if(!scnview->rtc_scn) {
+ scnview->rtc_scn = rtcDeviceNewScene
+ (scnview->scn->dev->rtc, rtc_scene_mask, rtc_algorithm_mask);
+ if(!scnview->rtc_scn) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ }
+
htable_geom_begin(&scnview->cached_geoms, &it);
htable_geom_end(&scnview->cached_geoms, &end);
@@ -365,6 +382,10 @@ scene_view_setup_embree(struct s3d_scene_view* scnview)
exit:
return res;
error:
+ if(scnview->rtc_scn) {
+ scnview->rtc_scn = NULL;
+ rtcDeleteScene(scnview->rtc_scn);
+ }
darray_geom_clear(&scnview->embree2geoms);
goto exit;
}
@@ -809,14 +830,6 @@ scene_view_create(struct s3d_scene* scn, struct s3d_scene_view** out_scnview)
list_del(&scnview->node);
ref_get(&scnview->ref);
} else {
- const RTCSceneFlags rtc_scene_mask =
- RTC_SCENE_DYNAMIC
- | RTC_SCENE_INCOHERENT
- | RTC_SCENE_ROBUST;
- const RTCAlgorithmFlags rtc_algorithm_mask =
- RTC_INTERSECT1
- | RTC_INTERSECT4;
-
scnview = (struct s3d_scene_view*)MEM_CALLOC
(scn->dev->allocator, 1, sizeof(struct s3d_scene_view));
if(!scnview) {
@@ -833,13 +846,6 @@ scene_view_create(struct s3d_scene* scn, struct s3d_scene_view** out_scnview)
f3_splat(scnview->upper,-FLT_MAX);
ref_init(&scnview->ref);
- scnview->rtc_scn = rtcDeviceNewScene
- (scn->dev->rtc, rtc_scene_mask, rtc_algorithm_mask);
- if(!scnview->rtc_scn) {
- res = RES_MEM_ERR;
- goto error;
- }
-
CLBK_INIT(&scnview->on_shape_detach_cb);
CLBK_SETUP(&scnview->on_shape_detach_cb, on_shape_detach, scnview);
SIG_CONNECT_CLBK(&scn->sig_shape_detach, &scnview->on_shape_detach_cb);