diff options
author | Ton Roosendaal <ton@blender.org> | 2009-01-22 17:59:49 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-01-22 17:59:49 +0300 |
commit | 9cc59fb0c329bb788defe9c56b69d0919caaba96 (patch) | |
tree | f6f1c48441ba6de4f2ff1faf19a0540ce1dc6ba5 /source/blender/render/intern | |
parent | a017982074b3b11fd0157d8d604e02858411db70 (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/intern')
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 27 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 48 | ||||
-rw-r--r-- | source/blender/render/intern/source/envmap.c | 16 | ||||
-rw-r--r-- | source/blender/render/intern/source/occlusion.c | 8 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 156 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayshade.c | 6 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 28 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadbuf.c | 12 | ||||
-rw-r--r-- | source/blender/render/intern/source/sss.c | 8 | ||||
-rw-r--r-- | source/blender/render/intern/source/strand.c | 8 | ||||
-rw-r--r-- | source/blender/render/intern/source/zbuf.c | 14 |
11 files changed, 172 insertions, 159 deletions
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++) { |