[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33359] branches/particles-2010/source/ blender/nodes/intern: Replaced event list arguments in enqueue functions for kernels with a simple node stack pointer .

Lukas Toenne lukas.toenne at googlemail.com
Sun Nov 28 10:33:06 CET 2010


Revision: 33359
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33359
Author:   lukastoenne
Date:     2010-11-28 10:33:06 +0100 (Sun, 28 Nov 2010)

Log Message:
-----------
Replaced event list arguments in enqueue functions for kernels with a simple node stack pointer. The node's event lists are used internally. All low-level event functions have been moved to SIM_internal.h/.c, so node coders don't have to deal with it.

Modified Paths:
--------------
    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_curve.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.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_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_intern.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_intern.c	2010-11-28 06:03:30 UTC (rev 33358)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_intern.c	2010-11-28 09:33:06 UTC (rev 33359)
@@ -134,7 +134,135 @@
 	}
 }
 
+
+void sim_eventlist_append(ListBase *lb, SimEvent *event)
+{
+	SimEventLink *link = MEM_callocN(sizeof(SimEventLink), "SimEventLink");
+	link->event = event;
+	sim_event_retain(event);
+	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, *nextlink;
+	for (link=lb->first; link; link=nextlink) {
+		nextlink = link->next;
+		if (link->event == event) {
+			BLI_remlink(lb, link);
+			sim_event_release(link->event);
+			MEM_freeN(link);
+		}
+	}
+}
+
+void sim_eventlist_free(ListBase *lb)
+{
+	SimEventLink *link, *nextlink;
+	for (link=lb->first; link; link=nextlink) {
+		nextlink = link->next;
+		sim_event_release(link->event);
+		MEM_freeN(link);
+	}
+	lb->first = lb->last = NULL;
+}
+
+BM_INLINE int event_status_less(SimEventStatus a, SimEventStatus b)
+{
+	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)
+{
+	SimEventStatus status = SIM_COMPLETE;
+	SimEventLink *link;
+	for (link=lb->first; link; link=link->next) {
+		if (event_status_less(sim_event_status(link->event), status))
+			status = sim_event_status(link->event);
+	}
+	return status;
+}
+
+void sim_wait_for_events(SimExecData *execdata, struct ListBase *wait_events)
+{
 #ifdef WITH_OPENCL
+	if (BKE_opencl_is_active()) {
+		cl_int res;
+		int num_wait_events;
+		cl_event *wait_events_cl;
+		
+		sim_create_cl_event_list(wait_events, &num_wait_events, &wait_events_cl);
+		res = clWaitForEvents(num_wait_events, wait_events_cl);
+		MEM_freeN(wait_events_cl);
+		if (res != CL_SUCCESS) {
+			execdata->error = 1;
+			sprintf(execdata->error_string, "Error waiting for OpenCL events: %s", BKE_opencl_message(res));
+		}
+	}
+	else
+#endif
+	{
+		while (1) {
+			if (sim_eventlist_status(wait_events)==SIM_COMPLETE)
+				break;
+			else {
+				pthread_cond_broadcast(&execdata->workercond);
+				pthread_cond_wait(&execdata->hostcond, &execdata->hostmutex);
+			}
+		}
+	}
+}
+
+#if 0 /* OpenCL 1.1 specs */
+SimEvent sim_create_user_event(struct SimExecData *execdata)
+{
+	cl_int res;
+	SimEvent event;
+	
+	if (execdata->error)
+		return;
+	
+	event = clCreateUserEvent(execdata->context, &res);
+	if (res != CL_SUCCESS) {
+		execdata->error = 1;
+		sprintf(execdata->error_string, "Error creating OpenCL user event: %s", BKE_opencl_message(res));
+	}
+	return event;
+}
+
+void sim_set_user_event_status(SimEvent event, SimEventStatus status)
+{
+	cl_int res;
+	
+	if (execdata->error)
+		return;
+	
+	res = clSetUserEventStatus(event, status);
+	if (res != CL_SUCCESS) {
+		execdata->error = 1;
+		sprintf(execdata->error_string, "Error setting OpenCL user event status: %s", BKE_opencl_message(res));
+	}
+}
+#endif
+
+
+#ifdef WITH_OPENCL
 void sim_create_cl_event_list(ListBase *events, int *num_events, cl_event **events_cl)
 {
 	int i;
@@ -162,7 +290,10 @@
 	job->totitems = totitems;
 	job->workgroupsize = (workgroupsize > 0 ? workgroupsize : execdata->default_workgroupsize);
 	job->startitem = 0;
-	BLI_duplicatelist(&job->wait_events, wait_events);
+	if (wait_events)
+		BLI_duplicatelist(&job->wait_events, wait_events);
+	else
+		job->wait_events.first = job->wait_events.last = NULL;
 	
 	job->event = MEM_callocN(sizeof(SimEvent), "SimEvent");
 	sim_event_init(job->event);

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_intern.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_intern.h	2010-11-28 06:03:30 UTC (rev 33358)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_intern.h	2010-11-28 09:33:06 UTC (rev 33359)
@@ -103,6 +103,16 @@
 void sim_event_release(struct SimEvent *event);
 SimEventStatus sim_event_status(struct SimEvent *event);
 
+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_free(struct ListBase *lb);
+SimEventStatus sim_eventlist_status(struct ListBase *lb);
+
+void sim_wait_for_events(struct SimExecData *execdata, struct ListBase *wait_events);
+//SimEvent sim_create_user_event(struct SimExecData *execdata);
+//void sim_set_user_event_status(SimEvent event, SimEventStatus status);
+
 #ifdef WITH_OPENCL
 void sim_create_cl_event_list(struct ListBase *events, int *num_events, cl_event **events_cl);
 #endif

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-28 06:03:30 UTC (rev 33358)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_curve.c	2010-11-28 09:33:06 UTC (rev 33359)
@@ -56,7 +56,7 @@
 	
 	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, &node->inputevents, &node->events);
