[Bf-blender-cvs] [5861909] soc-2016-cycles_denoising: Cycles/Render API: Implement interactive updating while denoising
Lukas Stockner
noreply at git.blender.org
Mon Jul 11 23:32:23 CEST 2016
Commit: 58619096a5cd10d7ab3f2884d3104a5231e8e0fe
Author: Lukas Stockner
Date: Mon Jul 11 22:41:11 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB58619096a5cd10d7ab3f2884d3104a5231e8e0fe
Cycles/Render API: Implement interactive updating while denoising
The tile highlighting is still a bit random and the progress bar isn't showing either,
but the basic live update works.
To avoid lots of duplicated code, editors/render and editors/space_image now share two functions.
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/device/device_cpu.cpp
M source/blender/editors/render/render_intern.h
M source/blender/editors/render/render_internal.c
M source/blender/editors/space_image/image_intern.h
M source/blender/editors/space_image/image_ops.c
M source/blender/render/extern/include/RE_engine.h
M source/blender/render/intern/source/external_engine.c
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 585617c..bd14097 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -1362,6 +1362,9 @@ void BlenderSession::denoise(BL::RenderResult& b_rr)
session = new Session(session_params);
session->set_pause(false);
+ b_engine.use_highlight_tiles(true);
+ session->progress.set_update_callback(function_bind(&BlenderSession::tag_redraw, this));
+ session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1, _2);
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 2150f94..5749f75 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -365,6 +365,8 @@ public:
#endif
delete[] storages;
tile.sample = sample;
+
+ task.update_progress(&tile);
}
task.release_tile(tile);
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h
index fb07b03..0edfb3e 100644
--- a/source/blender/editors/render/render_intern.h
+++ b/source/blender/editors/render/render_intern.h
@@ -102,5 +102,9 @@ void RENDER_OT_view_cancel(struct wmOperatorType *ot);
/* render_opengl.c */
void RENDER_OT_opengl(struct wmOperatorType *ot);
+/* space_image */
+void image_buffer_rect_update(struct Scene *scene, struct RenderResult *rr, struct ImBuf *ibuf, struct ImageUser *iuser, volatile rcti *renrect, const char *viewname,
+ struct ColorManagedViewSettings *view_settings, struct ColorManagedDisplaySettings *display_settings);
+
#endif /* __RENDER_INTERN_H__ */
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 1203889..80ede3a 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -119,133 +119,6 @@ typedef struct RenderJob {
bool interface_locked;
} RenderJob;
-/* called inside thread! */
-static void image_buffer_rect_update(RenderJob *rj, RenderResult *rr, ImBuf *ibuf, ImageUser *iuser, volatile rcti *renrect, const char *viewname)
-{
- Scene *scene = rj->scene;
- const float *rectf = NULL;
- int ymin, ymax, xmin, xmax;
- int rymin, rxmin;
- int linear_stride, linear_offset_x, linear_offset_y;
- ColorManagedViewSettings *view_settings;
- ColorManagedDisplaySettings *display_settings;
-
- /* Exception for exr tiles -- display buffer conversion happens here,
- * NOT in the color management pipeline.
- */
- if (ibuf->userflags & IB_DISPLAY_BUFFER_INVALID &&
- rr->do_exr_tile == false)
- {
- /* The whole image buffer it so be color managed again anyway. */
- return;
- }
-
- /* if renrect argument, we only refresh scanlines */
- if (renrect) {
- /* if (ymax == recty), rendering of layer is ready, we should not draw, other things happen... */
- if (rr->renlay == NULL || renrect->ymax >= rr->recty)
- return;
-
- /* xmin here is first subrect x coord, xmax defines subrect width */
- xmin = renrect->xmin + rr->crop;
- xmax = renrect->xmax - xmin + rr->crop;
- if (xmax < 2)
- return;
-
- ymin = renrect->ymin + rr->crop;
- ymax = renrect->ymax - ymin + rr->crop;
- if (ymax < 2)
- return;
- renrect->ymin = renrect->ymax;
-
- }
- else {
- xmin = ymin = rr->crop;
- xmax = rr->rectx - 2 * rr->crop;
- ymax = rr->recty - 2 * rr->crop;
- }
-
- /* xmin ymin is in tile coords. transform to ibuf */
- rxmin = rr->tilerect.xmin + xmin;
- if (rxmin >= ibuf->x) return;
- rymin = rr->tilerect.ymin + ymin;
- if (rymin >= ibuf->y) return;
-
- if (rxmin + xmax > ibuf->x)
- xmax = ibuf->x - rxmin;
- if (rymin + ymax > ibuf->y)
- ymax = ibuf->y - rymin;
-
- if (xmax < 1 || ymax < 1) return;
-
- /* The thing here is, the logic below (which was default behavior
- * of how rectf is acquiring since forever) gives float buffer for
- * composite output only. This buffer can not be used for other
- * passes obviously.
- *
- * We might try finding corresponding for pass buffer in render result
- * (which is actually missing when rendering with Cycles, who only
- * writes all the passes when the tile is finished) or use float
- * buffer from image buffer as reference, which is easier to use and
- * contains all the data we need anyway.
- * - sergey -
- */
- /* TODO(sergey): Need to check has_combined here? */
- if (iuser->pass == 0) {
- RenderView *rv;
- const int view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname);
- rv = RE_RenderViewGetById(rr, view_id);
-
- /* find current float rect for display, first case is after composite... still weak */
- if (rv->rectf)
- rectf = rv->rectf;
- else {
- if (rv->rect32) {
- /* special case, currently only happens with sequencer rendering,
- * which updates the whole frame, so we can only mark display buffer
- * as invalid here (sergey)
- */
- ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
- return;
- }
- else {
- if (rr->renlay == NULL) return;
- rectf = RE_RenderLayerGetPass(rr->renlay, SCE_PASS_COMBINED, viewname);
- }
- }
- if (rectf == NULL) return;
-
- rectf += 4 * (rr->rectx * ymin + xmin);
- linear_stride = rr->rectx;
- linear_offset_x = rxmin;
- linear_offset_y = rymin;
- }
- else {
- rectf = ibuf->rect_float;
- linear_stride = ibuf->x;
- linear_offset_x = 0;
- linear_offset_y = 0;
- }
-
- if (rr->do_exr_tile) {
- /* We don't support changing color management settings during rendering
- * when using Save Buffers option.
- */
- view_settings = &rj->view_settings;
- display_settings = &rj->display_settings;
- }
- else {
- view_settings = &scene->view_settings;
- display_settings = &scene->display_settings;
- }
-
- IMB_partial_display_buffer_update(ibuf, rectf, NULL,
- linear_stride, linear_offset_x, linear_offset_y,
- view_settings, display_settings,
- rxmin, rymin, rxmin + xmax, rymin + ymax,
- rr->do_exr_tile);
-}
-
/* ****************************** render invoking ***************** */
/* set callbacks, exported to sequence render too.
@@ -572,7 +445,9 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec
ibuf->channels == 1 ||
U.image_draw_method != IMAGE_DRAW_METHOD_GLSL)
{
- image_buffer_rect_update(rj, rr, ibuf, &rj->iuser, renrect, viewname);
+ image_buffer_rect_update(rj->scene, rr, ibuf, &rj->iuser, renrect, viewname,
+ rr->do_exr_tile? &rj->view_settings : &rj->scene->view_settings,
+ rr->do_exr_tile? &rj->display_settings : &rj->scene->display_settings);
}
/* make jobs timer to send notifier */
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index 66776d9..a8e3c7b 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -94,11 +94,17 @@ void IMAGE_OT_clear_render_border(struct wmOperatorType *ot);
void IMAGE_OT_postprocess(struct wmOperatorType *ot);
+void image_buffer_rect_update(struct Scene *scene, struct RenderResult *rr, struct ImBuf *ibuf, struct ImageUser *iuser, volatile rcti *renrect, const char *viewname,
+ struct ColorManagedViewSettings *view_settings, struct ColorManagedDisplaySettings *display_settings);
+
/* image_panels.c */
struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree);
void image_buttons_register(struct ARegionType *art);
void IMAGE_OT_properties(struct wmOperatorType *ot);
void IMAGE_OT_toolshelf(struct wmOperatorType *ot);
+/* render */
+struct ScrArea *render_view_open(struct bContext *C, int mx, int my, struct ReportList *reports);
+
#endif /* __IMAGE_INTERN_H__ */
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 10aae98..da53284 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -3665,11 +3665,19 @@ void IMAGE_OT_clear_render_border(wmOperatorType *ot)
typedef struct PostprocessJob {
RenderResult *rr;
+ Render *re;
+
float *progress;
+ short *do_update;
+ short *stop;
+ bool image_outdated;
+ int last_layer;
+ ScrArea *sa;
Scene *scene;
Image *ima;
ImageUser *iuser;
+ Main *main;
} PostprocessJob;
static int postprocess_poll(bContext *C)
@@ -3706,8 +3714,9 @@ static int postprocess_exec(bContext *C, wmOperator *UNUSED(op))
Scene *scene = CTX_data_scene(C);
Image *ima = CTX_data_edit_image(C);
RenderResult *rr = BKE_image_acquire_renderresult(scene, ima);
+ Render *re = RE_NewRender(scene->id.name);
- RE_engine_postprocess(scene, rr);
+ RE_engine_postprocess(scene, re, rr);
BKE_image_release_renderresult(scene, ima);
@@ -3723,22 +3732,25 @@ static void postprocess_startjob(void *pj, short *stop, short *do_update, float
{
PostprocessJob *job = pj;
job->progress = progress;
+ job->do_update = do_update;
+ job->stop = stop;
- RE_engine_postprocess(job->scene, job->rr);
+ RE_engine_postprocess(job->scene, job->re, job->rr);
}
static void postprocess_endjob(void *pj) {
PostprocessJob *job = pj;
- void *lock;
- ImBuf *ibuf;
WM_main_add_notifier(NC_SCENE | ND_RENDER_RESULT, NULL);
- ibuf = BKE_image_acquire_ibuf(job->ima, job->iuser, &lock);
+ if (job->image_outdated) {
+ void *lock;
+ ImBuf *ibuf = BKE_image_acquire_ibuf(job->ima, job->iuser, &lock);
- if (ibuf)
- ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
- BKE_image_release_ibuf(job->ima, ibuf, lock);
+ if (ibuf)
+ ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
+ BKE_image_release_ibuf(job->ima, ibuf, lock);
+ }
}
static void postprocess_freejob(void *pj)
@@ -3749,6 +3761,240 @@ static void postprocess_freejob(void *pj)
MEM_freeN(pj);
}
+static int postprocess_breakjob(void *pj)
+{
+ PostprocessJob *job = pj;
+
+ if (G.is_b
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list