[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