+	sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 }
 
 static void init(bNode *node)

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-11-28 06:03:30 UTC (rev 33358)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-11-28 09:33:06 UTC (rev 33359)
@@ -231,7 +231,7 @@
 	if (kernelfunc) {
 		kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 		sim_kernel_init(execdata, kernel, node, kernelfunc, kernelname, 0);
-		sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+		sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 	}
 }
 

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math.c	2010-11-28 06:03:30 UTC (rev 33358)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math.c	2010-11-28 09:33:06 UTC (rev 33359)
@@ -154,7 +154,7 @@
 	if (kernelfunc) {
 		kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 		sim_kernel_init(execdata, kernel, node, kernelfunc, kernelname, 0);
-		sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+		sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 	}
 }
 
@@ -263,7 +263,7 @@
 	if (kernelfunc) {
 		kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 		sim_kernel_init(execdata, kernel, node, kernelfunc, kernelname, 0);
-		sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+		sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 	}
 }
 
@@ -372,7 +372,7 @@
 	if (kernelfunc) {
 		kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 		sim_kernel_init(execdata, kernel, node, kernelfunc, kernelname, 0);
-		sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+		sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 	}
 }
 
@@ -469,7 +469,7 @@
 	if (kernelfunc) {
 		kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 		sim_kernel_init(execdata, kernel, node, kernelfunc, kernelname, 0);
-		sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+		sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 	}
 }
 
@@ -526,7 +526,7 @@
 	sim_kernel_source_name(node, NULL, kernelname);
 	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 	sim_kernel_init(execdata, kernel, node, kernel_sine, kernelname, 0);
-	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+	sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 }
 
 void nodeRegisterSimSine(ListBase *typelist)
@@ -576,7 +576,7 @@
 	sim_kernel_source_name(node, NULL, kernelname);
 	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 	sim_kernel_init(execdata, kernel, node, kernel_cosine, kernelname, 0);
-	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+	sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 }
 
 void nodeRegisterSimCosine(ListBase *typelist)
@@ -626,7 +626,7 @@
 	sim_kernel_source_name(node, NULL, kernelname);
 	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 	sim_kernel_init(execdata, kernel, node, kernel_tangent, kernelname, 0);
-	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+	sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 }
 
 void nodeRegisterSimTangent(ListBase *typelist)
@@ -677,7 +677,7 @@
 	sim_kernel_source_name(node, NULL, kernelname);
 	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
 	sim_kernel_init(execdata, kernel, node, kernel_arcsine, kernelname, 0);
-	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+	sim_kernel_enqueue(execdata, node, kernel, node->outstack[0].context.size);
 }
 
 void nodeRegisterSimArcsine(ListBase *typelist)
@@ -728,7 +728,7 @@
 	sim_kernel_source_name(node, NULL, kernelname);
 	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list