[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32388] branches/particles-2010/source/ blender/nodes/intern/simulation: bugfixes:

Lukas Toenne lukas.toenne at googlemail.com
Sat Oct 9 16:43:00 CEST 2010


Revision: 32388
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32388
Author:   lukastoenne
Date:     2010-10-09 16:42:59 +0200 (Sat, 09 Oct 2010)

Log Message:
-----------
bugfixes:
* sim_get_data_size uses opencl type sizes even when opencl is disabled
* sim_eventlist_merge didn't copy the appended list, fixed and renamed to sim_eventlist_append_list
* added explicit comparison for event status instead of relying on ordering (esp. for ocl events)

Modified Paths:
--------------
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
    branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h	2010-10-09 13:46:34 UTC (rev 32387)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h	2010-10-09 14:42:59 UTC (rev 32388)
@@ -110,4 +110,20 @@
 void sim_finish_job(struct SimExecData *execdata, struct SimJob *job);
 void sim_free_job(struct SimExecData *execdata, struct SimJob *job);
 
+BM_INLINE void print_event_list(struct ListBase *lb)
+{
+	SimEventLink *link;
+	int i;
+	for (i=0, link=lb->first; link; ++i, link=link->next) {
+		printf("\t%d. ", i);
+		switch (link->event.impl->status) {
+		case SIM_QUEUED:	printf("queued");		break;
+		case SIM_SUBMITTED:	printf("submitted");	break;
+		case SIM_RUNNING:	printf("running");		break;
+		case SIM_COMPLETE:	printf("complete");		break;
+		}
+		printf("\n");
+	}
+}
+
 #endif

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-09 13:46:34 UTC (rev 32387)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-09 14:42:59 UTC (rev 32388)
@@ -79,52 +79,56 @@
 
 size_t sim_get_data_size(int datatype)
 {
-	#ifdef WITH_OPENCL
-	switch (datatype) {
-	case SOCK_FLOAT:
-		return sizeof(cl_float);
-	case SOCK_INT:
-		return sizeof(cl_int);
-	case SOCK_BOOL:
-		return sizeof(cl_char);
-	case SOCK_VECTOR:
-		/* XXX looks like at least NVIDIA does not implement float3 vector type.
-		 * using float4 is probably better anyway because of 16 byte alignment.
-		 */
-		return sizeof(cl_float4);
-	case SOCK_RGBA:
-		return sizeof(cl_float4);
-	case SOCK_STRING:
-		return SIM_STRINGLENGTH * sizeof(cl_char);
-	case SOCK_OP:
-		return 0;
-	case SOCK_ANY:
-		return 0;
-	default:
-		printf("ERROR: socket datatype %d size not defined!\n", datatype);
-		return 0;
+#ifdef WITH_OPENCL
+	if (BKE_opencl_is_active()) {
+		switch (datatype) {
+		case SOCK_FLOAT:
+			return sizeof(cl_float);
+		case SOCK_INT:
+			return sizeof(cl_int);
+		case SOCK_BOOL:
+			return sizeof(cl_char);
+		case SOCK_VECTOR:
+			/* XXX looks like at least NVIDIA does not implement float3 vector type.
+			 * using float4 is probably better anyway because of 16 byte alignment.
+			 */
+			return sizeof(cl_float4);
+		case SOCK_RGBA:
+			return sizeof(cl_float4);
+		case SOCK_STRING:
+			return SIM_STRINGLENGTH * sizeof(cl_char);
+		case SOCK_OP:
+			return 0;
+		case SOCK_ANY:
+			return 0;
+		default:
+			printf("ERROR: socket datatype %d size not defined!\n", datatype);
+			return 0;
+		}
 	}
-	#else
-	switch (datatype) {
-	case SOCK_FLOAT:
-		return SIM_ITEMSIZE_FLOAT;
-	case SOCK_INT:
-		return SIM_ITEMSIZE_INT;
-	case SOCK_BOOL:
-		return SIM_ITEMSIZE_BOOL;
-	case SOCK_VECTOR:
-		return SIM_ITEMSIZE_VECTOR;
-	case SOCK_RGBA:
-		return SIM_ITEMSIZE_RGBA;
-	case SOCK_STRING:
-		return SIM_ITEMSIZE_STRING;
-	case SOCK_OP:
-		return 0;
-	default:
-		printf("ERROR: socket datatype %d size not defined!\n", datatype);
-		return 0;
+	else
+#endif
+	{
+		switch (datatype) {
+		case SOCK_FLOAT:
+			return SIM_ITEMSIZE_FLOAT;
+		case SOCK_INT:
+			return SIM_ITEMSIZE_INT;
+		case SOCK_BOOL:
+			return SIM_ITEMSIZE_BOOL;
+		case SOCK_VECTOR:
+			return SIM_ITEMSIZE_VECTOR;
+		case SOCK_RGBA:
+			return SIM_ITEMSIZE_RGBA;
+		case SOCK_STRING:
+			return SIM_ITEMSIZE_STRING;
+		case SOCK_OP:
+			return 0;
+		default:
+			printf("ERROR: socket datatype %d size not defined!\n", datatype);
+			return 0;
+		}
 	}
-	#endif
 }
 
 const char *sim_get_typename(int datatype)
@@ -312,6 +316,15 @@
 	BLI_addtail(lb, link);
 }
 
+void sim_eventlist_append_list(ListBase *lb, ListBase *append)
+{
+	SimEventLink *link;
+	
+	/* note: there is also the addlisttolist function, but we want to copy the 'append' list instead of just attaching it to lb! */
+	for (link=append->first; link; link=link->next)
+		sim_eventlist_append(lb, &link->event);
+}
+
 void sim_eventlist_remove(ListBase *lb, SimEvent *event)
 {
 	SimEventLink *link;
@@ -322,9 +335,16 @@
 	}
 }
 
