[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29445] branches/render25/source/blender/ render/intern: Render Branch: sss optimization, to share irradiance cache between materials

Brecht Van Lommel brecht at blender.org
Mon Jun 14 12:22:53 CEST 2010


Revision: 29445
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29445
Author:   blendix
Date:     2010-06-14 12:22:52 +0200 (Mon, 14 Jun 2010)

Log Message:
-----------
Render Branch: sss optimization, to share irradiance cache between materials
in preprocessing pass. This required fairly major changes, so that each tile
renders all sss materials, instead of each material rendering all tiles.

I tried further to do a single rasterization for all materials, but it changed
the results too much, for example eyes would be missing shadow at the sides
because occluded faces were included in the sss pass then and not contributing
any shadow. Unfortunate because it helped performance quite a bit as exactly in
these cases the irradiance caching needs to take more samples.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/cache.h
    branches/render25/source/blender/render/intern/include/render_types.h
    branches/render25/source/blender/render/intern/include/sss.h
    branches/render25/source/blender/render/intern/include/zbuf.h
    branches/render25/source/blender/render/intern/source/cache.c
    branches/render25/source/blender/render/intern/source/pipeline.c
    branches/render25/source/blender/render/intern/source/rendercore.c
    branches/render25/source/blender/render/intern/source/result.c
    branches/render25/source/blender/render/intern/source/sss.c
    branches/render25/source/blender/render/intern/source/zbuf.c

Modified: branches/render25/source/blender/render/intern/include/cache.h
===================================================================
--- branches/render25/source/blender/render/intern/include/cache.h	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/include/cache.h	2010-06-14 10:22:52 UTC (rev 29445)
@@ -84,7 +84,8 @@
 struct IrrCache;
 typedef struct IrrCache IrrCache;
 
-void irr_cache_create(struct Render *re, struct RenderPart *pa,
+void irr_cache_create(struct Render *re, struct RenderPart *pa);
+void irr_cache_fill(struct Render *re, struct RenderPart *pa,
 	struct RenderLayer *rl, struct ShadeSample *ssamp, int docrop);
 void irr_cache_free(struct Render *re, struct RenderPart *pa);
 

Modified: branches/render25/source/blender/render/intern/include/render_types.h
===================================================================
--- branches/render25/source/blender/render/intern/include/render_types.h	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/include/render_types.h	2010-06-14 10:22:52 UTC (rev 29445)
@@ -89,8 +89,7 @@
 
 	/* subsurface scattering */
 	struct GHash *sss_hash;
-	ListBase *sss_points;
-	struct Material *sss_mat;
+	int sss_pass;
 
 	/* raytracing */
 	struct RayObject *raytree;

Modified: branches/render25/source/blender/render/intern/include/sss.h
===================================================================
--- branches/render25/source/blender/render/intern/include/sss.h	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/include/sss.h	2010-06-14 10:22:52 UTC (rev 29445)
@@ -42,13 +42,19 @@
 /* SSS pass */
 
 int sss_pass_done(struct Render *re, struct Material *mat);
-void sss_add_points(struct Render *re, float (*co)[3], float (*color)[3],
-	float *area, int totpoint);
+void sss_add_points(struct Render *re, struct Material *mat,
+	float (*co)[3], float (*color)[3], float *area, int totpoint);
 
 /* Sample SSS at a give point */
 
-int sss_sample(struct Render *re, struct Material *mat, float *co, float *col, float scale);
+int sss_sample(struct Render *re,
+	struct Material *mat, float *co, float *col, float scale);
 
+/* Tests if material has sss */
+
+int mat_has_sss(struct Material *ma);
+int mat_has_only_sss(struct Material *ma);
+
 /* Generic multiple scattering API */
 
 struct ScatterSettings;
@@ -61,9 +67,9 @@
 	float reflfac, float frontweight, float backweight);
 void scatter_settings_free(ScatterSettings *ss);
 
