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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to