[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31875] branches/particles-2010/source/ blender: - Better error handling: SimExecData now contains an error flag and a message string, which can be set by node functions to notify the main evaluation system.

Lukas Toenne lukas.toenne at googlemail.com
Sat Sep 11 11:55:01 CEST 2010


Revision: 31875
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31875
Author:   lukastoenne
Date:     2010-09-11 11:55:01 +0200 (Sat, 11 Sep 2010)

Log Message:
-----------
- Better error handling: SimExecData now contains an error flag and a message string, which can be set by node functions to notify the main evaluation system. This will then cancel execution and print the message.
- Unified SimBuffer to always refer to sizes and offsets in terms of number of data elements instead of bytes (stride is stored internally)
- More fixes for GetData/SetData nodes.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenloader/intern/writefile.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h
    branches/particles-2010/source/blender/nodes/intern/node_tree_simulation.c

Modified: branches/particles-2010/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-09-11 06:27:38 UTC (rev 31874)
+++ branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-09-11 09:55:01 UTC (rev 31875)
@@ -450,13 +450,33 @@
 {
 	writestruct(wd, DATA, "NodeRNAData", 1, rna_data);
 	if (rna_data->type) {
-		/* temporarily create identifier string, to allow restoring the StructRNA pointer */
+		/* save identifier string, to allow restoring the StructRNA pointer */
 		rna_data->save_type= RNA_struct_identifier(rna_data->type);
-		/* save the identifier string itself */
 		writedata(wd, DATA, strlen(rna_data->save_type)+1, (void*)rna_data->save_type);
 	}
 }
 
+static void write_node_socket_properties(WriteData *wd, bNode *node)
+{
+	NodeRNAData *rna_data= (NodeRNAData*)node->storage;
+	bNodeSocket *sock;
+	
+	if (node->type==SIM_NODE_GETDATA)
+		sock= ((bNodeSocket*)node->outputs.first)->next;
+	else if (node->type==SIM_NODE_GETDATA)
+		sock= ((bNodeSocket*)node->inputs.first)->next;
+	else
+		sock= NULL;
+	
+	for (; sock; sock = sock->next) {
+		NodeSocketProperty *sockprop= (NodeSocketProperty*)sock->storage;
+		
+		/* save identifier string, to allow restoring the PropertyRNA pointer */
+		sockprop->save_prop = RNA_property_identifier(sockprop->prop);
+		writedata(wd, DATA, strlen(sockprop->save_prop)+1, (void*)sockprop->save_prop);
+	}
+}
+
 /* this is only direct data, tree itself should have been written */
 static void write_nodetree(WriteData *wd, bNodeTree *ntree)
 {
@@ -497,6 +517,9 @@
 			if (node->storage)
 				writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
 		}
+		
+		if (node->type==SIM_NODE_GETDATA || node->type==SIM_NODE_SETDATA)
+			write_node_socket_properties(wd, node);
 	}
 	
 	for(link= ntree->links.first; link; link= link->next)

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-09-11 06:27:38 UTC (rev 31874)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c	2010-09-11 09:55:01 UTC (rev 31875)
@@ -172,126 +172,117 @@
 //static const char *cl_source= OPENCL_STRINGIFY(
 //);
 
