[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