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/editors/preview | |
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/editors/preview')
-rw-r--r-- | source/blender/editors/preview/previewrender.c | 193 |
1 files changed, 170 insertions, 23 deletions
diff --git a/source/blender/editors/preview/previewrender.c b/source/blender/editors/preview/previewrender.c index c36035a3da8..20bc49d7029 100644 --- a/source/blender/editors/preview/previewrender.c +++ b/source/blender/editors/preview/previewrender.c @@ -84,6 +84,9 @@ #include "GPU_material.h" +#include "WM_api.h" +#include "WM_types.h" + #include "ED_anim_api.h" #include "ED_view3d.h" @@ -100,6 +103,19 @@ static int qtest() {return 0;} /* XXX */ +typedef struct ShaderPreview { + /* from wmJob */ + void *owner; + short *stop, *do_update; + + Scene *scene; + ID *id; + + int sizex, sizey; + int pr_method; +} ShaderPreview; + + static void set_previewrect(ScrArea *sa, RenderInfo *ri) { ARegion *ar= NULL; // XXX @@ -249,7 +265,7 @@ void BIF_preview_changed(short id_code) static Main *pr_main= NULL; -void BIF_preview_init_dbase(void) +void ED_preview_init_dbase(void) { BlendFileData *bfd; extern int datatoc_preview_blend_size; @@ -265,7 +281,7 @@ void BIF_preview_init_dbase(void) G.fileflags &= ~G_FILE_NO_UI; } -void BIF_preview_free_dbase(void) +void ED_preview_free_dbase(void) { if(pr_main) free_main(pr_main); @@ -280,12 +296,13 @@ static Object *find_object(ListBase *lb, const char *name) return ob; } -/* call this with an ID pointer to initialize preview scene */ -/* call this with ID NULL to restore assigned ID pointers in preview scene */ -static Scene *preview_prepare_scene(Scene *scene, RenderInfo *ri, int id_type, ID *id, int pr_method) +/* call this with a pointer to initialize preview scene */ +/* call this with NULL to restore assigned ID pointers in preview scene */ +static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp) { Scene *sce; Base *base; + ID *id= sp?sp->id:NULL; if(pr_main==NULL) return NULL; @@ -331,7 +348,7 @@ static Scene *preview_prepare_scene(Scene *scene, RenderInfo *ri, int id_type, I } - if(pr_method==PR_ICON_RENDER) { + if(sp->pr_method==PR_ICON_RENDER) { if (mat->mode & MA_HALO) { sce->lay= 1<<MA_FLAT; } @@ -342,7 +359,7 @@ static Scene *preview_prepare_scene(Scene *scene, RenderInfo *ri, int id_type, I else { sce->lay= 1<<mat->pr_type; if(mat->nodetree) - ntreeInitPreview(mat->nodetree, ri->pr_rectx, ri->pr_recty); + ntreeInitPreview(mat->nodetree, sp->sizex, sp->sizey); } } else { @@ -412,7 +429,7 @@ static Scene *preview_prepare_scene(Scene *scene, RenderInfo *ri, int id_type, I return NULL; } -static void previewrender_progress(RenderResult *rr, volatile rcti *renrect) +void previewrender_progress(void *handle, RenderResult *rr, volatile rcti *renrect) { SpaceButs *sbuts= NULL; // XXX RenderLayer *rl; @@ -436,10 +453,10 @@ static void previewrender_progress(RenderResult *rr, volatile rcti *renrect) /* called by interface_icons.c, or by BIF_previewrender_buts or by nodes... */ void BIF_previewrender(Scene *scene, struct ID *id, struct RenderInfo *ri, struct ScrArea *area, int pr_method) { + SpaceButs *sbuts= NULL; // XXX Render *re; RenderStats *rstats; Scene *sce; - SpaceButs *sbuts= NULL; int oldx= ri->pr_rectx, oldy= ri->pr_recty; char name [32]; @@ -453,7 +470,7 @@ void BIF_previewrender(Scene *scene, struct ID *id, struct RenderInfo *ri, struc } /* get the stuff from the builtin preview dbase */ - sce= preview_prepare_scene(scene, ri, GS(id->name), id, pr_method); +// sce= preview_prepare_scene(scene, ri, GS(id->name), id, pr_method); if(sce==NULL) return; /* set drawing conditions OK */ @@ -480,15 +497,15 @@ void BIF_previewrender(Scene *scene, struct ID *id, struct RenderInfo *ri, struc /* handle cases */ if(pr_method==PR_DRAW_RENDER) { - RE_display_draw_cb(re, previewrender_progress); - RE_test_break_cb(re, qtest); +// RE_display_draw_cb(re, previewrender_progress); +// RE_test_break_cb(re, qtest); sce->r.scemode |= R_NODE_PREVIEW; if(sbuts->flag & SB_PRV_OSA) sce->r.mode |= R_OSA; sce->r.scemode &= ~R_NO_IMAGE_LOAD; } else if(pr_method==PR_DO_RENDER) { - RE_test_break_cb(re, qtest); +// RE_test_break_cb(re, qtest); sce->r.scemode |= R_NODE_PREVIEW; sce->r.scemode &= ~R_NO_IMAGE_LOAD; } @@ -540,7 +557,7 @@ void BIF_previewrender(Scene *scene, struct ID *id, struct RenderInfo *ri, struc } /* unassign the pointers, reset vars */ - preview_prepare_scene(scene, ri, GS(id->name), NULL, 0); +// preview_prepare_scene(scene, ri, GS(id->name), NULL, 0); } @@ -646,13 +663,8 @@ void BIF_previewdraw(ScrArea *sa, uiBlock *block) } /* *************************** Preview for 3d window *********************** */ -static void view3d_previewrender_stats(RenderStats *rs) -{ -// if(rs->convertdone) -// printf("rendered %d %.3f\n", rs->partsdone, rs->lastframetime); -} -static void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect) +void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect) { // ScrArea *sa= NULL; // XXX // View3D *v3d= NULL; // XXX @@ -814,9 +826,9 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa) sprintf(name, "View3dPreview %p", sa); re= ri->re= RE_NewRender(name); - RE_display_draw_cb(re, view3d_previewrender_progress); - RE_stats_draw_cb(re, view3d_previewrender_stats); - RE_test_break_cb(re, qtest); + //RE_display_draw_cb(re, view3d_previewrender_progress); + //RE_stats_draw_cb(re, view3d_previewrender_stats); + //RE_test_break_cb(re, qtest); /* no osa, blur, seq, layers, etc for preview render */ rdata= scene->r; @@ -960,3 +972,138 @@ void BIF_view3d_previewdraw(struct ScrArea *sa, struct uiBlock *block) // } } + +/* **************************** New preview system ****************** */ + +/* called by renderer, sets job update value */ +static void shader_preview_draw(void *spv, RenderResult *rr, volatile struct rcti *rect) +{ + ShaderPreview *sp= spv; + + *(sp->do_update)= 1; +} + +/* called by renderer, checks job value */ +static int shader_preview_break(void *spv) +{ + ShaderPreview *sp= spv; + + return *(sp->stop); +} + + +static void shader_preview_startjob(void *customdata, short *stop, short *do_update) +{ + ShaderPreview *sp= customdata; + Render *re; + RenderStats *rstats; + Scene *sce; + char name [32]; + + sp->stop= stop; + sp->do_update= do_update; + + /* get the stuff from the builtin preview dbase */ + sce= preview_prepare_scene(sp->scene, GS(sp->id->name), sp); + if(sce==NULL) return; + + sprintf(name, "Preview %p", sp->owner); + re= RE_GetRender(name); + + /* full refreshed render from first tile */ + if(re==NULL) { + re= RE_NewRender(name); + + /* sce->r gets copied in RE_InitState! */ + if(sp->pr_method==PR_DO_RENDER) { + sce->r.scemode |= R_NODE_PREVIEW; + sce->r.scemode &= ~R_NO_IMAGE_LOAD; + } + else { /* PR_ICON_RENDER */ + sce->r.scemode &= ~R_NODE_PREVIEW; + sce->r.scemode |= R_NO_IMAGE_LOAD; + } + + /* allocates render result */ + RE_InitState(re, NULL, &sce->r, sp->sizex, sp->sizey, NULL); + } + + /* callbacs are cleared on GetRender() */ + if(sp->pr_method==PR_DO_RENDER) { + RE_display_draw_cb(re, sp, shader_preview_draw); + RE_test_break_cb(re, sp, shader_preview_break); + } + + /* enforce preview image clear */ +// if(GS(sp->id->name)==ID_MA) { +// Material *ma= (Material *)sp->id; +// ntreeClearPreview(ma->nodetree); +// } + + /* entire cycle for render engine */ + RE_SetCamera(re, sce->camera); + RE_Database_FromScene(re, sce, 1); + RE_TileProcessor(re, 0, 0); // actual render engine + RE_Database_Free(re); + + *do_update= 1; + + /* handle results */ + if(sp->pr_method==PR_ICON_RENDER) { + //if(ri->rect==NULL) + // ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender"); + //RE_ResultGet32(re, ri->rect); + } + else { + rstats= RE_GetStats(re); + + if(rstats->totpart==rstats->partsdone && rstats->partsdone) { + // allqueues + } + else { + // if(pr_method==PR_DRAW_RENDER && qtest()) + // addafterqueue(area->win, RENDERPREVIEW, 1); + } + } + + /* unassign the pointers, reset vars */ + preview_prepare_scene(sp->scene, GS(sp->id->name), NULL); + +} + +static void shader_preview_free(void *customdata) +{ + ShaderPreview *sp= customdata; + + MEM_freeN(sp); +} + +static void shader_preview_update(void *customdata) +{ +// ShaderPreview *sp= customdata; + +} + + +void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, int sizey) +{ + wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner); + ShaderPreview *sp= MEM_callocN(sizeof(ShaderPreview), "shader preview"); + + /* customdata for preview thread */ + sp->scene= CTX_data_scene(C); + sp->owner= owner; + sp->sizex= sizex; + sp->sizey= sizey; + sp->pr_method= PR_DO_RENDER; + sp->id = id; + + /* setup job */ + WM_jobs_customdata(steve, sp, shader_preview_free); + WM_jobs_timer(steve, 0.1, NC_MATERIAL); + WM_jobs_callbacks(steve, shader_preview_startjob, NULL, shader_preview_update); + + WM_jobs_start(steve); +} + + |