[Bf-blender-cvs] [9450138a555] cycles-x: Cycles: don't copy object matrices for objects without motion blur
Brecht Van Lommel
noreply at git.blender.org
Tue May 4 14:08:09 CEST 2021
Commit: 9450138a555e71ee396ca32a9d36939c21ec166a
Author: Brecht Van Lommel
Date: Fri Apr 30 18:59:14 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB9450138a555e71ee396ca32a9d36939c21ec166a
Cycles: don't copy object matrices for objects without motion blur
To avoid memory read/write cost on the GPU.
Differential Revision: https://developer.blender.org/D11132
===================================================================
M intern/cycles/kernel/geom/geom_curve_intersect.h
M intern/cycles/kernel/geom/geom_motion_triangle_intersect.h
M intern/cycles/kernel/geom/geom_object.h
M intern/cycles/kernel/geom/geom_triangle_intersect.h
M intern/cycles/kernel/kernel_shader.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/kernel/osl/osl_services.cpp
===================================================================
diff --git a/intern/cycles/kernel/geom/geom_curve_intersect.h b/intern/cycles/kernel/geom/geom_curve_intersect.h
index 76e98b1e62e..19f745d733f 100644
--- a/intern/cycles/kernel/geom/geom_curve_intersect.h
+++ b/intern/cycles/kernel/geom/geom_curve_intersect.h
@@ -707,11 +707,7 @@ ccl_device_inline void curve_shader_setup(const KernelGlobals *kg,
const int isect_prim)
{
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_itfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_INVERSE_TRANSFORM);
-# endif
+ const Transform tfm = object_get_inverse_transform(kg, sd);
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D * t);
@@ -781,12 +777,7 @@ ccl_device_inline void curve_shader_setup(const KernelGlobals *kg,
# endif
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_tfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_TRANSFORM);
-# endif
-
+ const Transform tfm = object_get_transform(kg, sd);
P = transform_point(&tfm, P);
}
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h b/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h
index 1317fe4f74a..ec7e4b07d76 100644
--- a/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h
+++ b/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h
@@ -48,11 +48,7 @@ ccl_device_inline float3 motion_triangle_refine(const KernelGlobals *kg,
if (UNLIKELY(t == 0.0f)) {
return P;
}
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_itfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_INVERSE_TRANSFORM);
-# endif
+ const Transform tfm = object_get_inverse_transform(kg, sd);
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D * t);
@@ -75,12 +71,7 @@ ccl_device_inline float3 motion_triangle_refine(const KernelGlobals *kg,
P = P + D * rt;
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_tfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_TRANSFORM);
-# endif
-
+ const Transform tfm = object_get_transform(kg, sd);
P = transform_point(&tfm, P);
}
@@ -116,11 +107,7 @@ ccl_device_inline
# else
# ifdef __INTERSECTION_REFINE__
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_itfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_INVERSE_TRANSFORM);
-# endif
+ const Transform tfm = object_get_inverse_transform(kg, sd);
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D);
@@ -142,12 +129,7 @@ ccl_device_inline
P = P + D * rt;
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_tfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_TRANSFORM);
-# endif
-
+ const Transform tfm = object_get_transform(kg, sd);
P = transform_point(&tfm, P);
}
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index 7625bb1e0dd..4fcbda8caf9 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -113,6 +113,30 @@ ccl_device_inline Transform object_fetch_transform_motion_test(const KernelGloba
}
#endif
+/* Get transform matrix for shading point. */
+
+ccl_device_inline Transform object_get_transform(const KernelGlobals *kg, const ShaderData *sd)
+{
+#ifdef __OBJECT_MOTION__
+ return (sd->object_flag & SD_OBJECT_MOTION) ?
+ sd->ob_tfm_motion :
+ object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
+#else
+ return object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
+#endif
+}
+
+ccl_device_inline Transform object_get_inverse_transform(const KernelGlobals *kg,
+ const ShaderData *sd)
+{
+#ifdef __OBJECT_MOTION__
+ return (sd->object_flag & SD_OBJECT_MOTION) ?
+ sd->ob_itfm_motion :
+ object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
+#else
+ return object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
+#endif
+}
/* Transform position from object to world space */
ccl_device_inline void object_position_transform(const KernelGlobals *kg,
@@ -120,11 +144,14 @@ ccl_device_inline void object_position_transform(const KernelGlobals *kg,
float3 *P)
{
#ifdef __OBJECT_MOTION__
- *P = transform_point_auto(&sd->ob_tfm, *P);
-#else
+ if (sd->object_flag & SD_OBJECT_MOTION) {
+ *P = transform_point_auto(&sd->ob_tfm_motion, *P);
+ return;
+ }
+#endif
+
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
*P = transform_point(&tfm, *P);
-#endif
}
/* Transform position from world to object space */
@@ -134,11 +161,14 @@ ccl_device_inline void object_inverse_position_transform(const KernelGlobals *kg
float3 *P)
{
#ifdef __OBJECT_MOTION__
- *P = transform_point_auto(&sd->ob_itfm, *P);
-#else
+ if (sd->object_flag & SD_OBJECT_MOTION) {
+ *P = transform_point_auto(&sd->ob_itfm_motion, *P);
+ return;
+ }
+#endif
+
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
*P = transform_point(&tfm, *P);
-#endif
}
/* Transform normal from world to object space */
@@ -148,10 +178,14 @@ ccl_device_inline void object_inverse_normal_transform(const KernelGlobals *kg,
float3 *N)
{
#ifdef __OBJECT_MOTION__
- if ((sd->object != OBJECT_NONE) || (sd->type == PRIMITIVE_LAMP)) {
- *N = normalize(transform_direction_transposed_auto(&sd->ob_tfm, *N));
+ if (sd->object_flag & SD_OBJECT_MOTION) {
+ if ((sd->object != OBJECT_NONE) || (sd->type == PRIMITIVE_LAMP)) {
+ *N = normalize(transform_direction_transposed_auto(&sd->ob_tfm_motion, *N));
+ }
+ return;
}
-#else
+#endif
+
if (sd->object != OBJECT_NONE) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
*N = normalize(transform_direction_transposed(&tfm, *N));
@@ -160,7 +194,6 @@ ccl_device_inline void object_inverse_normal_transform(const KernelGlobals *kg,
Transform tfm = lamp_fetch_transform(kg, sd->lamp, false);
*N = normalize(transform_direction_transposed(&tfm, *N));
}
-#endif
}
/* Transform normal from object to world space */
@@ -170,11 +203,14 @@ ccl_device_inline void object_normal_transform(const KernelGlobals *kg,
float3 *N)
{
#ifdef __OBJECT_MOTION__
- *N = normalize(transform_direction_transposed_auto(&sd->ob_itfm, *N));
-#else
+ if (sd->object_flag & SD_OBJECT_MOTION) {
+ *N = normalize(transform_direction_transposed_auto(&sd->ob_itfm_motion, *N));
+ return;
+ }
+#endif
+
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
*N = normalize(transform_direction_transposed(&tfm, *N));
-#endif
}
/* Transform direction vector from object to world space */
@@ -184,11 +220,14 @@ ccl_device_inline void object_dir_transform(const KernelGlobals *kg,
float3 *D)
{
#ifdef __OBJECT_MOTION__
- *D = transform_direction_auto(&sd->ob_tfm, *D);
-#else
+ if (sd->object_flag & SD_OBJECT_MOTION) {
+ *D = transform_direction_auto(&sd->ob_tfm_motion, *D);
+ return;
+ }
+#endif
+
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
*D = transform_direction(&tfm, *D);
-#endif
}
/* Transform direction vector from world to object space */
@@ -198,7 +237,7 @@ ccl_device_inline void object_inverse_dir_transform(const KernelGlobals *kg,
float3 *D)
{
#ifdef __OBJECT_MOTION__
- *D = transform_direction_auto(&sd->ob_itfm, *D);
+ *D = transform_direction_auto(&sd->ob_itfm_motion, *D);
#else
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
*D = transform_direction(&tfm, *D);
@@ -213,11 +252,13 @@ ccl_device_inline float3 object_location(const KernelGlobals *kg, const ShaderDa
return make_float3(0.0f, 0.0f, 0.0f);
#ifdef __OBJECT_MOTION__
- return make_float3(sd->ob_tfm.x.w, sd->ob_tfm.y.w, sd->ob_tfm.z.w);
-#else
+ if (sd->object_flag & SD_OBJECT_MOTION) {
+ return make_float3(sd->ob_tfm_motion.x.w, sd->ob_tfm_motion.y.w, sd->ob_tfm_motion.z.w);
+ }
+#endif
+
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
return make_float3(tfm.x.w, tfm.y.w, tfm.z.w);
-#endif
}
/* Color of the object */
diff --git a/intern/cycles/kernel/geom/geom_triangle_intersect.h b/intern/cycles/kernel/geom/geom_triangle_intersect.h
index 9cfd79acbec..30b77ebd2eb 100644
--- a/intern/cycles/kernel/geom/geom_triangle_intersect.h
+++ b/intern/cycles/kernel/geom/geom_triangle_intersect.h
@@ -210,11 +210,7 @@ ccl_device_inline float3 triangle_refine(const KernelGlobals *kg,
if (UNLIKELY(t == 0.0f)) {
return P;
}
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_itfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_INVERSE_TRANSFORM);
-# endif
+ const Transform tfm = object_get_inverse_transform(kg, sd);
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D * t);
@@ -244,12 +240,7 @@ ccl_device_inline float3 triangle_refine(const KernelGlobals *kg,
}
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
- Transform tfm = sd->ob_tfm;
-# else
- Transform tfm = object_fetch_transform(kg, isect_object, OBJECT_TRANSFORM);
-# endif
-
+ const Transform tfm = object_get_transform(kg, sd);
P = transform_point(&tfm, P);
}
@@ -275,11 +266,7 @@ ccl_device_inline float3 triangle_refine_local(const KernelGlobals *kg,
return triangle_refine(kg, sd, P, D, t, isect_object, isect_prim);
#else
if (isect_object != OBJECT_NONE) {
-# ifdef __OBJECT_MOTION__
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list