[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33735] branches/particles-2010/source/ blender: Implemented a new way of activating nodes.

Lukas Toenne lukas.toenne at googlemail.com
Fri Dec 17 12:44:09 CET 2010


Revision: 33735
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33735
Author:   lukastoenne
Date:     2010-12-17 12:44:09 +0100 (Fri, 17 Dec 2010)

Log Message:
-----------
Implemented a new way of activating nodes. Instead of automatically activating all data inputs of a node, individual sockets can now be requested (the old way is still default, if the CUSTOM_REQUESTS flag is not set). This will allow more advanced data evaluations, notably for simulation nodes, which need to calculate forces several times for substeps, and "if" nodes, which only need to evaluate one of the then/else inputs.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/makesdna/DNA_node_types.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_add_particle.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_constant.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_create_mesh_point.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_for_group.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_mesh_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_particle_dynamics.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.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_subprogram.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-12-17 10:33:28 UTC (rev 33734)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-12-17 11:44:09 UTC (rev 33735)
@@ -137,8 +137,7 @@
 	char *(*generate_source)(struct SimNodeStack *node);
 	void (*initexec)(struct SimNodeStack *node);
 	void (*freeexec)(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);
+	int (*enqueue)(struct SimExecData *execdata, struct SimNodeStack *node, struct SimDataContext *self, int exec);
 } bNodeType;
 
 /* node->exec, now in use for composites (#define for break is same as ready yes) */

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-12-17 10:33:28 UTC (rev 33734)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-12-17 11:44:09 UTC (rev 33735)
@@ -212,6 +212,8 @@
 		/* composite: don't do node but pass on buffer(s) */
 #define NODE_MUTED			512
 #define NODE_CUSTOM_NAME		1024
+		/* simulation: don't automatically request all data inputs */
+#define NODE_CUSTOM_REQUEST	2048
 
 typedef struct bNodeLink {
 	struct bNodeLink *next, *prev;

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_intern.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_intern.c	2010-12-17 10:33:28 UTC (rev 33734)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_intern.c	2010-12-17 11:44:09 UTC (rev 33735)
@@ -116,237 +116,3 @@
 		}
 	}
 }
-
-void sim_event_init(SimEvent *event)
-{
-	event->status = SIM_QUEUED;
-	event->refcount = 1;
-}
-
-void sim_event_retain(SimEvent *event)
-{
-	++event->refcount;
-}
-
-void sim_event_release(SimEvent *event)
-{
-	--event->refcount;
-	if (event->refcount == 0) {
-		MEM_freeN(event);
-	}
-}
-
-SimEventStatus sim_event_status(SimEvent *event)
-{
-#ifdef WITH_OPENCL
-	if (BKE_opencl_is_active()) {
-		cl_int status;
-		clGetEventInfo(event->impl_cl, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &status, NULL);
-		return status;
-	}
-	else
-#endif
-	{
-		return event->status;
-	}
-}
-
-
-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;
-	SimEventLink *link;
-	
-	if (events->first == NULL) {
-		*num_events = 0;
-		*events_cl = NULL;
-		return;
-	}
-	
-	*num_events = BLI_countlist(events);
-	*events_cl = MEM_callocN((*num_events) * sizeof(cl_event), "events_cl");
-	for (link=events->first, i=0; link; link=link->next, ++i) {
-		(*events_cl)[i] = link->event->impl_cl;
-	}
-}
-#endif
-
-SimJob *sim_enqueue_job(SimExecData *execdata, SimJobFunction execfunc, SimJobFreeFunction freefunc, void *data, int totitems, int workgroupsize, ListBase *wait_events, ListBase *event_list)
-{
-	SimJob *job= MEM_callocN(sizeof(SimJob), "SimJob");
-	job->data = data;
-	job->execfunc = execfunc;
-	job->freefunc = freefunc;
-	job->totitems = totitems;
-	job->workgroupsize = (workgroupsize > 0 ? workgroupsize : execdata->default_workgroupsize);
-	job->startitem = 0;
-	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);
-	if (sim_eventlist_status(&job->wait_events)==SIM_COMPLETE)
-		job->event->status = SIM_SUBMITTED;
-	else
-		job->event->status = SIM_QUEUED;
-	if (event_list)
-		sim_eventlist_append(event_list, job->event);
-	
-	BLI_addtail(&execdata->queue, job);
-	pthread_cond_signal(&execdata->workercond);
-	
-	return job;
-}
-
-void sim_dequeue_job(SimExecData *execdata, SimJob *job)
-{
-	BLI_remlink(&execdata->queue, job);
-	sim_event_release(job->event);
-	sim_eventlist_free(&job->wait_events);
-	if (job->freefunc)
-		job->freefunc(execdata, job->data);
-	if (job->data)
-		MEM_freeN(job->data);
-	MEM_freeN(job);
-}
-
-void sim_finish_job(SimExecData *UNUSED(execdata), SimJob *job)
-{
-	job->event->status = SIM_COMPLETE;
-	for (job=job->next; job; job = job->next) {
-		if (sim_event_status(job->event) == SIM_QUEUED && sim_eventlist_status(&job->wait_events)==SIM_COMPLETE) {
-			/* activate the job */
-			job->event->status = SIM_SUBMITTED;
-		}
-	}
-}

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_intern.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_intern.h	2010-12-17 10:33:28 UTC (rev 33734)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_intern.h	2010-12-17 11:44:09 UTC (rev 33735)
@@ -61,37 +61,6 @@
 
 struct SimExecData;
 
-typedef struct SimEvent {
-	#ifdef WITH_OPENCL
-	cl_event impl_cl;
-	#endif
-	/* only used in non-OpenCL mode */
-	SimEventStatus status;
-	int refcount;
-} SimEvent;
-
-typedef struct SimEventLink {
-	struct SimEventLink *next, *prev;
-	struct SimEvent *event;
-} SimEventLink;
-
-typedef void (*SimJobFunction)(void *data, int start, int total);
-typedef void (*SimJobFreeFunction)(struct SimExecData *execdata, void *data);
-typedef struct SimJob {
-	struct SimJob *next, *prev;
-	int active;						/* number of threads working on this task */
-	
-	ListBase wait_events;
-	SimEvent *event;
-	
-	int totitems, workgroupsize;
-	int startitem;					/* starting index for the next worker thread */
-	
-	void *data;
-	SimJobFunction execfunc;
-	SimJobFreeFunction freefunc;
-} SimJob;
-
 typedef struct SimWorkerThread {
 	struct SimExecData *execdata;
 	int num;
@@ -101,43 +70,4 @@
 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);
-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
-
-struct SimJob *sim_enqueue_job(struct SimExecData *execdata, SimJobFunction execfunc, SimJobFreeFunction freefunc, void *data, int totitems, int workgroupsize, struct ListBase *wait_events, struct ListBase *event_list);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list