[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31875] branches/particles-2010/source/ blender: - Better error handling: SimExecData now contains an error flag and a message string, which can be set by node functions to notify the main evaluation system.
Lukas Toenne
lukas.toenne at googlemail.com
Sat Sep 11 11:55:01 CEST 2010
Revision: 31875
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31875
Author: lukastoenne
Date: 2010-09-11 11:55:01 +0200 (Sat, 11 Sep 2010)
Log Message:
-----------
- Better error handling: SimExecData now contains an error flag and a message string, which can be set by node functions to notify the main evaluation system. This will then cancel execution and print the message.
- Unified SimBuffer to always refer to sizes and offsets in terms of number of data elements instead of bytes (stride is stored internally)
- More fixes for GetData/SetData nodes.
Modified Paths:
--------------
branches/particles-2010/source/blender/blenloader/intern/writefile.c
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c
branches/particles-2010/source/blender/nodes/intern/SIM_util.c
branches/particles-2010/source/blender/nodes/intern/SIM_util.h
branches/particles-2010/source/blender/nodes/intern/node_tree_simulation.c
Modified: branches/particles-2010/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/writefile.c 2010-09-11 06:27:38 UTC (rev 31874)
+++ branches/particles-2010/source/blender/blenloader/intern/writefile.c 2010-09-11 09:55:01 UTC (rev 31875)
@@ -450,13 +450,33 @@
{
writestruct(wd, DATA, "NodeRNAData", 1, rna_data);
if (rna_data->type) {
- /* temporarily create identifier string, to allow restoring the StructRNA pointer */
+ /* save identifier string, to allow restoring the StructRNA pointer */
rna_data->save_type= RNA_struct_identifier(rna_data->type);
- /* save the identifier string itself */
writedata(wd, DATA, strlen(rna_data->save_type)+1, (void*)rna_data->save_type);
}
}
+static void write_node_socket_properties(WriteData *wd, bNode *node)
+{
+ NodeRNAData *rna_data= (NodeRNAData*)node->storage;
+ bNodeSocket *sock;
+
+ if (node->type==SIM_NODE_GETDATA)
+ sock= ((bNodeSocket*)node->outputs.first)->next;
+ else if (node->type==SIM_NODE_GETDATA)
+ sock= ((bNodeSocket*)node->inputs.first)->next;
+ else
+ sock= NULL;
+
+ for (; sock; sock = sock->next) {
+ NodeSocketProperty *sockprop= (NodeSocketProperty*)sock->storage;
+
+ /* save identifier string, to allow restoring the PropertyRNA pointer */
+ sockprop->save_prop = RNA_property_identifier(sockprop->prop);
+ writedata(wd, DATA, strlen(sockprop->save_prop)+1, (void*)sockprop->save_prop);
+ }
+}
+
/* this is only direct data, tree itself should have been written */
static void write_nodetree(WriteData *wd, bNodeTree *ntree)
{
@@ -497,6 +517,9 @@
if (node->storage)
writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
}
+
+ if (node->type==SIM_NODE_GETDATA || node->type==SIM_NODE_SETDATA)
+ write_node_socket_properties(wd, node);
}
for(link= ntree->links.first; link; link= link->next)
Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c 2010-09-11 06:27:38 UTC (rev 31874)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c 2010-09-11 09:55:01 UTC (rev 31875)
@@ -172,126 +172,117 @@
//static const char *cl_source= OPENCL_STRINGIFY(
//);
-static void enqueue_output(SimExecData *execdata, SimSocketStack *out, SimDataContext *ctx)
+static void enqueue_output(SimExecData *execdata, SimSocketStack *out, SimDataContext *ctx, PropertyRNA *prop)
{
size_t datasize = sim_get_data_size(out->type);
- if (!sim_node_prepare_output(execdata, out, ctx, 1))
+ if (!sim_node_prepare_output(execdata, out, ctx, 0) || execdata->error)
return;
if (sim_context_is_collection(ctx)) {
CollectionPropertyIterator iter;
-// SimBuffer pinned;
+ SimBuffer hostbuffer;
void *buf, *cur;
+ SimEvent copy_event;
- #if 0
- /* TODO this intermediate buffer prevents us from enqueueing a big pile of single copy kernels.
- * It would be better to make use of raw arrays to copy data, but this does not work for paged data (particles!)
- * More flexible support for paged data collections (and other partially arrayed data) would be helpful.
- * See also SetData node
+ /* This intermediate host buffer is necessary because the collection properties in general
+ * have a larger stride than the resulting property buffer. We need to collect all elements
+ * in a contiguous buffer to write to the device memory.
*/
-
- /* create intermediate pinned-memory buffer (see NVIDIA OpenCL best practices guide, section 3.1.1) */
- pinned = sim_create_pinned_buffer(execdata, SBM_READ_ONLY, out->type, ctx->size);
+
+ /* create intermediate host-memory buffer (see NVIDIA OpenCL best practices guide, section 3.1.1) */
+ hostbuffer = sim_create_host_buffer(execdata, SBM_READ_ONLY, out->type, ctx->size);
+ if (execdata->error) return;
/* map to host memory pointer */
- buf = sim_enqueue_map_buffer(execdata, &pinned, 1, SBM_MAP_READ, 0, ctx->size * datasize, 0, NULL, NULL);
- #endif
+ buf = sim_enqueue_map_buffer(execdata, &hostbuffer, 1, SMM_MAP_WRITE, 0, ctx->size, 0, NULL, NULL);
+ if (execdata->error) return;
- /* map to host memory pointer */
-// buf = sim_enqueue_map_buffer(execdata, &out->buffer, 1, SBM_MAP_WRITE, 0, ctx->size * datasize, 0, NULL, NULL);
-
- buf = MEM_callocN(out->context.size * datasize, "GetData output buffer");
-
- #if 0
/* iterate over collection and copy data */
RNA_property_collection_begin(&ctx->ptr, ctx->prop, &iter);
cur = buf;
switch (out->type) {
case SOCK_FLOAT:
while (iter.valid) {
- *(float*)cur = RNA_property_float_get(&iter.ptr, (PropertyRNA*)out->base->storage);
+ *(float*)cur = RNA_property_float_get(&iter.ptr, prop);
cur = (char*)cur + datasize;
RNA_property_collection_next(&iter);
}
break;
case SOCK_INT:
while (iter.valid) {
- *(int*)cur = RNA_property_int_get(&iter.ptr, (PropertyRNA*)out->base->storage);
+ *(int*)cur = RNA_property_int_get(&iter.ptr, prop);
cur = (char*)cur + datasize;
RNA_property_collection_next(&iter);
}
break;
case SOCK_BOOL:
while (iter.valid) {
- *(char*)cur = (char)RNA_property_boolean_get(&iter.ptr, (PropertyRNA*)out->base->storage);
+ *(char*)cur = (char)RNA_property_boolean_get(&iter.ptr, prop);
cur = (char*)cur + datasize;
RNA_property_collection_next(&iter);
}
break;
case SOCK_VECTOR:
while (iter.valid) {
- RNA_property_float_get_array(&iter.ptr, (PropertyRNA*)out->base->storage, (float*)cur);
+ RNA_property_float_get_array(&iter.ptr, prop, (float*)cur);
cur = (char*)cur + datasize;
RNA_property_collection_next(&iter);
}
break;
case SOCK_RGBA:
while (iter.valid) {
- RNA_property_float_get_array(&iter.ptr, (PropertyRNA*)out->base->storage, (float*)cur);
+ RNA_property_float_get_array(&iter.ptr, prop, (float*)cur);
cur = (char*)cur + datasize;
RNA_property_collection_next(&iter);
}
break;
case SOCK_STRING:
while (iter.valid) {
- RNA_property_string_get(&iter.ptr, (PropertyRNA*)out->base->storage, (char*)cur);
+ RNA_property_string_get(&iter.ptr, prop, (char*)cur);
cur = (char*)cur + datasize;
RNA_property_collection_next(&iter);
}
break;
}
RNA_property_collection_end(&iter);
- #endif
- sim_enqueue_write_buffer(execdata, &out->buffer, 1, 0, out->context.size * datasize, buf, 0, NULL, &out->event);
- MEM_freeN(buf);
-
-// sim_enqueue_unmap_buffer(execdata, &out->buffer, buf, 0, NULL, &out->event);
-
- #if 0
- sim_enqueue_unmap_buffer(execdata, &pinned, buf, 0, NULL, NULL);
- sim_enqueue_write_buffer(execdata, &out->buffer, 1, 0, ctx->size * datasize, buf, 0, NULL, &out->event);
- sim_release_buffer(&pinned);
- #endif
+ sim_enqueue_unmap_buffer(execdata, &hostbuffer, buf, 0, NULL, ©_event);
+ if (execdata->error) return;
+ sim_enqueue_copy_buffer(execdata, &hostbuffer, &out->buffer, 0, 0, ctx->size, 1, ©_event, &out->event);
+ if (execdata->error) return;
+ sim_release_buffer(execdata, &hostbuffer);
+ if (execdata->error) return;
}
else {
char buf[SIM_MAXDATASIZE];
/* create output data buffer */
out->buffer = sim_create_buffer(execdata, SBM_READ_ONLY, out->type, 1);
+ if (execdata->error) return;
switch (out->type) {
case SOCK_FLOAT:
- *(float*)buf = RNA_property_float_get(&ctx->ptr, (PropertyRNA*)out->base->storage);
+ *(float*)buf = RNA_property_float_get(&ctx->ptr, prop);
break;
case SOCK_INT:
- *(int*)buf = RNA_property_int_get(&ctx->ptr, (PropertyRNA*)out->base->storage);
+ *(int*)buf = RNA_property_int_get(&ctx->ptr, prop);
break;
case SOCK_BOOL:
- *(char*)buf = (char)RNA_property_boolean_get(&ctx->ptr, (PropertyRNA*)out->base->storage);
+ *(char*)buf = (char)RNA_property_boolean_get(&ctx->ptr, prop);
break;
case SOCK_VECTOR:
- RNA_property_float_get_array(&ctx->ptr, (PropertyRNA*)out->base->storage, (float*)buf);
+ RNA_property_float_get_array(&ctx->ptr, prop, (float*)buf);
break;
case SOCK_RGBA:
- RNA_property_float_get_array(&ctx->ptr, (PropertyRNA*)out->base->storage, (float*)buf);
+ RNA_property_float_get_array(&ctx->ptr, prop, (float*)buf);
break;
case SOCK_STRING:
- RNA_property_string_get(&ctx->ptr, (PropertyRNA*)out->base->storage, (char*)buf);
+ RNA_property_string_get(&ctx->ptr, prop, (char*)buf);
break;
}
sim_enqueue_write_buffer(execdata, &out->buffer, 0, 0, datasize, buf, 0, NULL, &out->event);
+ if (execdata->error) return;
}
}
@@ -302,27 +293,34 @@
int resolved;
if (sim_node_prepare_output(execdata, &node->outstack[0], &node->instack[0]->context, 0)) {
+ if (execdata->error) return;
/* copy the path socket to the output */
- sim_enqueue_copy_buffer(execdata, &node->instack[0]->buffer, &node->outstack[0].buffer, 0, 0, node->outstack[0].buffer.stride, node->totin, node->event_wait_list, &node->outstack[0].event);
+ sim_enqueue_copy_buffer(execdata, &node->instack[0]->buffer, &node->outstack[0].buffer, 0, 0, 1, node->totin, node->event_wait_list, &node->outstack[0].event);
+ if (execdata->error) return;
}
/* read the path input to determine the data context (blocking read, we immediately need the path!) */
- sim_enqueue_read_buffer(execdata, &node->instack[0]->buffer, 1, 0, SIM_STRINGLENGTH, path, 0, NULL, NULL);
+ sim_enqueue_read_buffer(execdata, &node->instack[0]->buffer, 1, 0, 1, path, 0, NULL, NULL);
+ if (execdata->error) return;
/* resolve the context */
resolved = sim_context_path_resolve(self, path, &ctx);
if (resolved) {
int i;
+ bNodeSocket *sock; /* for getting the rna property of the input sockets */
if (!RNA_struct_is_a(sim_context_type(&ctx), ((NodeRNAData*)node->base->storage)->type)) {
- printf("Error in %s: Invalid context path \"%s\"\n", node->base->name, path);
+ execdata->error = 1;
+ sprintf(execdata->error_string, "Invalid context path \"%s\"", path);
return;
}
/* output data on property sockets */
+ sock = ((bNodeSocket*)node->base->outputs.first)->next;
for (i=1; i < node->totout; ++i) {
- enqueue_output(execdata, node->outstack + i, &ctx);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list