[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33389] branches/particles-2010/source/ blender: Simplified the way node output buffers are prepared.

Lukas Toenne lukas.toenne at googlemail.com
Tue Nov 30 13:30:19 CET 2010


Revision: 33389
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33389
Author:   lukastoenne
Date:     2010-11-30 13:30:18 +0100 (Tue, 30 Nov 2010)

Log Message:
-----------
Simplified the way node output buffers are prepared. Instead of first setting context with a callback, then initialising the buffers and then doing the actual enqueueing in another callback, the context and buffer allocation is now done automatically. When calling the output iterator init function or adding outputs to a kernel respectively, a custom context can now be passed as an argument. If no explicit context is provided, the "largest" context from the inputs is chosen.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/nodes/intern/SIM_intern.c
    branches/particles-2010/source/blender/nodes/intern/SIM_intern.h
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_constant.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_curve.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_index.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math_rotation.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math_vector.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_random.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_timestep.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_while.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-11-30 12:30:18 UTC (rev 33389)
@@ -134,8 +134,6 @@
 	void (*freesocketstoragefunc)(struct bNodeSocket *sock);
 
 	/* simulation nodes */
-	void (*prepare_outputs)(struct SimExecData *execdata, struct SimNodeStack *node, struct SimDataContext *self);
-	
 	char *(*generate_source)(struct SimNodeStack *node);
 	void (*enqueue)(struct SimExecData *execdata, struct SimNodeStack *node, struct SimDataContext *self);
 	void (*enqueue_op)(struct SimExecData *execdata, struct SimNodeStack *node, struct SimDataContext *self, int execlevel, int *pushop);

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_intern.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_intern.c	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_intern.c	2010-11-30 12:30:18 UTC (rev 33389)
@@ -45,11 +45,28 @@
 
 #include "RNA_access.h"
 
-void sim_init_socket_buffer(SimExecData *execdata, SimSocketStack *sock)
+int sim_socket_buffer_valid(struct SimExecData *UNUSED(execdata), struct SimSocketStack *sock)
 {
 #ifdef WITH_OPENCL
 	if (BKE_opencl_is_active()) {
 		cl_int res;
+		cl_mem_object_type memtype;
+		
+		res = clGetMemObjectInfo(sock->data_cl, CL_MEM_TYPE, sizeof(cl_mem_object_type), &memtype, NULL);
+		return (res == CL_SUCCESS);
+	}
+	else
+#endif
+	{
+		return (sock->data != NULL);
+	}
+}
+
+void sim_socket_buffer_init(SimExecData *execdata, SimSocketStack *sock)
+{
+#ifdef WITH_OPENCL
+	if (BKE_opencl_is_active()) {
+		cl_int res;
 		size_t datasize = sim_sockettype_size(sock->type);
 		if (datasize > 0 && sock->context.size > 0) {
 			sock->data_cl = clCreateBuffer(execdata->opencl_context, CL_MEM_READ_WRITE, sock->context.size * datasize, NULL, &res);
@@ -72,7 +89,7 @@
 	}
 }
 
-void sim_free_socket_buffer(SimExecData *execdata, SimSocketStack *sock)
+void sim_socket_buffer_free(SimExecData *execdata, SimSocketStack *sock)
 {
 	if (execdata->error)
 		return;

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_intern.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_intern.h	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_intern.h	2010-11-30 12:30:18 UTC (rev 33389)
@@ -95,8 +95,9 @@
 	int num;
 } SimWorkerThread;
 
-void sim_init_socket_buffer(struct SimExecData *execdata, struct SimSocketStack *sock);
-void sim_free_socket_buffer(struct SimExecData *execdata, struct SimSocketStack *sock);
+int sim_socket_buffer_valid(struct SimExecData *execdata, struct SimSocketStack *sock);
+void sim_socket_buffer_init(struct SimExecData *execdata, struct SimSocketStack *sock);
+void sim_socket_buffer_free(struct SimExecData *execdata, struct SimSocketStack *sock);
 
 void sim_event_init(struct SimEvent *event);
 void sim_event_retain(struct SimEvent *event);

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_constant.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_constant.c	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_constant.c	2010-11-30 12:30:18 UTC (rev 33389)
@@ -70,14 +70,6 @@
 	{ -1, 0, "" }
 };
 
-static void prepare_outputs(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
-{
-	SimDataContext ctx;
-	
-	sim_context_create(self->scene, NULL, NULL, 0, &ctx);
-	node->outstack[0].context = ctx;
-}
-
 static void init(bNode *node)
 {
 	SimNodeConstant *data= MEM_callocN(sizeof(SimNodeConstant), "SimNodeConstant storage");
@@ -116,8 +108,8 @@
 {
 	SimNodeConstant *data= (SimNodeConstant*)node->base->storage;
 	SimSocketIterator sockiter;
-	
-	sim_output_begin(execdata, &node->outstack[0], &sockiter);
+
+	sim_output_begin(execdata, &sockiter, &node->outstack[0], NULL);
 	switch (node->base->type) {
 	case SIM_NODE_CONSTFLOAT:
 		sim_output_write_float(execdata, &sockiter, data->value_float);
@@ -161,7 +153,6 @@
 	type->freestoragefunc = node_free_standard_storage;
 	type->copystoragefunc = node_copy_standard_storage;
 
-	type->prepare_outputs = prepare_outputs;
 	type->enqueue = enqueue;
 }
 

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_curve.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_curve.c	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_curve.c	2010-11-30 12:30:18 UTC (rev 33389)
@@ -56,7 +56,8 @@
 	
 	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 	sim_kernel_init(execdata, kernel, node, kernel_curve, NULL, 0);
-	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size);
+	sim_kernel_set_all_outputs(execdata, kernel, NULL);
+	sim_kernel_enqueue(execdata, kernel);
 }
 
 static void init(bNode *node)

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c	2010-11-30 12:30:18 UTC (rev 33389)
@@ -53,7 +53,7 @@
 	if (execlevel == 0) {
 		node->opstorage = storage = MEM_callocN(sizeof(OpStorage), "NodeOperatorStorage");
 		
-		sim_input_begin(execdata, node->instack[0], &sockiter);
+		sim_input_begin(execdata, &sockiter, node->instack[0]);
 		sim_input_read_int(execdata, &sockiter, &storage->iterations);
 		sim_input_end(execdata, &sockiter);
 		if (execdata->error) return;

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c	2010-11-30 05:15:58 UTC (rev 33388)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c	2010-11-30 12:30:18 UTC (rev 33389)
@@ -204,8 +204,6 @@
 			break;
 		RNA_property_collection_next(&iter);
 	}
-	RNA_property_collection_next(&iter);
-	
 	RNA_property_collection_end(&iter);
 }
 