-ScatterTree *scatter_tree_new(ScatterSettings *ss[3], float scale, float error,
+ScatterTree *scatter_tree_new(ScatterSettings *ss[3], float scale, float error);
+void scatter_tree_build(ScatterTree *tree,
 	float (*co)[3], float (*color)[3], float *area, int totpoint);
-void scatter_tree_build(ScatterTree *tree);
 void scatter_tree_sample(ScatterTree *tree, float *co, float *color, float scale);
 void scatter_tree_free(ScatterTree *tree);
 

Modified: branches/render25/source/blender/render/intern/include/zbuf.h
===================================================================
--- branches/render25/source/blender/render/intern/include/zbuf.h	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/include/zbuf.h	2010-06-14 10:22:52 UTC (rev 29445)
@@ -34,6 +34,7 @@
 struct APixstrand;
 struct LampRen;
 struct ListBase;
+struct Material;
 struct RenderLayer;
 struct RenderPart;
 struct StrandShadeCache;
@@ -60,7 +61,8 @@
 /* SSS Rasterization */
 
 void zbuffer_sss(struct Render *re, struct RenderPart *pa, unsigned int lay,
-	void *handle, void (*func)(void*, int, int, int, int, int), struct ListBase *psmlist);
+	void *handle, void (*func)(void*, int, int, int, int, int),
+	struct ListBase *psmlist, struct Material *ma);
 
 /* Pixel Struct Utilities */
 

Modified: branches/render25/source/blender/render/intern/source/cache.c
===================================================================
--- branches/render25/source/blender/render/intern/source/cache.c	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/source/cache.c	2010-06-14 10:22:52 UTC (rev 29445)
@@ -57,7 +57,7 @@
 		return 0;
 	else if(ma->amb == 0.0f && !(ma->mapto & MAP_AMB))
 		return 0;
-	else if((ma->sss_flag & MA_DIFF_SSS) && sss_pass_done(re, ma))
+	else if(!re->db.sss_pass && mat_has_only_sss(ma))
 		return 0;
 	
 	return 1;
@@ -1083,11 +1083,9 @@
 	return added;
 }
 
-void irr_cache_create(Render *re, RenderPart *pa, RenderLayer *rl, ShadeSample *ssamp, int docrop)
+void irr_cache_create(Render *re, RenderPart *pa)
 {
-	RenderResult *rr= pa->result;
 	IrrCache *cache;
-	int crop, x, y, seed, step;
 	
 	if(!((re->db.wrld.aomode & WO_LIGHT_CACHE) && (re->db.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT))))
 		return;
@@ -1105,8 +1103,15 @@
 		re->db.irrcache[pa->thread]= cache;
 	}
 	BLI_unlock_thread(LOCK_RCACHE);
+}
 
