[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