Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-01-22 17:59:49 +0300
committerTon Roosendaal <ton@blender.org>2009-01-22 17:59:49 +0300
commit9cc59fb0c329bb788defe9c56b69d0919caaba96 (patch)
treef6f1c48441ba6de4f2ff1faf19a0540ce1dc6ba5 /source/blender/render
parenta017982074b3b11fd0157d8d604e02858411db70 (diff)
2.5
Added WM Jobs manager - WM can manage threaded jobs for you; just provide a couple of components to get it work: - customdata, free callback for it - timer step, notifier code - start callback, update callback - Once started, each job runs an own timer, and will for every time step check necessary updates, or close the job when ready. - No drawing happens in jobs, that's for notifiers! - Every job stores an owner pointer, and based on this owner it will prevent multiple jobs to enter the stack. Instead it will re-use a running job, signal it to stop and allow caller to re-initialize it even. - Check new wm_jobs.c for more explanation. Jobs API is still under construction. Fun: BLI_addtail(&wm->jobs, steve); :) Put Node shader previews back using wmJobs - Preview calculating is now fully threaded (1 thread still) - Thanks to new event system + notifiers, you can see previews update even while dragging sliders! - Currently it only starts when you change a node setting. Warning: the thread render shares Node data, so don't delete nodes while it renders! This topic is on the todo to make safe. Also: - bug in region initialize (do_versions) showed channel list in node editor wrong. - flagged the channel list 'hidden' now, it was really in the way! This is for later to work on anyway. - recoded Render API callbacks so it gets handlers passed on, no globals to use anymore, remember? - previewrender code gets now so much nicer! Will remove a lot of stuff from code soon.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h15
-rw-r--r--source/blender/render/intern/include/render_types.h27
-rw-r--r--source/blender/render/intern/source/convertblender.c48
-rw-r--r--source/blender/render/intern/source/envmap.c16
-rw-r--r--source/blender/render/intern/source/occlusion.c8
-rw-r--r--source/blender/render/intern/source/pipeline.c156
-rw-r--r--source/blender/render/intern/source/rayshade.c6
-rw-r--r--source/blender/render/intern/source/rendercore.c28
-rw-r--r--source/blender/render/intern/source/shadbuf.c12
-rw-r--r--source/blender/render/intern/source/sss.c8
-rw-r--r--source/blender/render/intern/source/strand.c8
-rw-r--r--source/blender/render/intern/source/zbuf.c14
12 files changed, 179 insertions, 167 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 97ef371af76..538372d5558 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -200,14 +200,13 @@ void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(v
void (*vertexfunc)(float*), void (*termfunc)(void));
/* display and event callbacks */
-void RE_display_init_cb (struct Render *re, void (*f)(RenderResult *rr));
-void RE_display_clear_cb(struct Render *re, void (*f)(RenderResult *rr));
-void RE_display_draw_cb (struct Render *re, void (*f)(RenderResult *rr, volatile struct rcti *rect));
-void RE_stats_draw_cb (struct Render *re, void (*f)(RenderStats *rs));
-void RE_timecursor_cb (struct Render *re, void (*f)(int));
-void RE_test_break_cb (struct Render *re, int (*f)(void));
-void RE_test_return_cb (struct Render *re, int (*f)(void));
-void RE_error_cb (struct Render *re, void (*f)(char *str));
+void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
+void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
+void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
+void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
+void RE_timecursor_cb (struct Render *re, void *handle, void (*f)(void *handle, int));
+void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle));
+void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, char *str));
/* should move to kernel once... still unsure on how/where */
float RE_filter_value(int type, float x);
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 34553208574..66722ea983f 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -208,16 +208,23 @@ struct Render
struct MemArena *memArena;
/* callbacks */
- void (*display_init)(RenderResult *rr);
- void (*display_clear)(RenderResult *rr);
- void (*display_draw)(RenderResult *rr, volatile rcti *rect);
-
- void (*stats_draw)(RenderStats *ri);
- void (*timecursor)(int i);
-
- int (*test_break)(void);
- int (*test_return)(void);
- void (*error)(char *str);
+ void (*display_init)(void *handle, RenderResult *rr);
+ void *dih;
+ void (*display_clear)(void *handle, RenderResult *rr);
+ void *dch;
+ void (*display_draw)(void *handle, RenderResult *rr, volatile rcti *rect);
+ void *ddh;
+
+ void (*stats_draw)(void *handle, RenderStats *ri);
+ void *sdh;
+ void (*timecursor)(void *handle, int i);
+ void *tch;
+
+ int (*test_break)(void *handle);
+ void *tbh;
+
+ void (*error)(void *handle, char *str);
+ void *erh;
RenderStats i;
};
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 6afc0ac472f..62954711344 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -2021,7 +2021,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(orco1==0)
orco+=3;
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -4357,7 +4357,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject
re->i.totstrand= re->totstrand;
re->i.tothalo= re->tothalo;
re->i.totlamp= re->totlamp;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
ob->flag |= OB_DONE;
@@ -4727,7 +4727,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
else
init_render_object(re, obd, ob, dob, timeoffset, vectorlay);
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
free_object_duplilist(lb);
@@ -4738,7 +4738,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
init_render_object(re, ob, NULL, 0, timeoffset, vectorlay);
}
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
/* objects in groups with OB_RENDER_DUPLI set still need to be created,
@@ -4755,7 +4755,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
}
}
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
RE_makeRenderInstances(re);
}
@@ -4817,7 +4817,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, 0, 0);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
int tothalo;
set_material_lightgroups(re);
@@ -4832,17 +4832,17 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
re->i.totstrand= re->totstrand;
re->i.tothalo= re->tothalo;
re->i.totlamp= re->totlamp;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* don't sort stars */
tothalo= re->tothalo;
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
if(re->wrld.mode & WO_STARS)
RE_make_stars(re, NULL, NULL, NULL, NULL);
sort_halos(re, tothalo);
re->i.infostr= "Creating Shadowbuffers";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* SHADOW BUFFER */
threaded_makeshadowbufs(re);
@@ -4851,43 +4851,43 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* although radio mode could be useful at some point, later */
if (re->r.renderer==R_INTERN) {
/* RADIO (uses no R anymore) */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
if(re->r.mode & R_RADIO) do_radio_render(re);
/* raytree */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
if(re->r.mode & R_RAYTRACE) {
makeraytree(re);
}
}
/* ENVIRONMENT MAPS */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
make_envmaps(re);
}
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0, 1);
/* Occlusion */
- if((re->wrld.mode & WO_AMB_OCC) && !re->test_break())
+ if((re->wrld.mode & WO_AMB_OCC) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
if(re->r.renderer==R_INTERN)
if(re->r.mode & R_SHADOW)
make_occ_tree(re);
/* SSS */
- if((re->r.mode & R_SSS) && !re->test_break())
+ if((re->r.mode & R_SSS) && !re->test_break(re->tbh))
if(re->r.renderer==R_INTERN)
make_sss_tree(re);
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
RE_Database_Free(re);
else
re->i.convertdone= 1;
re->i.infostr= NULL;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
/* exported call to recalculate hoco for vertices, when winmat changed */
@@ -4940,7 +4940,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, 0, timeoffset);
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0, 1);
/* do this in end, particles for example need cfra */
@@ -5313,7 +5313,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
RE_Database_Free(re);
re->strandsurface= strandsurface;
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
/* creates entire dbase */
re->i.infostr= "Calculating next frame vectors";
@@ -5328,10 +5328,10 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
RE_Database_Free(re);
re->strandsurface= strandsurface;
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
RE_Database_FromScene(re, sce, 1);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
for(step= 0; step<2; step++) {
if(step)
@@ -5400,7 +5400,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
}
re->i.infostr= NULL;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
@@ -5499,12 +5499,12 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
threaded_makeshadowbufs(re);
/* raytree */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
if(re->r.mode & R_RAYTRACE)
makeraytree(re);
/* occlusion */
- if((re->wrld.mode & WO_AMB_OCC) && !re->test_break())
+ if((re->wrld.mode & WO_AMB_OCC) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
if(re->r.mode & R_SHADOW)
make_occ_tree(re);
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 5cf03272b9f..de09d8f51e0 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -408,7 +408,7 @@ static void render_envmap(Render *re, EnvMap *env)
if(env->type==ENV_PLANE && part!=1)
continue;
- re->display_clear(envre->result);
+ re->display_clear(re->dch, envre->result);
MTC_Mat4CpyMat4(tmat, orthmat);
envmap_transmatrix(tmat, part);
@@ -429,7 +429,7 @@ static void render_envmap(Render *re, EnvMap *env)
env_hideobject(envre, env->object);
env_set_imats(envre);
- if(re->test_break()==0) {
+ if(re->test_break(re->tbh)==0) {
RE_TileProcessor(envre, 0, 0);
}
@@ -437,7 +437,7 @@ static void render_envmap(Render *re, EnvMap *env)
env_showobjects(envre);
env_rotate_scene(envre, tmat, 0);
- if(re->test_break()==0) {
+ if(re->test_break(re->tbh)==0) {
RenderLayer *rl= envre->result->layers.first;
int y;
char *alpha;
@@ -455,11 +455,11 @@ static void render_envmap(Render *re, EnvMap *env)
env->cube[part]= ibuf;
}
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
- if(re->test_break()) BKE_free_envmapdata(env);
+ if(re->test_break(re->tbh)) BKE_free_envmapdata(env);
else {
if(envre->r.mode & R_OSA) env->ok= ENV_OSA;
else env->ok= ENV_NORMAL;
@@ -486,7 +486,7 @@ void make_envmaps(Render *re)
re->r.mode &= ~R_RAYTRACE;
re->i.infostr= "Creating Environment maps";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* 5 = hardcoded max recursion level */
while(depth<5) {
@@ -547,8 +547,8 @@ void make_envmaps(Render *re)
}
if(do_init) {
- re->display_init(re->result);
- re->display_clear(re->result);
+ re->display_init(re->dih, re->result);
+ re->display_clear(re->dch, re->result);
// re->flag |= R_REDRAW_PRV;
}
// restore
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index d2d2cf3fb77..5a2a58ca919 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -1292,11 +1292,11 @@ static void occ_compute_passes(Render *re, OcclusionTree *tree, int totpass)
VECADDFAC(co, co, n, 1e-8f);
occ_lookup(tree, 0, &tree->face[i], co, n, &occ[i], NULL);
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
for(i=0; i<tree->totface; i++) {
@@ -1546,7 +1546,7 @@ void make_occ_tree(Render *re)
R= *re;
re->i.infostr= "Occlusion preprocessing";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
re->occlusiontree= occ_tree_build(re);
@@ -1738,7 +1738,7 @@ void cache_occ_samples(Render *re, RenderPart *pa, ShadeSample *ssamp)
sample->filled= 1;
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
}
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 1b1fa715d00..12f904f8f5c 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -122,20 +122,20 @@ static int commandline_threads= -1;
static volatile int g_break= 0;
-static int thread_break(void)
+static int thread_break(void *unused)
{
return g_break;
}
/* default callbacks, set in each new render */
-static void result_nothing(RenderResult *rr) {}
-static void result_rcti_nothing(RenderResult *rr, volatile struct rcti *rect) {}
-static void stats_nothing(RenderStats *rs) {}
-static void int_nothing(int val) {}
-static int void_nothing(void) {return 0;}
-static void print_error(char *str) {printf("ERROR: %s\n", str);}
+static void result_nothing(void *unused, RenderResult *rr) {}
+static void result_rcti_nothing(void *unused, RenderResult *rr, volatile struct rcti *rect) {}
+static void stats_nothing(void *unused, RenderStats *rs) {}
+static void int_nothing(void *unused, int val) {}
+static int void_nothing(void *unused) {return 0;}
+static void print_error(void *unused, char *str) {printf("ERROR: %s\n", str);}
-static void stats_background(RenderStats *rs)
+static void stats_background(void *unused, RenderStats *rs)
{
uintptr_t mem_in_use= MEM_get_memory_in_use();
float megs_used_memory= mem_in_use/(1024.0*1024.0);
@@ -1019,12 +1019,13 @@ Render *RE_NewRender(const char *name)
re->display_draw= result_rcti_nothing;
re->timecursor= int_nothing;
re->test_break= void_nothing;
- re->test_return= void_nothing;
re->error= print_error;
if(G.background)
re->stats_draw= stats_background;
else
re->stats_draw= stats_nothing;
+ /* clear callback handles */
+ re->dih= re->dch= re->ddh= re->sdh= re->tch= re->tbh= re->erh= NULL;
/* init some variables */
re->ycor= 1.0f;
@@ -1083,7 +1084,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy
if(re->rectx < 2 || re->recty < 2 || (BKE_imtype_is_movie(rd->imtype) &&
(re->rectx < 16 || re->recty < 16) )) {
- re->error("Image too small");
+ re->error(re->erh, "Image too small");
re->ok= 0;
}
else {
@@ -1173,39 +1174,41 @@ void RE_SetView(Render *re, float mat[][4])
}
/* image and movie output has to move to either imbuf or kernel */
-void RE_display_init_cb(Render *re, void (*f)(RenderResult *rr))
+void RE_display_init_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
{
re->display_init= f;
+ re->dih= handle;
}
-void RE_display_clear_cb(Render *re, void (*f)(RenderResult *rr))
+void RE_display_clear_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
{
re->display_clear= f;
+ re->dch= handle;
}
-void RE_display_draw_cb(Render *re, void (*f)(RenderResult *rr, volatile rcti *rect))
+void RE_display_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile rcti *rect))
{
re->display_draw= f;
+ re->ddh= handle;
}
-
-void RE_stats_draw_cb(Render *re, void (*f)(RenderStats *rs))
+void RE_stats_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderStats *rs))
{
re->stats_draw= f;
+ re->sdh= handle;
}
-void RE_timecursor_cb(Render *re, void (*f)(int))
+void RE_timecursor_cb(Render *re, void *handle, void (*f)(void *handle, int))
{
re->timecursor= f;
+ re->tch= handle;
}
-void RE_test_break_cb(Render *re, int (*f)(void))
+void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
{
re->test_break= f;
+ re->tbh= handle;
}
-void RE_test_return_cb(Render *re, int (*f)(void))
-{
- re->test_return= f;
-}
-void RE_error_cb(Render *re, void (*f)(char *str))
+void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, char *str))
{
re->error= f;
+ re->erh= handle;
}
@@ -1253,7 +1256,7 @@ static void *do_part_thread(void *pa_v)
RenderPart *pa= pa_v;
/* need to return nicely all parts on esc */
- if(R.test_break()==0) {
+ if(R.test_break(R.tbh)==0) {
if(!R.sss_points && (R.r.scemode & R_FULL_SAMPLE))
pa->result= new_full_sample_buffers(&R, &pa->fullresult, &pa->disprect, pa->crop);
@@ -1289,7 +1292,7 @@ static void render_tile_processor(Render *re, int firsttile)
{
RenderPart *pa;
- if(re->test_break())
+ if(re->test_break(re->tbh))
return;
/* hrmf... exception, this is used for preview render, re-entrant, so render result has to be re-used */
@@ -1298,7 +1301,7 @@ static void render_tile_processor(Render *re, int firsttile)
re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
}
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
if(re->result==NULL)
return;
@@ -1317,17 +1320,17 @@ static void render_tile_processor(Render *re, int firsttile)
do_part_thread(pa);
if(pa->result) {
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
if(render_display_draw_enabled(re))
- re->display_draw(pa->result, NULL);
+ re->display_draw(re->ddh, pa->result, NULL);
re->i.partsdone++;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
RE_FreeRenderResult(pa->result);
pa->result= NULL;
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
}
@@ -1444,7 +1447,7 @@ static void print_part_stats(Render *re, RenderPart *pa)
sprintf(str, "Part %d-%d", pa->nr, re->i.totpart);
re->i.infostr= str;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
}
@@ -1514,7 +1517,7 @@ static void threaded_tile_processor(Render *re)
while(rendering) {
- if(re->test_break())
+ if(re->test_break(re->tbh))
PIL_sleep_ms(50);
else if(nextpa && BLI_available_threads(&threads)) {
drawtimer= 0;
@@ -1547,7 +1550,7 @@ static void threaded_tile_processor(Render *re)
if(pa->result) {
if(render_display_draw_enabled(re))
- re->display_draw(pa->result, NULL);
+ re->display_draw(re->ddh, pa->result, NULL);
print_part_stats(re, pa);
free_render_result(&pa->fullresult, pa->result);
@@ -1560,7 +1563,7 @@ static void threaded_tile_processor(Render *re)
rendering= 1;
if(pa->nr && pa->result && drawtimer>20) {
if(render_display_draw_enabled(re))
- re->display_draw(pa->result, &pa->result->renrect);
+ re->display_draw(re->ddh, pa->result, &pa->result->renrect);
hasdrawn= 1;
}
}
@@ -1569,7 +1572,7 @@ static void threaded_tile_processor(Render *re)
drawtimer= 0;
/* on break, wait for all slots to get freed */
- if( (g_break=re->test_break()) && BLI_available_threads(&threads)==re->r.threads)
+ if( (g_break=re->test_break(re->tbh)) && BLI_available_threads(&threads)==re->r.threads)
rendering= 0;
}
@@ -1615,7 +1618,7 @@ void RE_TileProcessor(Render *re, int firsttile, int threaded)
if(!re->sss_points)
re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
@@ -1636,7 +1639,7 @@ static void do_render_3d(Render *re)
/* do left-over 3d post effects (flares) */
if(re->flag & R_HALO)
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
add_halo_flare(re);
@@ -1709,7 +1712,7 @@ static void do_render_blur_3d(Render *re)
blurfac= 1.0f/(float)(re->r.osa-blur);
merge_renderresult_blur(rres, re->result, blurfac);
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
/* swap results */
@@ -1721,7 +1724,7 @@ static void do_render_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
@@ -1788,7 +1791,7 @@ static void do_render_fields_3d(Render *re)
re->result= NULL;
/* second field */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
re->i.curfield= 2; /* stats */
@@ -1827,7 +1830,7 @@ static void do_render_fields_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
static void load_backbuffer(Render *re)
@@ -1910,8 +1913,8 @@ static void do_render_fields_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_init(re->result);
- re->display_draw(re->result, NULL);
+ re->display_init(re->dih, re->result);
+ re->display_draw(re->ddh, re->result, NULL);
}
}
}
@@ -2017,10 +2020,10 @@ static int composite_needs_render(Scene *sce)
}
/* bad call... need to think over proper method still */
-static void render_composit_stats(char *str)
+static void render_composit_stats(void *unused, char *str)
{
R.i.infostr= str;
- R.stats_draw(&R.i);
+ R.stats_draw(R.sdh, &R.i);
R.i.infostr= NULL;
}
@@ -2086,10 +2089,10 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
if(sample!=re->osa-1) {
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -2127,8 +2130,8 @@ void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
RE_ReadRenderResult(re->scene, re->scene);
/* and now we can draw (result is there) */
- re->display_init(re->result);
- re->display_clear(re->result);
+ re->display_init(re->dih, re->result);
+ re->display_clear(re->dch, re->result);
do_merge_fullsample(re, ntree);
}
@@ -2152,7 +2155,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
if(re->r.scemode & R_SINGLE_LAYER)
pop_render_result(re);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
if(ntree) {
ntreeCompositTagRender(re->scene);
@@ -2165,9 +2168,11 @@ static void do_render_composite_fields_blur_3d(Render *re)
if((re->r.scemode & R_SINGLE_LAYER)==0)
ntree_render_scenes(re);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
ntree->stats_draw= render_composit_stats;
ntree->test_break= re->test_break;
+ ntree->sdh= re->sdh;
+ ntree->tbh= re->tbh;
/* in case it was never initialized */
R.stats_draw= re->stats_draw;
@@ -2178,6 +2183,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
ntree->stats_draw= NULL;
ntree->test_break= NULL;
+ ntree->tbh= ntree->sdh= NULL;
}
}
else if(re->r.scemode & R_FULL_SAMPLE)
@@ -2187,7 +2193,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
#ifndef DISABLE_YAFRAY
@@ -2237,14 +2243,14 @@ static void yafrayRender(Render *re)
RE_FreeRenderResult(re->result);
re->result= rres;
- re->display_init(re->result);
- re->display_draw(re->result, NULL);
+ re->display_init(re->dih, re->result);
+ re->display_draw(re->ddh, re->result, NULL);
}
}
}
re->i.lastframetime = PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
RE_Database_Free(re);
}
@@ -2273,11 +2279,11 @@ static void do_render_all_options(Render *re)
if(re->r.scemode & R_DOSEQ) {
/* note: do_render_seq() frees rect32 when sequencer returns float images */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
; //XXX do_render_seq(re->result, re->r.cfra);
- re->stats_draw(&re->i);
- re->display_draw(re->result, NULL);
+ re->stats_draw(re->sdh, &re->i);
+ re->display_draw(re->ddh, re->result, NULL);
}
else {
@@ -2296,12 +2302,12 @@ static void do_render_all_options(Render *re)
re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* stamp image info here */
if((re->r.scemode & R_STAMP_INFO) && (re->r.stamp & R_STAMP_DRAW)) {
renderresult_stampinfo(re->scene);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
}
@@ -2312,11 +2318,11 @@ static int is_rendering_allowed(Render *re)
/* forbidden combinations */
if(re->r.mode & R_PANORAMA) {
if(re->r.mode & R_BORDER) {
- re->error("No border supported for Panorama");
+ re->error(re->erh, "No border supported for Panorama");
return 0;
}
if(re->r.mode & R_ORTHO) {
- re->error("No Ortho render possible for Panorama");
+ re->error(re->erh, "No Ortho render possible for Panorama");
return 0;
}
}
@@ -2324,11 +2330,11 @@ static int is_rendering_allowed(Render *re)
if(re->r.mode & R_BORDER) {
if(re->r.border.xmax <= re->r.border.xmin ||
re->r.border.ymax <= re->r.border.ymin) {
- re->error("No border area selected.");
+ re->error(re->erh, "No border area selected.");
return 0;
}
if(re->r.scemode & R_EXR_TILE_FILE) {
- re->error("Border render and Buffer-save not supported yet");
+ re->error(re->erh, "Border render and Buffer-save not supported yet");
return 0;
}
}
@@ -2339,7 +2345,7 @@ static int is_rendering_allowed(Render *re)
render_unique_exr_name(re, str, 0);
if (BLI_is_writable(str)==0) {
- re->error("Can not save render buffers, check the temp default path");
+ re->error(re->erh, "Can not save render buffers, check the temp default path");
return 0;
}
@@ -2349,7 +2355,7 @@ static int is_rendering_allowed(Render *re)
/* no fullsample and edge */
if((re->r.scemode & R_FULL_SAMPLE) && (re->r.mode & R_EDGE)) {
- re->error("Full Sample doesn't support Edge Enhance");
+ re->error(re->erh, "Full Sample doesn't support Edge Enhance");
return 0;
}
@@ -2363,7 +2369,7 @@ static int is_rendering_allowed(Render *re)
bNode *node;
if(ntree==NULL) {
- re->error("No Nodetree in Scene");
+ re->error(re->erh, "No Nodetree in Scene");
return 0;
}
@@ -2373,7 +2379,7 @@ static int is_rendering_allowed(Render *re)
if(node==NULL) {
- re->error("No Render Output Node in Scene");
+ re->error(re->erh, "No Render Output Node in Scene");
return 0;
}
}
@@ -2385,7 +2391,7 @@ static int is_rendering_allowed(Render *re)
if(!(re->r.scemode & (R_DOSEQ|R_DOCOMP))) {
if(re->scene->camera==NULL) {
- re->error("No camera");
+ re->error(re->erh, "No camera");
return 0;
}
}
@@ -2401,13 +2407,13 @@ static int is_rendering_allowed(Render *re)
if(!(srl->layflag & SCE_LAY_DISABLE))
break;
if(srl==NULL) {
- re->error("All RenderLayers are disabled");
+ re->error(re->erh, "All RenderLayers are disabled");
return 0;
}
/* renderer */
if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) {
- re->error("Unknown render engine set");
+ re->error(re->erh, "Unknown render engine set");
return 0;
}
return 1;
@@ -2464,8 +2470,8 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim)
if(!is_rendering_allowed(re))
return 0;
- re->display_init(re->result);
- re->display_clear(re->result);
+ re->display_init(re->dih, re->result);
+ re->display_clear(re->dch, re->result);
return 1;
}
@@ -2585,11 +2591,11 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
do_render_all_options(re);
- if(re->test_break() == 0) {
+ if(re->test_break(re->tbh) == 0) {
do_write_image_or_movie(re, scene, mh);
}
} else {
- re->test_break();
+ re->test_break(re->tbh);
}
}
} else {
@@ -2633,7 +2639,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
do_render_all_options(re);
- if(re->test_break() == 0) {
+ if(re->test_break(re->tbh) == 0) {
do_write_image_or_movie(re, scene, mh);
}
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index a54afafc8c9..e89cf20e4b1 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -180,13 +180,13 @@ void makeraytree(Render *re)
double time= PIL_check_seconds_timer();
vlr= obr->vlaknodes[v>>8].vlak;
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
if(time-lasttime>1.0f) {
char str[32];
sprintf(str, "Filling Octree: %d", totv);
re->i.infostr= str;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
lasttime= time;
}
@@ -202,7 +202,7 @@ void makeraytree(Render *re)
RE_ray_tree_done(re->raytree);
re->i.infostr= NULL;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index c3b281f2a23..ebefbad6e21 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -314,7 +314,7 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
}
}
}
- if(R.test_break() ) break;
+ if(R.test_break(R.tbh) ) break;
}
}
@@ -430,7 +430,7 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
if(rd) rd++;
}
if(y&1)
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
}
@@ -662,7 +662,7 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl)
}
if(y&1)
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
}
@@ -760,7 +760,7 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
int samp;
int x, y, seed, crop=0, offs=0, od;
- if(R.test_break()) return;
+ if(R.test_break(R.tbh)) return;
/* irregular shadowb buffer creation */
if(R.r.mode & R_SHADOW)
@@ -821,7 +821,7 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
rectdaps+= pa->rectx;
offs+= pa->rectx;
- if(y&1) if(R.test_break()) break;
+ if(y&1) if(R.test_break(R.tbh)) break;
}
/* disable scanline updating */
@@ -1142,7 +1142,7 @@ void zbufshadeDA_tile(RenderPart *pa)
sdata.psmlist= &psmlist;
sdata.edgerect= edgerect;
zbuffer_solid(pa, rl, make_pixelstructs, &sdata);
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
/* shades solid */
@@ -1280,7 +1280,7 @@ void zbufshade_tile(RenderPart *pa)
zbuffer_solid(pa, rl, NULL, NULL);
- if(!R.test_break()) { /* NOTE: this if() is not consistant */
+ if(!R.test_break(R.tbh)) { /* NOTE: this if() is not consistant */
/* edges only for solid part, ztransp doesn't support it yet anti-aliased */
if(rl->layflag & SCE_LAY_EDGE) {
@@ -1325,7 +1325,7 @@ void zbufshade_tile(RenderPart *pa)
}
}
if(y&1)
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
if(R.occlusiontree)
@@ -1377,7 +1377,7 @@ void zbufshade_tile(RenderPart *pa)
if(rl->layflag & SCE_LAY_SKY)
sky_tile(pa, rl);
- if(!R.test_break()) {
+ if(!R.test_break(R.tbh)) {
if(rl->layflag & SCE_LAY_EDGE)
if(R.r.mode & R_EDGE)
edge_enhance_add(pa, rl->rectf, edgerect);
@@ -1717,7 +1717,7 @@ void zbufshade_sss_tile(RenderPart *pa)
}
if(y&1)
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
/* note: after adding we do not free these arrays, sss keeps them */
@@ -1797,7 +1797,7 @@ static void renderhalo_post(RenderResult *rr, float *rectf, HaloRen *har) /* pos
rectft+= 4*rr->rectx;
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
}
}
@@ -1915,7 +1915,7 @@ void add_halo_flare(Render *re)
if(do_draw) {
/* weak... the display callback wants an active renderlayer pointer... */
rr->renlay= rl;
- re->display_draw(rr, NULL);
+ re->display_draw(re->ddh, rr, NULL);
}
R.r.mode= mode;
@@ -2334,7 +2334,7 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
ShadeInput *shi= ssamp->shi;
/* fast threadsafe break test */
- if(R.test_break())
+ if(R.test_break(R.tbh))
return;
/* setup render coordinates */
@@ -2567,7 +2567,7 @@ static void *do_bake_thread(void *bs_v)
shade_tface(bs);
/* fast threadsafe break test */
- if(R.test_break())
+ if(R.test_break(R.tbh))
break;
}
bs->ready= 1;
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index c53a2b68c9c..71cd678233d 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -425,7 +425,7 @@ void makeshadowbuf(Render *re, LampRen *lar)
/* create Z tiles (for compression): this system is 24 bits!!! */
compress_shadowbuf(shb, rectz, lar->mode & LA_SQUARE);
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -457,13 +457,13 @@ static void *do_shadow_thread(void *re_v)
lar->thread_ready= 1;
BLI_unlock_thread(LOCK_CUSTOM1);
}
- } while(lar && !re->test_break());
+ } while(lar && !re->test_break(re->tbh));
return NULL;
}
static volatile int g_break= 0;
-static int thread_break(void)
+static int thread_break(void *unused)
{
return g_break;
}
@@ -473,7 +473,7 @@ void threaded_makeshadowbufs(Render *re)
ListBase threads;
LampRen *lar;
int a, totthread= 0;
- int (*test_break)(void);
+ int (*test_break)(void *);
/* count number of threads to use */
if(G.rendering) {
@@ -488,7 +488,7 @@ void threaded_makeshadowbufs(Render *re)
if(totthread <= 1) {
for(lar=re->lampren.first; lar; lar= lar->next) {
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
if(lar->shb) {
/* if type is irregular, this only sets the perspective matrix and autoclips */
makeshadowbuf(re, lar);
@@ -512,7 +512,7 @@ void threaded_makeshadowbufs(Render *re)
/* keep rendering as long as there are shadow buffers not ready */
do {
- if((g_break=test_break()))
+ if((g_break=test_break(re->tbh)))
break;
PIL_sleep_ms(50);
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index 9bde6675798..7bb2aef2e6e 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -852,7 +852,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
float (*co)[3] = NULL, (*color)[3] = NULL, *area = NULL;
int totpoint = 0, osa, osaflag, partsdone;
- if(re->test_break())
+ if(re->test_break(re->tbh))
return;
points.first= points.last= NULL;
@@ -888,7 +888,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
return;
/* merge points together into a single buffer */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
for(totpoint=0, p=points.first; p; p=p->next)
totpoint += p->totpoint;
@@ -913,7 +913,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
BLI_freelistN(&points);
/* build tree */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
SSSData *sss= MEM_callocN(sizeof(*sss), "SSSData");
float ior= mat->sss_ior, cfac= mat->sss_colfac;
float *col= mat->sss_col, *radius= mat->sss_radius;
@@ -981,7 +981,7 @@ void make_sss_tree(Render *re)
re->sss_hash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
re->i.infostr= "SSS preprocessing";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
for(mat= G.main->mat.first; mat; mat= mat->id.next)
if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 05e36160f0e..3c8c1640b75 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -773,7 +773,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand
float z[4], bounds[4], winmat[4][4];
int a, b, c, i, totsegment, clip[4];
- if(re->test_break())
+ if(re->test_break(re->tbh))
return 0;
if(re->totstrand == 0)
return 0;
@@ -881,7 +881,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand
}
}
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
/* convert list to array and sort */
sortsegments= MEM_mallocN(sizeof(StrandSortSegment)*totsegment, "StrandSortSegment");
for(a=0, sortseg=firstseg; a<totsegment; a++, sortseg=sortseg->next)
@@ -893,11 +893,11 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand
spart.totapixbuf= MEM_callocN(sizeof(int)*pa->rectx*pa->recty, "totapixbuf");
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
/* render segments in sorted order */
sortseg= sortsegments;
for(a=0; a<totsegment; a++, sortseg++) {
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
obi= &re->objectinstance[sortseg->obi];
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 509ac81c58b..b68cecce7bd 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -2495,7 +2495,7 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
}
}
- if((a & 255)==255 && re->test_break())
+ if((a & 255)==255 && re->test_break(re->tbh))
break;
}
@@ -2544,13 +2544,13 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
}
}
- if((a & 255)==255 && re->test_break())
+ if((a & 255)==255 && re->test_break(re->tbh))
break;
}
}
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -3512,13 +3512,13 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, Re
}
}
if((v & 255)==255)
- if(R.test_break())
+ if(R.test_break(R.tbh))
break;
}
}
}
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
for(zsample=0; zsample<samples; zsample++) {
@@ -4013,7 +4013,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
unsigned short *ztramask= NULL, filled;
/* looks nicer for calling code */
- if(R.test_break())
+ if(R.test_break(R.tbh))
return NULL;
if(R.osa>16) { /* MAX_OSA */
@@ -4096,7 +4096,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
apstrand= aprectstrand;
od= offs;
- if(R.test_break())
+ if(R.test_break(R.tbh))
break;
for(x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, ap++, apstrand++, pass+=4, od++) {