[Bf-blender-cvs] [431082c6366] soc-2019-cycles-procedural: Fix OpenCL Kernels. Allow average(float4) in OpenCL.

OmarSquircleArt noreply at git.blender.org
Thu Aug 1 12:11:06 CEST 2019


Commit: 431082c6366a277937732617b5e91f45ff778172
Author: OmarSquircleArt
Date:   Thu Aug 1 12:12:11 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rB431082c6366a277937732617b5e91f45ff778172

Fix OpenCL Kernels. Allow average(float4) in OpenCL.

===================================================================

M	intern/cycles/kernel/osl/osl_services.cpp
M	intern/cycles/kernel/svm/svm_attribute.h
M	intern/cycles/util/util_math_float4.h

===================================================================

diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index 399712ad5f1..0cdaf379045 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -531,11 +531,11 @@ static bool set_attribute_float4(float4 f[3], TypeDesc type, bool derivatives, v
     return true;
   }
   else if (type == TypeDesc::TypeFloat) {
-    fval[0] = average(f[0]);
+    fval[0] = average_float4(f[0]);
 
     if (derivatives) {
-      fval[1] = average(f[1]);
-      fval[2] = average(f[2]);
+      fval[1] = average_float4(f[1]);
+      fval[2] = average_float4(f[2]);
     }
     return true;
   }
diff --git a/intern/cycles/kernel/svm/svm_attribute.h b/intern/cycles/kernel/svm/svm_attribute.h
index 2a08b5e126d..84e17fabd62 100644
--- a/intern/cycles/kernel/svm/svm_attribute.h
+++ b/intern/cycles/kernel/svm/svm_attribute.h
@@ -72,7 +72,7 @@ ccl_device void svm_node_attr(KernelGlobals *kg, ShaderData *sd, float *stack, u
   else if (desc.type == NODE_ATTR_RGBA) {
     float4 f = primitive_attribute_float4(kg, sd, desc, NULL, NULL);
     if (type == NODE_ATTR_FLOAT) {
-      stack_store_float(stack, out_offset, average(f));
+      stack_store_float(stack, out_offset, average_float4(f));
     }
     else {
       stack_store_float3(stack, out_offset, float4_to_float3(f));
@@ -126,7 +126,7 @@ ccl_device_noinline
     float4 dx;
     float4 f = primitive_attribute_float4(kg, sd, desc, &dx, NULL);
     if (type == NODE_ATTR_FLOAT) {
-      stack_store_float(stack, out_offset, average(f + dx));
+      stack_store_float(stack, out_offset, average_float4(f + dx));
     }
     else {
       stack_store_float3(stack, out_offset, float4_to_float3(f + dx));
@@ -181,7 +181,7 @@ ccl_device_noinline
     float4 dy;
     float4 f = primitive_attribute_float4(kg, sd, desc, NULL, &dy);
     if (type == NODE_ATTR_FLOAT) {
-      stack_store_float(stack, out_offset, average(f + dy));
+      stack_store_float(stack, out_offset, average_float4(f + dy));
     }
     else {
       stack_store_float3(stack, out_offset, float4_to_float3(f + dy));
diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h
index f0d850cf574..0624dadf5ad 100644
--- a/intern/cycles/util/util_math_float4.h
+++ b/intern/cycles/util/util_math_float4.h
@@ -54,7 +54,6 @@ ccl_device_inline float4 sqrt(const float4 &a);
 ccl_device_inline float4 sqr(const float4 &a);
 ccl_device_inline float4 cross(const float4 &a, const float4 &b);
 ccl_device_inline bool is_zero(const float4 &a);
-ccl_device_inline float average(const float4 &a);
 ccl_device_inline float len(const float4 &a);
 ccl_device_inline float4 normalize(const float4 &a);
 ccl_device_inline float4 safe_normalize(const float4 &a);
@@ -66,6 +65,7 @@ ccl_device_inline float4 fabs(const float4 &a);
 ccl_device_inline float4 floor(const float4 &a);
 #endif /* !__KERNEL_OPENCL__*/
 
+ccl_device_inline float average_float4(const float4 a);
 ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b);
 
 #ifdef __KERNEL_SSE__
@@ -296,11 +296,6 @@ ccl_device_inline float4 reduce_add(const float4 &a)
 #  endif
 }
 
-ccl_device_inline float average(const float4 &a)
-{
-  return reduce_add(a).x * 0.25f;
-}
-
 ccl_device_inline float len(const float4 &a)
 {
   return sqrtf(dot(a, a));
@@ -365,6 +360,11 @@ ccl_device_inline float4 floor(const float4 &a)
 
 #endif /* !__KERNEL_OPENCL__*/
 
+ccl_device_inline float average_float4(const float4 a)
+{
+  return (a.x + a.y + a.z + a.w) * 0.25f;
+}
+
 ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b)
 {
   return make_float4((b != 0.0f) ? a.x / b : 0.0f,



More information about the Bf-blender-cvs mailing list