[Bf-blender-cvs] [9218730b2b3] soc-2018-npr: DPIX and Snake's F12 is working now.

Nick Wu noreply at git.blender.org
Fri Jul 27 12:17:57 CEST 2018


Commit: 9218730b2b313147ed0dc424bcb23575139dfbc1
Author: Nick Wu
Date:   Fri Jul 27 18:17:18 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB9218730b2b313147ed0dc424bcb23575139dfbc1

DPIX and Snake's F12 is working now.

===================================================================

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_snake.c

===================================================================

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 62c47163546..50365298de7 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -166,9 +166,6 @@ typedef struct LANPR_PrivateData {
 
 	DRWShadingGroup *debug_shgrp;
 
-	// moved into line layer.
-	//DRWShadingGroup *software_shgrp;
-
 	//snake
 
 	float normal_clamp;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 92346a17c8c..b4cb6308b2d 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -93,26 +93,7 @@ void lanpr_init_atlas_inputs(void *ved){
 	}
 }
 void lanpr_destroy_atlas(void *ved){
-	lanpr_share.ved_viewport = ved;
-	LANPR_Data *vedata = (LANPR_Data *)ved;
-	LANPR_TextureList *txl = vedata->txl;
-	LANPR_FramebufferList *fbl = vedata->fbl;
-	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
-	LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
-
-	//DRW_pass_free(psl->dpix_transform_pass);
-	//DRW_pass_free(psl->dpix_preview_pass);
-
-	GPU_framebuffer_free(fbl->dpix_transform);
-	GPU_framebuffer_free(fbl->dpix_preview);
-
-	DRW_texture_free(txl->dpix_in_pl);
-	DRW_texture_free(txl->dpix_in_pr);
-	DRW_texture_free(txl->dpix_in_nl);
-	DRW_texture_free(txl->dpix_in_nr);
-	DRW_texture_free(txl->dpix_in_edge_mask);
-	DRW_texture_free(txl->dpix_out_pl);
-	DRW_texture_free(txl->dpix_out_pr);
+	//no need to free things, no custom data.
 }
 
 int lanpr_feed_atlas_data_obj(void *vedata,
@@ -374,7 +355,7 @@ void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, L
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	Scene *scene = DEG_get_evaluated_scene(draw_ctx->depsgraph);
 	View3D *v3d = draw_ctx->v3d;
-	Object *camera;
+	Object *camera=0;
 	if (v3d) {
 		RegionView3D *rv3d = draw_ctx->rv3d;
 		camera = (rv3d && rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL;
@@ -382,7 +363,7 @@ void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, L
 	if(!camera){
 		camera = scene->camera;
 	}
-	if (!camera) return;
+	if (is_render && !camera) return;
 
 	pd->dpix_viewport[2] = texw;
 	pd->dpix_viewport[3] = texh;
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index d408a138411..50e64bc0ed5 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -173,35 +173,15 @@ static void lanpr_engine_init(void *ved){
 static void lanpr_engine_free(void){
 	void *ved = lanpr_share.ved_viewport;
 	LANPR_Data *vedata = (LANPR_Data *)ved;
-	LANPR_TextureList *txl = vedata->txl;
-	LANPR_FramebufferList *fbl = vedata->fbl;
 	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
-	LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
-
-	//DRW_pass_free(psl->color_pass);
-	//DRW_pass_free(psl->edge_intermediate);
 
-	GPU_framebuffer_free(fbl->passes);
-	GPU_framebuffer_free(fbl->edge_intermediate);
-	GPU_framebuffer_free(fbl->edge_thinning);
-	GPU_framebuffer_free(fbl->software_ms);
-
-	DRW_texture_free(txl->depth);
-	DRW_texture_free(txl->color);
-	DRW_texture_free(txl->normal);
-	DRW_texture_free(txl->edge_intermediate);
-	DRW_texture_free(txl->ms_resolve_depth);
-	DRW_texture_free(txl->ms_resolve_color);
+	//only free custom data in storage list.
 
 	BLI_mempool_destroy(stl->g_data->mp_line_strip);
 	BLI_mempool_destroy(stl->g_data->mp_line_strip_point);
 	BLI_mempool_destroy(stl->g_data->mp_sample);
 	BLI_mempool_destroy(stl->g_data->mp_batch_list);
 
-	MEM_freeN(stl->g_data->line_result_8bit);
-	MEM_freeN(stl->g_data->line_result);
-	MEM_freeN(stl->g_data);
-
 	lanpr_destroy_atlas(vedata);
 
 	stl->g_data = 0;
@@ -366,37 +346,39 @@ static void lanpr_cache_finish(void *vedata){
 	float mat[4][4];
 	unit_m4(mat);
 
-	LANPR_BatchItem *bi;
-	for (bi = pd->dpix_batch_list.first; bi; bi = (void *)bi->Item.next) {
-		DRW_shgroup_call_add(pd->dpix_transform_shgrp, bi->dpix_transform_batch, bi->ob->obmat);
-		DRW_shgroup_call_add(pd->dpix_preview_shgrp, bi->dpix_preview_batch, 0);
-	}
-
-	if (lanpr->reloaded && lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->active_layer) {
-		if (lanpr->render_buffer) {
-			lanpr_feed_atlas_data_intersection_cache(vedata, pd->atlas_pl, pd->atlas_pr, pd->atlas_nl, pd->atlas_nr, pd->atlas_edge_mask, pd->begin_index);
-			lanpr_create_atlas_intersection_preview(vedata, pd->begin_index);
+	if (lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->active_layer) {
+		if (lanpr->reloaded) {
+			if (lanpr->render_buffer) {
+				lanpr_feed_atlas_data_intersection_cache(vedata, pd->atlas_pl, pd->atlas_pr, pd->atlas_nl, pd->atlas_nr, pd->atlas_edge_mask, pd->begin_index);
+				lanpr_create_atlas_intersection_preview(vedata, pd->begin_index);
+			}
+			GPU_texture_update(txl->dpix_in_pl, GPU_DATA_FLOAT, pd->atlas_pl);
+			GPU_texture_update(txl->dpix_in_pr, GPU_DATA_FLOAT, pd->atlas_pr);
+			GPU_texture_update(txl->dpix_in_nl, GPU_DATA_FLOAT, pd->atlas_nl);
+			GPU_texture_update(txl->dpix_in_nr, GPU_DATA_FLOAT, pd->atlas_nr);
+			GPU_texture_update(txl->dpix_in_edge_mask, GPU_DATA_FLOAT, pd->atlas_edge_mask);
+
+			MEM_freeN(pd->atlas_pl);
+			MEM_freeN(pd->atlas_pr);
+			MEM_freeN(pd->atlas_nl);
+			MEM_freeN(pd->atlas_nr);
+			MEM_freeN(pd->atlas_edge_mask);
+			pd->atlas_pl = 0;
+			lanpr->reloaded = 0;
 		}
 
-		GPU_texture_update(txl->dpix_in_pl, GPU_DATA_FLOAT, pd->atlas_pl);
-		GPU_texture_update(txl->dpix_in_pr, GPU_DATA_FLOAT, pd->atlas_pr);
-		GPU_texture_update(txl->dpix_in_nl, GPU_DATA_FLOAT, pd->atlas_nl);
-		GPU_texture_update(txl->dpix_in_nr, GPU_DATA_FLOAT, pd->atlas_nr);
-		GPU_texture_update(txl->dpix_in_edge_mask, GPU_DATA_FLOAT, pd->atlas_edge_mask);
-
-		MEM_freeN(pd->atlas_pl);
-		MEM_freeN(pd->atlas_pr);
-		MEM_freeN(pd->atlas_nl);
-		MEM_freeN(pd->atlas_nr);
-		MEM_freeN(pd->atlas_edge_mask);
-		pd->atlas_pl = 0;
-		lanpr->reloaded = 0;
+		
 
-	}
+		LANPR_BatchItem *bi;
+		for (bi = pd->dpix_batch_list.first; bi; bi = (void *)bi->Item.next) {
+			DRW_shgroup_call_add(pd->dpix_transform_shgrp, bi->dpix_transform_batch, bi->ob->obmat);
+			DRW_shgroup_call_add(pd->dpix_preview_shgrp, bi->dpix_preview_batch, 0);
+		}
 
-	if (lanpr->render_buffer && lanpr->render_buffer->DPIXIntersectionBatch) {
-		DRW_shgroup_call_add(pd->dpix_transform_shgrp, lanpr->render_buffer->DPIXIntersectionTransformBatch, 0);
-		DRW_shgroup_call_add(pd->dpix_preview_shgrp, lanpr->render_buffer->DPIXIntersectionBatch, 0);
+		if (lanpr->render_buffer && lanpr->render_buffer->DPIXIntersectionBatch) {
+			DRW_shgroup_call_add(pd->dpix_transform_shgrp, lanpr->render_buffer->DPIXIntersectionTransformBatch, 0);
+			DRW_shgroup_call_add(pd->dpix_preview_shgrp, lanpr->render_buffer->DPIXIntersectionBatch, 0);
+		}
 	}
 }
 
@@ -494,12 +476,12 @@ static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *deps
 
 	unit_m4(unitmat);
 
-	DRW_viewport_matrix_override_set(unitmat, DRW_MAT_PERS);
-	DRW_viewport_matrix_override_set(unitmat, DRW_MAT_PERSINV);
-	DRW_viewport_matrix_override_set(unitmat, DRW_MAT_WIN);
-	DRW_viewport_matrix_override_set(unitmat, DRW_MAT_WININV);
-	DRW_viewport_matrix_override_set(unitmat, DRW_MAT_VIEW);
-	DRW_viewport_matrix_override_set(unitmat, DRW_MAT_VIEWINV);
+	DRW_viewport_matrix_override_set(persmat, DRW_MAT_PERS);
+	DRW_viewport_matrix_override_set(persinv, DRW_MAT_PERSINV);
+	DRW_viewport_matrix_override_set(winmat, DRW_MAT_WIN);
+	DRW_viewport_matrix_override_set(wininv, DRW_MAT_WININV);
+	DRW_viewport_matrix_override_set(viewmat, DRW_MAT_VIEW);
+	DRW_viewport_matrix_override_set(viewinv, DRW_MAT_VIEWINV);
 }
 
 static void lanpr_render_to_image(LANPR_Data *vedata, RenderEngine *engine, struct RenderLayer *render_layer, const rcti *rect){
@@ -537,6 +519,7 @@ static void lanpr_render_to_image(LANPR_Data *vedata, RenderEngine *engine, stru
 	});
 
 	lanpr_engine_init(vedata);
+	lanpr->reloaded = 1; // force dpix batch to re-create
 	lanpr_cache_init(vedata);
 	DRW_render_object_iter(vedata, engine, draw_ctx->depsgraph, LANPR_render_cache);
 	lanpr_cache_finish(vedata);
@@ -560,6 +543,7 @@ static void lanpr_render_to_image(LANPR_Data *vedata, RenderEngine *engine, stru
 	                           BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
 	                           4, 0, rp->rect);
 
+	//we don't need to free pass/buffer/texture in the engine's list
 	//lanpr_engine_free();
 
 	lanpr_clear_render_flag();
diff --git a/source/blender/draw/engines/lanpr/lanpr_snake.c b/source/blender/draw/engines/lanpr/lanpr_snake.c
index 4a6ddb4da72..4843d831af3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_snake.c
+++ b/source/blender/draw/engines/lanpr/lanpr_snake.c
@@ -302,6 +302,23 @@ GPUBatch *lanpr_get_snake_batch(LANPR_PrivateData *pd){
 	return GPU_batch_create_ex(GPU_PRIM_LINES_ADJ, vbo, GPU_indexbuf_build(&elb), GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
 }
 
+void lanpr_snake_free_pool_data(LANPR_PrivateData *pd) {
+	if (pd->line_result_8bit) MEM_freeN(pd->line_result_8bit);
+	pd->line_result_8bit = 0;
+	if (pd->line_result) MEM_freeN(pd->line_result);
+	pd->line_result = 0;
+	BLI_mempool_clear(pd->mp_line_strip);
+	BLI_mempool_clear(pd->mp_line_strip_point);
+	BLI_mempool_clear(pd->mp_sample);
+	BLI_mempool_clear(pd->mp_batch_list);
+}
+void lanpr_snake_free_readback_data(LANPR_PrivateData *pd) {
+	if (pd->line_result_8bit) MEM_freeN(pd->line_result_8bit);
+	pd->line_result_8bit = 0;
+	if (pd->line_result) MEM_freeN(pd->line_result);
+	pd->line_result = 0;
+}
+
 void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer *DefaultFB, int is_render){
 	GPUFrameBufferBits clear_bits = GPU_COLOR_BIT | GPU_DEPTH_BIT;
 	float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
@@ -373,7 +390,7 @@ void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl,
 	int recreate = 0;
 	if (tsize != pd->width * pd->height) recreate = 1;
 
-	if (recreate) {
+	if (recreate || !pd->line_result) {
 		if (pd->line_result) MEM_freeN(pd->line_result);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list