@@ -250,25 +248,12 @@
 	MEM_freeN(sock->storage);
 }
 
-static void prepare_outputs(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
+static void write_property_collection(SimExecData *execdata, SimSocketStack *out, SimDataContext *ctx)
 {
-	SimDataNode *data= (SimDataNode*)node->base->storage;
-	SimDataContext ctx;
-	int i;
-	
-	/* resolve the context */
-	/* Note: the path is resolved again here in case the self context was not fully defined at build time. */
-	sim_context_path_resolve(self, data->path, &ctx);
-	for (i=0; i < node->totout; ++i)
-		node->outstack[i].context = ctx;
-}
-
-static void write_property_collection(SimExecData *execdata, SimSocketStack *out)
-{
 	SimDataNodeSocket *data= (SimDataNodeSocket*)out->base->storage;
 	SimSocketIterator sockiter;
 	
-	sim_output_begin(execdata, out, &sockiter);
+	sim_output_begin(execdata, &sockiter, out, ctx);
 	if (data->type == SIM_DATA_RNA) {
 		PropertyRNA *prop=find_rna_property(out->node->base, out->base->name);
 		if (prop) {
@@ -321,12 +306,12 @@
 	sim_output_end(execdata, &sockiter);
 }
 
-static void write_property_singleton(SimExecData *execdata, SimSocketStack *out)
+static void write_property_singleton(SimExecData *execdata, SimSocketStack *out, SimDataContext *ctx)
 {
 	SimDataNodeSocket *data= (SimDataNodeSocket*)out->base->storage;
 	SimSocketIterator sockiter;
 	
-	sim_output_begin(execdata, out, &sockiter);
+	sim_output_begin(execdata, &sockiter, out, ctx);
 	if (data->type == SIM_DATA_RNA) {
 		PropertyRNA *prop= find_rna_property(out->node->base, out->base->name);
 		if (prop) {
@@ -359,61 +344,25 @@
 	sim_output_end(execdata, &sockiter);
 }
 
-static void write_property_default(SimExecData *execdata, SimSocketStack *out)
-{
-	SimSocketIterator sockiter;
-	float vec[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-	float quat[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-	float matrix[4][4];
-	char str[1]= "";
-	unit_m4(matrix);
-	
-	sim_output_begin(execdata, out, &sockiter);
-	switch (out->type) {
-	case SOCK_FLOAT:
-		sim_output_write_float(execdata, &sockiter, 0.0f);
-		break;
-	case SOCK_INT:
-		sim_output_write_int(execdata, &sockiter, 0);
-		break;
-	case SOCK_BOOL:
-		sim_output_write_bool(execdata, &sockiter, 0);
-		break;
-	case SOCK_VECTOR:
-		sim_output_write_vector(execdata, &sockiter, vec);
-		break;
-	case SOCK_RGBA:
-		sim_output_write_rgba(execdata, &sockiter, vec);
-		break;
-	case SOCK_QUAT:
-		sim_output_write_quat(execdata, &sockiter, quat);
-		break;
-	case SOCK_MATRIX:
-		sim_output_write_matrix(execdata, &sockiter, matrix);
-		break;
-	case SOCK_STRING:
-		sim_output_write_string(execdata, &sockiter, str);
-		break;
-	}
-	sim_output_end(execdata, &sockiter);
-}
-
 static void enqueue(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
 {
 	SimDataNode *data= (SimDataNode*)node->base->storage;
-	if (node->totout) {
-		SimSocketStack *out;
-		int i;
+	SimDataContext ctx;
+	SimSocketStack *out;
+	int i;
+	
+	/* resolve the context */
+	sim_context_path_resolve(self, data->path, &ctx);
+	
+	if (sim_context_is_defined(&ctx)) {
 		StructRNA *type = sim_context_type(&node->outstack[0].context);	/* all output contexts are the same */
 		if (!type || !data->type || RNA_struct_is_a(type, data->type)) {
 			/* output data on property sockets */
 			for (i=0, out=node->outstack; i < node->totout; ++i, ++out) {
-				if (!sim_context_is_defined(&out->context))
-					write_property_default(execdata, out);
-				else if (sim_context_is_collection(&out->context))
-					write_property_collection(execdata, out);
+				if (sim_context_is_collection(&ctx))
+					write_property_collection(execdata, out, &ctx);
 				else
-					write_property_singleton(execdata, out);
+					write_property_singleton(execdata, out, &ctx);
 			}
 		}
 	}
@@ -448,7 +397,6 @@
 	type.freesocketstoragefunc = freesocketstorage;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list