-void sim_eventlist_merge(ListBase *lb, ListBase *merge)
+BM_INLINE int event_status_less(SimEventStatus a, SimEventStatus b)
 {
-	addlisttolist(lb, merge);
+	if (b==SIM_QUEUED)
+		return 0;
+	else if (b==SIM_SUBMITTED)
+		return (a==SIM_QUEUED);
+	else if (b==SIM_RUNNING)
+		return (a==SIM_QUEUED || a==SIM_SUBMITTED);
+	else
+		return (a==SIM_QUEUED || a==SIM_SUBMITTED || a==SIM_RUNNING);
 }
 
 SimEventStatus sim_eventlist_status(ListBase *lb)
@@ -332,7 +352,7 @@
 	SimEventStatus status = SIM_COMPLETE;
 	SimEventLink *link;
 	for (link=lb->first; link; link=link->next) {
-		if (sim_event_status(&link->event) < status)
+		if (event_status_less(sim_event_status(&link->event), status))
 			status = sim_event_status(&link->event);
 	}
 	return status;
@@ -496,7 +516,7 @@
 void sim_input_begin(SimExecData *execdata, SimSocketStack *sock, SimSocketIterator *iter)
 {
 	/* make sure the input socket is valid */
-	sim_wait_for_events(execdata, &sock->node->inputevents);
+	sim_wait_for_events(execdata, &sock->node->events);
 	
 	iter->valid = 1;
 	if (execdata->error) {

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h	2010-10-09 13:46:34 UTC (rev 32387)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h	2010-10-09 14:42:59 UTC (rev 32388)
@@ -228,8 +228,8 @@
 int sim_node_get_max_context(struct SimSocketStack **instack, int totin, struct SimDataContext *r_max);
 
 void sim_eventlist_append(struct ListBase *lb, struct SimEvent *event);
+void sim_eventlist_append_list(struct ListBase *lb, struct ListBase *append);
 void sim_eventlist_remove(struct ListBase *lb, struct SimEvent *event);
-void sim_eventlist_merge(struct ListBase *lb, struct ListBase *merge);
 SimEventStatus sim_eventlist_status(struct ListBase *lb);
 
 void sim_wait_for_events(struct SimExecData *execdata, struct ListBase *wait_events);

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c	2010-10-09 13:46:34 UTC (rev 32387)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c	2010-10-09 14:42:59 UTC (rev 32388)
@@ -947,7 +947,7 @@
 	node->inputevents.first = node->inputevents.last = NULL;
 	for (in=node->instack, i=0; i < node->totin; ++in, ++i) {
 		if ((*in)->node != node) { /* skip default data sockets */
-			sim_eventlist_merge(&node->inputevents, &(*in)->node->events);
+			sim_eventlist_append_list(&node->inputevents, &(*in)->node->events);
 		}
 	}
 }
@@ -1008,6 +1008,26 @@
 //			for (out=ns->outstack, i=0; i < ns->totout; ++out, ++i) {
 //				assert( (out->branches > 0 && sim_buffer_valid(&out->buffer)) || (out->branches == 0 && !sim_buffer_valid(&out->buffer)) );
 //			}
+			
+			printf(">>> Node %s >>>\n", ns->base->name);
+			printf("input-events:\n");
+			print_event_list(&ns->inputevents);
+			printf("events:\n");
+			print_event_list(&ns->events);
+			printf("<<<<<<<<<<<<<<<\n");
+			#if 0
+			{
+				SimEventStatus debug_event_status[256];
+				SimEventLink *debug_link;
+				int debug_i;
+				for (debug_link=ns->events.first, debug_i=0; debug_link; debug_link=debug_link->next, ++debug_i) {
+					debug_event_status[debug_i] = sim_event_status(&debug_link->event);
+				}
+				for (; debug_i < 256; ++debug_i)
+					debug_event_status[debug_i] = -1;
+				debug_i=0;	/* nonsense for breakpoint */
+			}
+			#endif
 		}
 	}
 }
