[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32195] branches/particles-2010/source/ blender/nodes/intern/simulation: Bugfix for GetData/ SetData nodes in combination with OpenCL: buffer elements can not be copied directly ( at least not for array-type data like vectors and colors, which use the OpenCL vector types).
Lukas Toenne
lukas.toenne at googlemail.com
Wed Sep 29 20:26:09 CEST 2010
Revision: 32195
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32195
Author: lukastoenne
Date: 2010-09-29 20:26:09 +0200 (Wed, 29 Sep 2010)
Log Message:
-----------
Bugfix for GetData/SetData nodes in combination with OpenCL: buffer elements can not be copied directly (at least not for array-type data like vectors and colors, which use the OpenCL vector types). This is now done in wrapper functions for reading/writing mapped buffers.
Modified Paths:
--------------
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/nodes/SIM_get_data.c
branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_set_data.c
Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c 2010-09-29 16:32:38 UTC (rev 32194)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c 2010-09-29 18:26:09 UTC (rev 32195)
@@ -742,6 +742,174 @@
}
}
+void sim_mapped_buffer_read_float(void *ptr, int index, float *result)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ *result = *((cl_float*)ptr + index);
+ }
+ else
+#endif
+ {
+ *result = *((float*)ptr + index);
+ }
+}
+
+void sim_mapped_buffer_read_int(void *ptr, int index, int *result)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ *result = *((cl_int*)ptr + index);
+ }
+ else
+#endif
+ {
+ *result = *((int*)ptr + index);
+ }
+}
+
+void sim_mapped_buffer_read_bool(void *ptr, int index, char *result)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ *result = *((cl_char*)ptr + index);
+ }
+ else
+#endif
+ {
+ *result = *((char*)ptr + index);
+ }
+}
+
+void sim_mapped_buffer_read_vector(void *ptr, int index, float *result)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ result[0] = (*((cl_float4*)ptr + index)).x;
+ result[1] = (*((cl_float4*)ptr + index)).y;
+ result[2] = (*((cl_float4*)ptr + index)).z;
+ }
+ else
+#endif
+ {
+ copy_v3_v3(result, (float*)ptr + 3*index);
+ }
+}
+
+void sim_mapped_buffer_read_rgba(void *ptr, int index, float *result)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ result[0] = (*((cl_float4*)ptr + index)).x;
+ result[1] = (*((cl_float4*)ptr + index)).y;
+ result[2] = (*((cl_float4*)ptr + index)).z;
+ result[3] = (*((cl_float4*)ptr + index)).w;
+ }
+ else
+#endif
+ {
+ copy_v4_v4(result, (float*)ptr + 4*index);
+ }
+}
+
+void sim_mapped_buffer_read_string(void *ptr, int index, char *result)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ memcpy(result, (cl_char*)ptr + SIM_STRINGLENGTH*index, SIM_STRINGLENGTH*sizeof(cl_char));
+ }
+ else
+#endif
+ {
+ memcpy(result, (char*)ptr + SIM_STRINGLENGTH*index, SIM_STRINGLENGTH*sizeof(char));
+ }
+}
+
+void sim_mapped_buffer_write_float(void *ptr, int index, float value)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ *((cl_float*)ptr + index) = value;
+ }
+ else
+#endif
+ {
+ *((float*)ptr + index) = value;
+ }
+}
+
+void sim_mapped_buffer_write_int(void *ptr, int index, int value)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ *((cl_int*)ptr + index) = value;
+ }
+ else
+#endif
+ {
+ *((int*)ptr + index) = value;
+ }
+}
+
+void sim_mapped_buffer_write_bool(void *ptr, int index, char value)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ *((cl_char*)ptr + index) = value;
+ }
+ else
+#endif
+ {
+ *((char*)ptr + index) = value;
+ }
+}
+
+void sim_mapped_buffer_write_vector(void *ptr, int index, const float *value)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ (*((cl_float4*)ptr + index)).x = value[0];
+ (*((cl_float4*)ptr + index)).y = value[1];
+ (*((cl_float4*)ptr + index)).z = value[2];
+ (*((cl_float4*)ptr + index)).w = 0.0f;
+ }
+ else
+#endif
+ {
+ copy_v3_v3((float*)ptr + 3*index, value);
+ }
+}
+
+void sim_mapped_buffer_write_rgba(void *ptr, int index, const float *value)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ (*((cl_float4*)ptr + index)).x = value[0];
+ (*((cl_float4*)ptr + index)).y = value[1];
+ (*((cl_float4*)ptr + index)).z = value[2];
+ (*((cl_float4*)ptr + index)).w = value[3];
+ }
+ else
+#endif
+ {
+ copy_v4_v4((float*)ptr + 3*index, value);
+ }
+}
+
+void sim_mapped_buffer_write_string(void *ptr, int index, const char *value)
+{
+#ifdef WITH_OPENCL
+ if (BKE_opencl_is_active()) {
+ memcpy((cl_char*)ptr + SIM_STRINGLENGTH*index, value, SIM_STRINGLENGTH*sizeof(cl_char));
+ }
+ else
+#endif
+ {
+ memcpy((char*)ptr + SIM_STRINGLENGTH*index, value, SIM_STRINGLENGTH*sizeof(char));
+ }
+}
+
+
#if 0 /* OpenCL 1.1 specs */
SimEvent sim_create_user_event(struct SimExecData *execdata)
{
@@ -913,58 +1081,6 @@
}
}
-#if 0
-void sim_set_kernel_socket_data_arg(SimExecData *execdata, SimKernel *kernel, int arg_index, SimSocketStack *socket)
-{
- if (execdata->error)
- return;
-
-#ifdef WITH_OPENCL
- if (BKE_opencl_is_active()) {
- cl_int res;
- res = clSetKernelArg(kernel->impl_cl, arg_index, sizeof(cl_mem), &socket->buffer.data_cl);
- if (res != CL_SUCCESS) {
- execdata->error = 1;
- sprintf(execdata->error_string, "Error setting OpenCL kernel socket data argument: %s", BKE_opencl_message(res));
- }
- }
- else
-#endif
- {
- assert( arg_index < SIM_MAXKERNELARGS );
- if (kernel->args[arg_index])
- MEM_freeN(kernel->args[arg_index]);
- kernel->args[arg_index] = MEM_callocN(sizeof(void*), "kernel socket data argument");
- memcpy(kernel->args[arg_index], &socket->buffer.data, sizeof(void*));
- }
-}
-
-void sim_set_kernel_socket_size_arg(SimExecData *execdata, SimKernel *kernel, int arg_index, SimSocketStack *socket)
-{
- if (execdata->error)
- return;
-
-#ifdef WITH_OPENCL
- if (BKE_opencl_is_active()) {
- cl_int res;
- res = clSetKernelArg(kernel->impl_cl, arg_index, sizeof(int), &socket->context.size);
- if (res != CL_SUCCESS) {
- execdata->error = 1;
- sprintf(execdata->error_string, "Error setting OpenCL kernel socket size argument: %s", BKE_opencl_message(res));
- }
- }
- else
-#endif
- {
- assert( arg_index < SIM_MAXKERNELARGS );
- if (kernel->args[arg_index])
- MEM_freeN(kernel->args[arg_index]);
- kernel->args[arg_index] = MEM_callocN(sizeof(int), "kernel socket size argument");
- memcpy(kernel->args[arg_index], &socket->context.size, sizeof(int));
- }
-}
-#endif
-
static void exec_kernel_task(void *data, int start, int total)
{
SimKernel *kernel= (SimKernel*)data;
Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h 2010-09-29 16:32:38 UTC (rev 32194)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h 2010-09-29 18:26:09 UTC (rev 32195)
@@ -273,11 +273,22 @@
void sim_enqueue_write_buffer(struct SimExecData *execdata, struct SimBuffer *buffer, int blocking, int start, int num, void *src, int num_wait_events, struct SimEvent *wait_events, struct SimEvent *event);
void sim_enqueue_copy_buffer(struct SimExecData *execdata, struct SimBuffer *src, struct SimBuffer *dst, int start_src, int start_dst, int num, int num_wait_events, struct SimEvent *wait_events, struct SimEvent *event);
+void sim_mapped_buffer_read_float(void *ptr, int index, float *result);
+void sim_mapped_buffer_read_int(void *ptr, int index, int *result);
+void sim_mapped_buffer_read_bool(void *ptr, int index, char *result);
+void sim_mapped_buffer_read_vector(void *ptr, int index, float *result);
+void sim_mapped_buffer_read_rgba(void *ptr, int index, float *result);
+void sim_mapped_buffer_read_string(void *ptr, int index, char *result);
+void sim_mapped_buffer_write_float(void *ptr, int index, float value);
+void sim_mapped_buffer_write_int(void *ptr, int index, int value);
+void sim_mapped_buffer_write_bool(void *ptr, int index, char value);
+void sim_mapped_buffer_write_vector(void *ptr, int index, const float *value);
+void sim_mapped_buffer_write_rgba(void *ptr, int index, const float *value);
+void sim_mapped_buffer_write_string(void *ptr, int index, const char *value);
+
struct SimKernel sim_create_kernel(struct SimExecData *execdata, SimKernelFunction func, const char *cl_funcname);
void sim_release_kernel(struct SimExecData *execdata, struct SimKernel *kernel);
void sim_kernel_set_node(struct SimExecData *execdata, struct SimKernel *kernel, struct SimNodeStack *node, int num_args);
-//void sim_set_kernel_socket_data_arg(struct SimExecData *execdata, struct SimKernel *kernel, int arg_index, struct SimSocketStack *socket);
-//void sim_set_kernel_socket_size_arg(struct SimExecData *execdata, struct SimKernel *kernel, int arg_index, struct SimSocketStack *socket);
void sim_set_kernel_arg(struct SimExecData *execdata, struct SimKernel *kernel, int arg_index, size_t arg_size, const void *arg_value);
void sim_enqueue_kernel(struct SimExecData *execdata, struct SimKernel *kernel, size_t total, int num_wait_events, struct SimEvent *wait_events, struct SimEvent *event);
Modified: branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_get_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_get_data.c 2010-09-29 16:32:38 UTC (rev 32194)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_get_data.c 2010-09-29 18:26:09 UTC (rev 32195)
@@ -175,6 +175,8 @@
static void enqueue_output(SimExecData *execdata, SimNodeStack *node, SimSocketStack *out, SimDataContext *ctx, PropertyRNA *prop)
{
size_t datasize = sim_get_data_size(out->type);
+ float val[4];
+ char str[SIM_STRINGLENGTH];
if (!sim_node_prepare_output(execdata, out, ctx) || execdata->error)
return;
@@ -182,7 +184,8 @@
if (sim_context_is_collection(ctx)) {
CollectionPropertyIterator iter;
SimBuffer hostbuffer;
- void *buf, *cur;
+ void *buf;
+ int i;
SimEvent copy_event;
/* This intermediate host buffer is necessary because the collection properties in general
@@ -198,47 +201,51 @@
if (!execdata->error) {
/* iterate over collection and copy data */
RNA_property_collection_begin(&ctx->ptr, ctx->prop, &iter);
- cur = buf;
+ i = 0;
switch (out->type) {
case SOCK_FLOAT:
while (iter.valid) {
- *(float*)cur = RNA_property_float_get(&iter.ptr, prop);
- cur = (char*)cur + datasize;
+ sim_mapped_buffer_write_float(buf, i, RNA_property_float_get(&iter.ptr, prop));
+ ++i;
RNA_property_collection_next(&iter);
}
break;
- case SOCK_INT:
+ case SOCK_INT:
while (iter.valid) {
- *(int*)cur = RNA_property_int_get(&iter.ptr, prop);
- cur = (char*)cur + datasize;
+ sim_mapped_buffer_write_int(buf, i, RNA_property_int_get(&iter.ptr, prop));
+ ++i;
RNA_property_collection_next(&iter);
}
break;
- case SOCK_BOOL:
+ case SOCK_BOOL:
while (iter.valid) {
- *(char*)cur = (char)RNA_property_boolean_get(&iter.ptr, prop);
- cur = (char*)cur + datasize;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list