[Bf-blender-cvs] [5d534f947d8] soc-2019-npr: LANPR: hide render_buffer from SceneLANPR, implemented copy and free functions. No memory leaks on software mode now.
Yiming Wu
noreply at git.blender.org
Mon Jun 10 10:15:23 CEST 2019
Commit: 5d534f947d802f86df6271ee54185540dc12216a
Author: Yiming Wu
Date: Mon Jun 10 16:15:11 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB5d534f947d802f86df6271ee54185540dc12216a
LANPR: hide render_buffer from SceneLANPR, implemented copy and free functions. No memory leaks on software mode now.
===================================================================
M source/blender/blenkernel/intern/scene.c
M source/blender/blenloader/intern/readfile.c
M source/blender/draw/engines/lanpr/lanpr_access.c
M source/blender/draw/engines/lanpr/lanpr_access.h
M source/blender/draw/engines/lanpr/lanpr_all.h
M source/blender/draw/engines/lanpr/lanpr_dpix.c
M source/blender/draw/engines/lanpr/lanpr_engine.c
M source/blender/draw/engines/lanpr/lanpr_ops.c
M source/blender/makesdna/DNA_scene_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 34aef80f88f..0768279724f 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -95,6 +95,8 @@
#include "engines/eevee/eevee_lightcache.h"
+#include "engines/lanpr/lanpr_access.h"
+
#include "PIL_time.h"
#include "IMB_colormanagement.h"
@@ -333,6 +335,11 @@ void BKE_scene_copy_data(Main *bmain, Scene *sce_dst, const Scene *sce_src, cons
sce_dst->eevee.light_cache = NULL;
sce_dst->eevee.light_cache_info[0] = '\0';
/* TODO Copy the cache. */
+
+ /* lanpr data */
+
+ lanpr_copy_data(sce_src,sce_dst);
+
}
Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
@@ -542,6 +549,8 @@ void BKE_scene_free_ex(Scene *sce, const bool do_id_user)
sce->eevee.light_cache = NULL;
}
+ lanpr_free_everything(sce);
+
/* These are freed on doversion. */
BLI_assert(sce->layer_properties == NULL);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 26b3bb2b971..2bf7bfa109a 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6988,7 +6988,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
/* LANPR things */
sce->lanpr.active_layer = newdataadr(fd, sce->lanpr.active_layer);
- sce->lanpr.render_buffer = NULL;
link_list(fd, &sce->lanpr.line_layers);
for (LANPR_LineLayer *ll = sce->lanpr.line_layers.first; ll; ll = ll->next) {
link_list(fd, &ll->components);
diff --git a/source/blender/draw/engines/lanpr/lanpr_access.c b/source/blender/draw/engines/lanpr/lanpr_access.c
index e17daec4a48..fb3b34d7b35 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.c
+++ b/source/blender/draw/engines/lanpr/lanpr_access.c
@@ -25,6 +25,8 @@
#include "lanpr_all.h"
#include "lanpr_access.h"
+extern LANPR_SharedResource lanpr_share;
+
static BMVert *split_edge_and_move(BMesh *bm, BMEdge *edge, const float new_pos[3])
{
// Split edge one time and move the created vert to new_pos
@@ -42,7 +44,7 @@ void lanpr_generate_gpencil_geometry(
{
StrokeGpencilModifierData *gpmd = (StrokeGpencilModifierData *)md;
Scene *scene = DEG_get_evaluated_scene(depsgraph);
- LANPR_RenderBuffer *rb = scene->lanpr.render_buffer;
+ LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
if (gpmd->object == NULL) {
printf("NULL object!\n");
@@ -237,7 +239,7 @@ void lanpr_generate_gpencil_from_chain(
{
StrokeGpencilModifierData *gpmd = (StrokeGpencilModifierData *)md;
Scene *scene = DEG_get_evaluated_scene(depsgraph);
- LANPR_RenderBuffer *rb = scene->lanpr.render_buffer;
+ LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
if (rb == NULL) {
printf("NULL LANPR rb!\n");
@@ -288,7 +290,45 @@ void lanpr_update_data_for_external(Depsgraph *depsgraph)
SceneLANPR *lanpr = &scene->lanpr;
if (lanpr->master_mode != LANPR_MASTER_MODE_SOFTWARE)
return;
- if (!lanpr->render_buffer || lanpr->render_buffer->cached_for_frame != scene->r.cfra) {
+ if (!lanpr_share.render_buffer_shared || lanpr_share.render_buffer_shared->cached_for_frame != scene->r.cfra) {
lanpr_compute_feature_lines_internal(depsgraph, lanpr, scene);
}
}
+
+void lanpr_copy_data(Scene* from, Scene* to){
+ SceneLANPR *lanpr= &from->lanpr;
+ LANPR_RenderBuffer* rb = lanpr_share.render_buffer_shared, *new_rb;
+ LANPR_LineLayer* ll,*new_ll;
+ LANPR_LineLayerComponent* llc,*new_llc;
+
+ list_handle_empty(&to->lanpr.line_layers);
+
+ for (ll = lanpr->line_layers.first;ll;ll=ll->next){
+ new_ll = MEM_callocN(sizeof(LANPR_LineLayer),"Copied Line Layer");
+ memcpy(new_ll,ll,sizeof(LANPR_LineLayer));
+ list_handle_empty(&new_ll->components);
+ new_ll->next=new_ll->prev=NULL;
+ BLI_addtail(&to->lanpr.line_layers,new_ll);
+ for(llc = ll->components.first;llc;llc=llc->next){
+ new_llc = MEM_callocN(sizeof(LANPR_LineLayerComponent),"Copied Line Layer Component");
+ memcpy(new_llc,llc,sizeof(LANPR_LineLayerComponent));
+ new_llc->next=new_llc->prev=NULL;
+ BLI_addtail(&new_ll->components,new_llc);
+ }
+ }
+
+ // render_buffer now only accessible from lanpr_share
+
+}
+
+void lanpr_free_everything(Scene* s){
+ SceneLANPR *lanpr= &s->lanpr;
+ LANPR_LineLayer* ll;
+ LANPR_LineLayerComponent* llc;
+
+ while(ll = BLI_pophead(&lanpr->line_layers)){
+ while(llc=BLI_pophead(&ll->components))
+ MEM_freeN(llc);
+ MEM_freeN(ll);
+ }
+}
diff --git a/source/blender/draw/engines/lanpr/lanpr_access.h b/source/blender/draw/engines/lanpr/lanpr_access.h
index 5bc56b19910..cb16c3ae962 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.h
+++ b/source/blender/draw/engines/lanpr/lanpr_access.h
@@ -24,4 +24,8 @@ int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, SceneLANPR *lanpr
void lanpr_destroy_render_data(struct LANPR_RenderBuffer *rb);
+void lanpr_copy_data(Scene* from, Scene* to);
+
+void lanpr_free_everything(Scene* s);
+
#endif
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 05fa5a47491..c302de82bb3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -95,8 +95,6 @@ typedef struct LANPR_SharedResource {
void *ved_viewport;
void *ved_render;
- void *rb_ref;
-
int init_complete;
SpinLock render_flag_lock;
@@ -268,7 +266,6 @@ typedef struct LANPR_Data {
typedef struct LANPR_RenderTaskInfo {
// thrd_t ThreadHandle;
- struct LANPR_RenderBuffer *render_buffer;
int thread_id;
LinkData *contour;
@@ -291,6 +288,8 @@ typedef struct LANPR_RenderTaskInfo {
typedef struct LANPR_RenderBuffer {
struct LANPR_RenderBuffer *prev, *next;
+ int is_copied; // for render.
+
int w, h;
int tile_size_w, tile_size_h;
int tile_count_x, tile_count_y;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 4ea30ebf703..f81d7c7a504 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -227,7 +227,7 @@ int lanpr_feed_atlas_data_intersection_cache(void *vedata,
LANPR_PrivateData *pd = stl->g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
- LANPR_RenderBuffer *rb = lanpr->render_buffer;
+ LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
LinkData *lip;
LANPR_RenderLine *rl;
int i, idx;
@@ -342,7 +342,7 @@ void lanpr_create_atlas_intersection_preview(void *vedata, int begin_index)
LANPR_PrivateData *pd = stl->g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
- LANPR_RenderBuffer *rb = lanpr->render_buffer;
+ LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
float co[2];
int i;
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index db0528dd182..5e2e1d820bf 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -173,8 +173,9 @@ static void lanpr_engine_free(void)
stl->g_data = 0;
}
- lanpr_destroy_render_data(lanpr_share.rb_ref);
-
+ lanpr_destroy_render_data(lanpr_share.render_buffer_shared);
+ MEM_freeN(lanpr_share.render_buffer_shared);//no longer needed.
+ lanpr_share.render_buffer_shared=NULL;
}
void lanpr_calculate_normal_object_vector(LANPR_LineLayer *ll, float *normal_object_direction);
@@ -438,7 +439,7 @@ static void lanpr_cache_finish(void *vedata)
if (lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->active_layer) {
if (lanpr->reloaded) {
- if (lanpr->render_buffer) {
+ if (lanpr_share.render_buffer_shared) {
lanpr_feed_atlas_data_intersection_cache(vedata,
pd->atlas_pl,
pd->atlas_pr,
@@ -469,10 +470,10 @@ static void lanpr_cache_finish(void *vedata)
DRW_shgroup_call(pd->dpix_preview_shgrp, bi->dpix_preview_batch, 0);
}
- if (lanpr->render_buffer && lanpr->render_buffer->DPIXIntersectionBatch) {
+ if (lanpr_share.render_buffer_shared && lanpr_share.render_buffer_shared->DPIXIntersectionBatch) {
DRW_shgroup_call(
- pd->dpix_transform_shgrp, lanpr->render_buffer->DPIXIntersectionTransformBatch, 0);
- DRW_shgroup_call(pd->dpix_preview_shgrp, lanpr->render_buffer->DPIXIntersectionBatch, 0);
+ pd->dpix_transform_shgrp, lanpr_share.render_buffer_shared->DPIXIntersectionTransformBatch, 0);
+ DRW_shgroup_call(pd->dpix_preview_shgrp, lanpr_share.render_buffer_shared->DPIXIntersectionBatch, 0);
}
}
}
@@ -537,9 +538,6 @@ static void lanpr_draw_scene_exec(void *vedata, GPUFrameBuffer *dfb, int is_rend
// should isolate these into a seperate function.
lanpr_software_draw_scene(vedata, dfb, is_render);
}
-
- // Draw can create stuff there.
- lanpr_share.rb_ref = lanpr->render_buffer;
}
static void lanpr_draw_scene(void *vedata)
@@ -625,9 +623,9 @@ static void lanpr_render_to_image(LANPR_Data *vedata,
if (lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE ||
(lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->enable_intersections)) {
- if (!lanpr->render_buffer)
+ if (!lanpr_share.render_buffer_shared)
lanpr_create_render_buffer(lanpr);
- if (lanpr->render_buffer->cached_for_frame != scene->r.cfra || LANPR_GLOBAL_update_tag) {
+ if (lanpr_share.render_buffer_shared->cached_for_frame != scene->r.cfra || LANPR_GLOBAL_update_tag) {
lanpr_compute_feature_lines_internal(draw_ctx->depsgraph, lanpr, scene);
}
}
@@ -662,7 +660,7 @@ static void lanpr_render_to_image(LANPR_Data *vedata,
lanpr_cache_finish(vedata);
/* get ref for destroy data */
- lanpr_share.rb_ref = lanpr->render_buffer;
+ //lanpr_share.rb_ref = lanpr->render_buffer;
DRW_render_instance_buffer_finish();
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list