-static void enqueue_output(SimExecData *execdata, SimSocketStack *out, SimDataContext *ctx)
+static void enqueue_output(SimExecData *execdata, SimSocketStack *out, SimDataContext *ctx, PropertyRNA *prop)
 {
 	size_t datasize = sim_get_data_size(out->type);
 	
-	if (!sim_node_prepare_output(execdata, out, ctx, 1))
+	if (!sim_node_prepare_output(execdata, out, ctx, 0) || execdata->error)
 		return;
 	
 	if (sim_context_is_collection(ctx)) {
 		CollectionPropertyIterator iter;
-//		SimBuffer pinned;
+		SimBuffer hostbuffer;
 		void *buf, *cur;
+		SimEvent copy_event;
 		
-		#if 0
-		/* TODO this intermediate buffer prevents us from enqueueing a big pile of single copy kernels.
-		 * It would be better to make use of raw arrays to copy data, but this does not work for paged data (particles!)
-		 * More flexible support for paged data collections (and other partially arrayed data) would be helpful.
-		 * See also SetData node
+		/* This intermediate host buffer is necessary because the collection properties in general
+		 * have a larger stride than the resulting property buffer. We need to collect all elements
+		 * in a contiguous buffer to write to the device memory.
 		 */
-		
-		/* create intermediate pinned-memory buffer (see NVIDIA OpenCL best practices guide, section 3.1.1) */
-		pinned = sim_create_pinned_buffer(execdata, SBM_READ_ONLY, out->type, ctx->size);
+
+		/* create intermediate host-memory buffer (see NVIDIA OpenCL best practices guide, section 3.1.1) */
+		hostbuffer = sim_create_host_buffer(execdata, SBM_READ_ONLY, out->type, ctx->size);
+		if (execdata->error) return;
 		/* map to host memory pointer */
-		buf = sim_enqueue_map_buffer(execdata, &pinned, 1, SBM_MAP_READ, 0, ctx->size * datasize, 0, NULL, NULL);
-		#endif
+		buf = sim_enqueue_map_buffer(execdata, &hostbuffer, 1, SMM_MAP_WRITE, 0, ctx->size, 0, NULL, NULL);
+		if (execdata->error) return;
 		
-		/* map to host memory pointer */
-//		buf = sim_enqueue_map_buffer(execdata, &out->buffer, 1, SBM_MAP_WRITE, 0, ctx->size * datasize, 0, NULL, NULL);
-		
-		buf = MEM_callocN(out->context.size * datasize, "GetData output buffer");
-		
-		#if 0
 		/* iterate over collection and copy data */
 		RNA_property_collection_begin(&ctx->ptr, ctx->prop, &iter);
 		cur = buf;
 		switch (out->type) {
 		case SOCK_FLOAT:
 			while (iter.valid) {
-				*(float*)cur = RNA_property_float_get(&iter.ptr, (PropertyRNA*)out->base->storage);
+				*(float*)cur = RNA_property_float_get(&iter.ptr, prop);
 				cur = (char*)cur + datasize;
 				RNA_property_collection_next(&iter);
 			}
 			break;
 		case SOCK_INT:
 			while (iter.valid) {
-				*(int*)cur = RNA_property_int_get(&iter.ptr, (PropertyRNA*)out->base->storage);
+				*(int*)cur = RNA_property_int_get(&iter.ptr, prop);
 				cur = (char*)cur + datasize;
 				RNA_property_collection_next(&iter);
 			}
 			break;
 		case SOCK_BOOL:
 			while (iter.valid) {
-				*(char*)cur = (char)RNA_property_boolean_get(&iter.ptr, (PropertyRNA*)out->base->storage);
+				*(char*)cur = (char)RNA_property_boolean_get(&iter.ptr, prop);
 				cur = (char*)cur + datasize;
 				RNA_property_collection_next(&iter);
 			}
 			break;
 		case SOCK_VECTOR:
 			while (iter.valid) {
-				RNA_property_float_get_array(&iter.ptr, (PropertyRNA*)out->base->storage, (float*)cur);
+				RNA_property_float_get_array(&iter.ptr, prop, (float*)cur);
 				cur = (char*)cur + datasize;
 				RNA_property_collection_next(&iter);
 			}
 			break;
 		case SOCK_RGBA:
 			while (iter.valid) {
-				RNA_property_float_get_array(&iter.ptr, (PropertyRNA*)out->base->storage, (float*)cur);
+				RNA_property_float_get_array(&iter.ptr, prop, (float*)cur);
 				cur = (char*)cur + datasize;
 				RNA_property_collection_next(&iter);
 			}
 			break;
 		case SOCK_STRING:
 			while (iter.valid) {
-				RNA_property_string_get(&iter.ptr, (PropertyRNA*)out->base->storage, (char*)cur);
+				RNA_property_string_get(&iter.ptr, prop, (char*)cur);
 				cur = (char*)cur + datasize;
 				RNA_property_collection_next(&iter);
 			}
 			break;
 		}
 		RNA_property_collection_end(&iter);
-		#endif
 		
-		sim_enqueue_write_buffer(execdata, &out->buffer, 1, 0, out->context.size * datasize, buf, 0, NULL, &out->event);
-		MEM_freeN(buf);
-		
-//		sim_enqueue_unmap_buffer(execdata, &out->buffer, buf, 0, NULL, &out->event);
-		
-		#if 0
-		sim_enqueue_unmap_buffer(execdata, &pinned, buf, 0, NULL, NULL);
-		sim_enqueue_write_buffer(execdata, &out->buffer, 1, 0, ctx->size * datasize, buf, 0, NULL, &out->event);
-		sim_release_buffer(&pinned);
-		#endif
+		sim_enqueue_unmap_buffer(execdata, &hostbuffer, buf, 0, NULL, &copy_event);
+		if (execdata->error) return;
+		sim_enqueue_copy_buffer(execdata, &hostbuffer, &out->buffer, 0, 0, ctx->size, 1, &copy_event, &out->event);
+		if (execdata->error) return;
+		sim_release_buffer(execdata, &hostbuffer);
+		if (execdata->error) return;
 	}
 	else {
 		char buf[SIM_MAXDATASIZE];
 		
 		/* create output data buffer */
 		out->buffer = sim_create_buffer(execdata, SBM_READ_ONLY, out->type, 1);
+		if (execdata->error) return;
 		
 		switch (out->type) {
 		case SOCK_FLOAT:
-			*(float*)buf = RNA_property_float_get(&ctx->ptr, (PropertyRNA*)out->base->storage);
+			*(float*)buf = RNA_property_float_get(&ctx->ptr, prop);
 			break;
 		case SOCK_INT:
-			*(int*)buf = RNA_property_int_get(&ctx->ptr, (PropertyRNA*)out->base->storage);
+			*(int*)buf = RNA_property_int_get(&ctx->ptr, prop);
 			break;
 		case SOCK_BOOL:
-			*(char*)buf = (char)RNA_property_boolean_get(&ctx->ptr, (PropertyRNA*)out->base->storage);
+			*(char*)buf = (char)RNA_property_boolean_get(&ctx->ptr, prop);
 			break;
 		case SOCK_VECTOR:
-			RNA_property_float_get_array(&ctx->ptr, (PropertyRNA*)out->base->storage, (float*)buf);
+			RNA_property_float_get_array(&ctx->ptr, prop, (float*)buf);
 			break;
 		case SOCK_RGBA:
-			RNA_property_float_get_array(&ctx->ptr, (PropertyRNA*)out->base->storage, (float*)buf);
+			RNA_property_float_get_array(&ctx->ptr, prop, (float*)buf);
 			break;
 		case SOCK_STRING:
-			RNA_property_string_get(&ctx->ptr, (PropertyRNA*)out->base->storage, (char*)buf);
+			RNA_property_string_get(&ctx->ptr, prop, (char*)buf);
 			break;
 		}
 		
 		sim_enqueue_write_buffer(execdata, &out->buffer, 0, 0, datasize, buf, 0, NULL, &out->event);
+		if (execdata->error) return;
 	}
 }
 
