[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