-	if(cache->locked)
+void irr_cache_fill(Render *re, RenderPart *pa, RenderLayer *rl, ShadeSample *ssamp, int docrop)
+{
+	RenderResult *rr= pa->result;
+	IrrCache *cache= re->db.irrcache[pa->thread];
+	int crop, x, y, seed, step;
+
+	if(!cache || cache->locked)
 		return;
 
 	seed= pa->rectx*pa->disprect.ymin;

Modified: branches/render25/source/blender/render/intern/source/pipeline.c
===================================================================
--- branches/render25/source/blender/render/intern/source/pipeline.c	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/source/pipeline.c	2010-06-14 10:22:52 UTC (rev 29445)
@@ -436,7 +436,7 @@
 static int render_display_draw_enabled(Render *re)
 {
 	/* don't show preprocess for previewrender sss */
-	if(re->db.sss_points)
+	if(re->db.sss_pass)
 		return !(re->params.r.scemode & R_PREVIEWBUTS);
 	else
 		return 1;
@@ -470,7 +470,7 @@
 	if(re->cb.test_break(re->cb.tbh)==0) {
 		pa->pixelrow= MEM_callocN(sizeof(PixelRow)*MAX_PIXEL_ROW, "PixelRow");
 
-		if(re->db.sss_points) {
+		if(re->db.sss_pass) {
 			pa->result= render_result_create(re, &pa->disprect, pa->crop, RR_USEMEM);
 
 			render_sss_bake_part(re, pa);
@@ -555,7 +555,7 @@
 	if(re->result==NULL || !(re->params.r.scemode & R_PREVIEWBUTS)) {
 		RE_FreeRenderResult(re->result);
 	
-		if(re->db.sss_points && render_display_draw_enabled(re))
+		if(re->db.sss_pass && render_display_draw_enabled(re))
 			re->result= render_result_create(re, &re->disprect, 0, 0);
 		else if(re->params.r.scemode & R_FULL_SAMPLE)
 			re->result= render_result_full_sample_create(re);

Modified: branches/render25/source/blender/render/intern/source/rendercore.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rendercore.c	2010-06-14 08:47:58 UTC (rev 29444)
+++ branches/render25/source/blender/render/intern/source/rendercore.c	2010-06-14 10:22:52 UTC (rev 29445)
@@ -36,24 +36,25 @@
 /* External modules: */
 #include "MEM_guardedalloc.h"
 
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_group_types.h"
+
 #include "BLI_blenlib.h"
 #include "BLI_jitter.h"
 #include "BLI_math.h"
 #include "BLI_rand.h"
 #include "BLI_threads.h"
 
+#include "PIL_time.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
 #include "BKE_material.h"
-#include "BKE_utildefines.h"
-
-#include "DNA_lamp_types.h"
-#include "DNA_material_types.h"
-#include "DNA_group_types.h"
-
 #include "BKE_node.h"
 #include "BKE_texture.h"
+#include "BKE_utildefines.h"
 
-#include "PIL_time.h"
-
 #include "RE_raytrace.h"
 
 /* local includes */
@@ -727,10 +728,13 @@
 	if(re->params.r.mode & R_SHADOW)
 		irregular_shadowbuf_create(re, pa, pa->apixbuf);
 
-	if(re->db.occlusiontree)
+	if(re->db.occlusiontree) {
 		disk_occlusion_cache_create(re, pa, &ssamp);
-	else
-		irr_cache_create(re, pa, rl, &ssamp, pa->crop);
+	}
+	else {
+		irr_cache_create(re, pa);
+		irr_cache_fill(re, pa, rl, &ssamp, pa->crop);
+	}
 
 	/* filtered render, for now we assume only 1 filter size */
 	offs= 0;
@@ -1082,134 +1086,147 @@
 	RenderResult *rr= pa->result;
 	RenderLayer *rl;
 	VlakRen *vlr;
-	Material *mat= re->db.sss_mat;
+	Material *mat;
 	float (*co)[3], (*color)[3], *area, *fcol;
 	int x, y, seed, quad, totpoint, display = !(re->params.r.scemode & R_PREVIEWBUTS);
 	int lay, offs, a;
-	ListBase psmlist= {NULL, NULL};
 
-	/* setup pixelstr list and buffer for zbuffering */
-	handle.pa= pa;
-	handle.totps= 0;
+	if(!re->db.occlusiontree)
+		irr_cache_create(re, pa);
 
-	pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
-	pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
-	pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
-	pa->rectbacko= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbacko");
-	pa->rectbackp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackp");
-	pa->rectbackz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackz");
-	pa->rectdaps= MEM_callocN(sizeof(void*)*pa->rectx*pa->recty+4, "zbufDArectd");
+	for(mat= G.main->mat.first; mat; mat= mat->id.next) {
+		ListBase psmlist= {NULL, NULL};
 
-	/* setup shade sample with correct passes */
-	memset(&ssamp, 0, sizeof(ssamp));
-	shade_sample_initialize(re, &ssamp, pa, rr->layers.first);
-	ssamp.tot= 1;
+		/* test if we are a material that needs to be preprocessed */
+		if(!(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS)))
+			continue;
 
-	render_sss_layer(re, rr, mat, &ssamp.shi[0]);
-	lay= ssamp.shi[0].shading.lay;
+		/* allocate buffers for zbuffering */
+		pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
+		pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
+		pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
+		pa->rectbacko= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbacko");
+		pa->rectbackp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackp");
+		pa->rectbackz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackz");
+		pa->rectdaps= MEM_callocN(sizeof(void*)*pa->rectx*pa->recty+4, "zbufDArectd");
 
-	rl= rr->layers.first;
-	ssamp.shi[0].shading.passflag |= SCE_PASS_RGBA|SCE_PASS_COMBINED;
-	ssamp.shi[0].shading.combinedflag &= ~(SCE_PASS_SPEC);
-	ssamp.shi[0].material.mat_override= NULL;
-	ssamp.shi[0].material.light_override= NULL;
+		handle.pa= pa;
+		handle.totps= 0;
 
-	/* create the pixelstrs to be used later */
-	zbuffer_sss(re, pa, lay, &handle, addps_sss, &psmlist);
+		/* setup shade sample with correct passes */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list