@@ -302,27 +293,34 @@
 	int resolved;
 	
 	if (sim_node_prepare_output(execdata, &node->outstack[0], &node->instack[0]->context, 0)) {
+		if (execdata->error) return;
 		/* copy the path socket to the output */
-		sim_enqueue_copy_buffer(execdata, &node->instack[0]->buffer, &node->outstack[0].buffer, 0, 0, node->outstack[0].buffer.stride, node->totin, node->event_wait_list, &node->outstack[0].event);
+		sim_enqueue_copy_buffer(execdata, &node->instack[0]->buffer, &node->outstack[0].buffer, 0, 0, 1, node->totin, node->event_wait_list, &node->outstack[0].event);
+		if (execdata->error) return;
 	}
 	
 	/* read the path input to determine the data context (blocking read, we immediately need the path!) */
-	sim_enqueue_read_buffer(execdata, &node->instack[0]->buffer, 1, 0, SIM_STRINGLENGTH, path, 0, NULL, NULL);
+	sim_enqueue_read_buffer(execdata, &node->instack[0]->buffer, 1, 0, 1, path, 0, NULL, NULL);
+	if (execdata->error) return;
 	
 	/* resolve the context */
 	resolved = sim_context_path_resolve(self, path, &ctx);
 	
 	if (resolved) {
 		int i;
+		bNodeSocket *sock; /* for getting the rna property of the input sockets */
 		
 		if (!RNA_struct_is_a(sim_context_type(&ctx), ((NodeRNAData*)node->base->storage)->type)) {
-			printf("Error in %s: Invalid context path \"%s\"\n", node->base->name, path);
+			execdata->error = 1;
+			sprintf(execdata->error_string, "Invalid context path \"%s\"", path);
 			return;
 		}
 		
 		/* output data on property sockets */
+		sock = ((bNodeSocket*)node->base->outputs.first)->next;
 		for (i=1; i < node->totout; ++i) {
-			enqueue_output(execdata, node->outstack + i, &ctx);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list