[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49706] trunk/blender/source/blender: Sequencer: initial implementation of multithreaded effects

Sergey Sharybin sergey.vfx at gmail.com
Wed Aug 8 18:46:45 CEST 2012


Revision: 49706
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49706
Author:   nazgul
Date:     2012-08-08 16:46:45 +0000 (Wed, 08 Aug 2012)
Log Message:
-----------
Sequencer: initial implementation of multithreaded effects

Added a framework to run effects in several threads. Port most
of effects to this new framework.

Still some work to be done here (some effects are not so easy to port)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/seqeffects.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-08-08 16:46:44 UTC (rev 49705)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-08-08 16:46:45 UTC (rev 49706)
@@ -110,6 +110,8 @@
 };
 
 struct SeqEffectHandle {
+	int multithreaded;
+
 	/* constructors & destructor */
 	/* init is _only_ called on first creation */
 	void (*init)(struct Sequence *seq);
@@ -147,6 +149,12 @@
 	
 	struct ImBuf * (*execute)(SeqRenderData context, struct Sequence *seq, float cfra, float facf0, float facf1,
 	                          struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3);
+
+	struct ImBuf * (*init_execution)(SeqRenderData context, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3);
+
+	void (*execute_slice)(SeqRenderData context, struct Sequence *seq, float cfra, float facf0, float facf1,
+	                      struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3,
+	                       int start_line, int total_lines, struct ImBuf *out);
 };
 
 /* ********************* prototypes *************** */

Modified: trunk/blender/source/blender/blenkernel/intern/seqeffects.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/seqeffects.c	2012-08-08 16:46:44 UTC (rev 49705)
+++ trunk/blender/source/blender/blenkernel/intern/seqeffects.c	2012-08-08 16:46:45 UTC (rev 49706)
@@ -56,8 +56,38 @@
 
 #include "RNA_access.h"
 
-/* **** XXX **** */
+static void slize_get_byte_buffers(const SeqRenderData *context, const ImBuf *ibuf1, const ImBuf *ibuf2,
+                                   const ImBuf *ibuf3, const ImBuf *out, int start_line, unsigned char **rect1,
+                                   unsigned char **rect2, unsigned char **rect3, unsigned char **rect_out)
+{
+	int offset = 4 * start_line * context->rectx;
 
+	*rect1 = (unsigned char*) ibuf1->rect + offset;
+	*rect_out = (unsigned char*) out->rect + offset;
+
+	if (ibuf2)
+		*rect2 = (unsigned char*) ibuf2->rect + offset;
+
+	if (ibuf3)
+		*rect3 = (unsigned char*) ibuf3->rect + offset;
+}
+
+static void slize_get_float_buffers(const SeqRenderData *context, const ImBuf *ibuf1, const ImBuf *ibuf2,
+                                    const ImBuf *ibuf3, const ImBuf *out, int start_line,
+                                    float **rect1, float **rect2, float **rect3, float **rect_out)
+{
+	int offset = 4 * start_line * context->rectx;
+
+	*rect1 = ibuf1->rect_float + offset;
+	*rect_out = out->rect_float + offset;
+
+	if (ibuf2)
+		*rect2 = ibuf2->rect_float + offset;
+
+	if (ibuf3)
+		*rect3 = ibuf3->rect_float + offset;
+}
+
 /*********************** Glow effect *************************/
 
 enum {
@@ -249,25 +279,24 @@
 	}
 }
 
-static ImBuf *do_alphaover_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0,
-								  float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_alphaover_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0,
+                                float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+                                int start_line, int total_lines, ImBuf *out)
 {
-	ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
+	if (out->rect_float) {
+		float *rect1, *rect2, *rect_out;
 
-	if (out->rect_float) {
-		do_alphaover_effect_float(
-		        facf0, facf1, context.rectx, context.recty,
-		        ibuf1->rect_float, ibuf2->rect_float,
-		        out->rect_float);
+		slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_alphaover_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
 	}
 	else {
-		do_alphaover_effect_byte(
-		        facf0, facf1, context.rectx, context.recty,
-		        (char *) ibuf1->rect, (char *) ibuf2->rect,
-		        (char *) out->rect);
+		unsigned char *rect1, *rect2, *rect_out;
+
+		slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_alphaover_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
 	}
-
-	return out;
 }
 
 /*********************** Alpha Under *************************/
@@ -412,20 +441,24 @@
 	}
 }
 
-static ImBuf *do_alphaunder_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
-                                   float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_alphaunder_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+                                 float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+                                 int start_line, int total_lines, ImBuf *out)
 {
-	ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
+	if (out->rect_float) {
+		float *rect1, *rect2, *rect_out;
 
-	if (out->rect_float) {
-		do_alphaunder_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
-		                           ibuf2->rect_float, out->rect_float);
+		slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_alphaunder_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
 	}
 	else {
-		do_alphaunder_effect_byte(facf0, facf1, context.rectx, context.recty,
-		                          (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
+		unsigned char *rect1, *rect2, *rect_out;
+
+		slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_alphaunder_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
 	}
-	return out;
 }
 
 /*********************** Cross *************************/
@@ -518,22 +551,24 @@
 	}
 }
 
-/* careful: also used by speed effect! */
-
-static ImBuf *do_cross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
-                              float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_cross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+                            float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+                            int start_line, int total_lines, ImBuf *out)
 {
-	ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
+	if (out->rect_float) {
+		float *rect1, *rect2, *rect_out;
 
-	if (out->rect_float) {
-		do_cross_effect_float(facf0, facf1, context.rectx, context.recty,
-		                      ibuf1->rect_float, ibuf2->rect_float, out->rect_float);
+		slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_cross_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
 	}
 	else {
-		do_cross_effect_byte(facf0, facf1, context.rectx, context.recty,
-		                     (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
+		unsigned char *rect1, *rect2, *rect_out;
+
+		slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_cross_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
 	}
-	return out;
 }
 
 /*********************** Gamma Cross *************************/
@@ -757,24 +792,32 @@
 	}
 }
 
-static ImBuf *do_gammacross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
-                                   float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static struct ImBuf *gammacross_init_execution(SeqRenderData context, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
 {
 	ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
 	build_gammatabs();
 
+	return out;
+}
+
+static void do_gammacross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+                                 float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+                                 int start_line, int total_lines, ImBuf *out)
+{
 	if (out->rect_float) {
-		do_gammacross_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
-		                           ibuf2->rect_float, out->rect_float);
+		float *rect1, *rect2, *rect_out;
+
+		slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_gammacross_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
 	}
 	else {
-		do_gammacross_effect_byte(facf0, facf1, context.rectx, context.recty,
-		                          (unsigned char *) ibuf1->rect, (unsigned char *) ibuf2->rect,
-		                          (unsigned char *) out->rect);
+		unsigned char *rect1, *rect2, *rect_out;
+
+		slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_gammacross_effect_byte(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
 	}
-
-	return out;
 }
 
 /*********************** Add *************************/
@@ -864,21 +907,23 @@
 	}
 }
 
-static ImBuf *do_add_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
-                            ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_add_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
+                          ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
 {
-	ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
+	if (out->rect_float) {
+		float *rect1, *rect2, *rect_out;
 
-	if (out->rect_float) {
-		do_add_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
-		                    ibuf2->rect_float, out->rect_float);
+		slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+		do_add_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
 	}
 	else {
-		do_add_effect_byte(facf0, facf1, context.rectx, context.recty, (unsigned char *) ibuf1->rect,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list