@@ -1071,6 +1091,8 @@
 		
 		/* repeatedly execute branches until no more operator is active */
 		while (op) {
+			printf("Executing operator subtree %s\n", op->node->base->name);
+			
 			/* clear tags */
 			for (ns=execdata->nodestack, n=0; n < execdata->totnode; ++ns, ++n) {
 				ns->totusers = 0;
@@ -1090,11 +1112,7 @@
 			}
 			
 			/* enqueue the operator itself */
-			printf("Executing operator %s\n", op->node->base->name);
-			
-			/* update the input event wait list for this node.
-			 * events must have been prepared by the input nodes!
-			 */
+
 			create_node_inputevents(op->node);
 			
 			nextop = -1;
@@ -1109,6 +1127,27 @@
 			/* increase the operator execution level */
 			++op->resume_level;
 			
+			printf(">>> Operator %s >>>\n", op->node->base->name);
+			printf("input-events:\n");
+			print_event_list(&op->node->inputevents);
+			printf("events:\n");
+			print_event_list(&op->node->events);
+			printf("<<<<<<<<<<<<<<<<<<<\n");
+			
+			#if 0
+			{
+				SimEventStatus debug_event_status[256];
+				SimEventLink *debug_link;
+				int debug_i;
+				for (debug_link=op->node->events.first, debug_i=0; debug_link; debug_link=debug_link->next, ++debug_i) {
+					debug_event_status[debug_i] = sim_event_status(&debug_link->event);
+				}
+				for (; debug_i < 256; ++debug_i)
+					debug_event_status[debug_i] = -1;
+				debug_i=0;	/* nonsense for breakpoint */
+			}
+			#endif
+
 			/* wait for all enqueued nodes to finish */
 			#ifdef WITH_OPENCL
 			if (BKE_opencl_is_active()) {





More information about the Bf-blender-cvs mailing list