[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