[Bf-blender-cvs] [eb71157e2a9] master: Cleanup: add utility functions for packing integers

Brecht Van Lommel noreply at git.blender.org
Fri Oct 15 15:59:43 CEST 2021


Commit: eb71157e2a9c7abdeb7045bdf9b79d8ca27ba263
Author: Brecht Van Lommel
Date:   Thu Oct 14 17:51:27 2021 +0200
Branches: master
https://developer.blender.org/rBeb71157e2a9c7abdeb7045bdf9b79d8ca27ba263

Cleanup: add utility functions for packing integers

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

M	intern/cycles/kernel/bvh/bvh.h
M	intern/cycles/kernel/device/optix/kernel.cu
M	intern/cycles/util/util_math.h

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

diff --git a/intern/cycles/kernel/bvh/bvh.h b/intern/cycles/kernel/bvh/bvh.h
index 8f6dcd0adb9..a501cbe7a4b 100644
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@ -256,10 +256,10 @@ ccl_device_intersect bool scene_intersect_local(ccl_global const KernelGlobals *
                                                 int max_hits)
 {
 #  ifdef __KERNEL_OPTIX__
-  uint p0 = ((uint64_t)lcg_state) & 0xFFFFFFFF;
-  uint p1 = (((uint64_t)lcg_state) >> 32) & 0xFFFFFFFF;
-  uint p2 = ((uint64_t)local_isect) & 0xFFFFFFFF;
-  uint p3 = (((uint64_t)local_isect) >> 32) & 0xFFFFFFFF;
+  uint p0 = pointer_pack_to_uint_0(lcg_state);
+  uint p1 = pointer_pack_to_uint_1(lcg_state);
+  uint p2 = pointer_pack_to_uint_0(local_isect);
+  uint p3 = pointer_pack_to_uint_1(local_isect);
   uint p4 = local_object;
   /* Is set to zero on miss or if ray is aborted, so can be used as return value. */
   uint p5 = max_hits;
@@ -368,8 +368,9 @@ ccl_device_intersect bool scene_intersect_shadow_all(ccl_global const KernelGlob
                                                      ccl_private uint *num_hits)
 {
 #  ifdef __KERNEL_OPTIX__
-  uint p0 = ((uint64_t)isect) & 0xFFFFFFFF;
-  uint p1 = (((uint64_t)isect) >> 32) & 0xFFFFFFFF;
+  uint p0 = pointer_pack_to_uint_0(isect);
+  uint p1 = pointer_pack_to_uint_1(isect);
+  uint p2 = 0; /* Number of hits. */
   uint p3 = max_hits;
   uint p4 = visibility;
   uint p5 = false;
@@ -394,11 +395,13 @@ ccl_device_intersect bool scene_intersect_shadow_all(ccl_global const KernelGlob
              0,
              p0,
              p1,
-             *num_hits,
+             p2,
              p3,
              p4,
              p5);
 
+  *num_hits = p2;
+
   return p5;
 #  else /* __KERNEL_OPTIX__ */
   if (!scene_intersect_valid(ray)) {
diff --git a/intern/cycles/kernel/device/optix/kernel.cu b/intern/cycles/kernel/device/optix/kernel.cu
index 736f30d93ef..c9577bb2aa2 100644
--- a/intern/cycles/kernel/device/optix/kernel.cu
+++ b/intern/cycles/kernel/device/optix/kernel.cu
@@ -34,11 +34,11 @@
 
 template<typename T> ccl_device_forceinline T *get_payload_ptr_0()
 {
-  return (T *)(((uint64_t)optixGetPayload_1() << 32) | optixGetPayload_0());
+  return pointer_unpack_from_uint<T>(optixGetPayload_0(), optixGetPayload_1());
 }
 template<typename T> ccl_device_forceinline T *get_payload_ptr_2()
 {
-  return (T *)(((uint64_t)optixGetPayload_3() << 32) | optixGetPayload_2());
+  return pointer_unpack_from_uint<T>(optixGetPayload_2(), optixGetPayload_3());
 }
 
 ccl_device_forceinline int get_object_id()
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
index f834011a032..535b6881d3f 100644
--- a/intern/cycles/util/util_math.h
+++ b/intern/cycles/util/util_math.h
@@ -268,6 +268,36 @@ ccl_device_inline float4 __int4_as_float4(int4 i)
 #endif
 }
 
+template<typename T> ccl_device_inline uint pointer_pack_to_uint_0(T *ptr)
+{
+  return ((uint64_t)ptr) & 0xFFFFFFFF;
+}
+
+template<typename T> ccl_device_inline uint pointer_pack_to_uint_1(T *ptr)
+{
+  return (((uint64_t)ptr) >> 32) & 0xFFFFFFFF;
+}
+
+template<typename T> ccl_device_inline T *pointer_unpack_from_uint(const uint a, const uint b)
+{
+  return (T *)(((uint64_t)b << 32) | a);
+}
+
+ccl_device_inline uint uint16_pack_to_uint(const uint a, const uint b)
+{
+  return (a << 16) | b;
+}
+
+ccl_device_inline uint uint16_unpack_from_uint_0(const uint i)
+{
+  return i >> 16;
+}
+
+ccl_device_inline uint uint16_unpack_from_uint_1(const uint i)
+{
+  return i & 0xFFFF;
+}
+
 /* Versions of functions which are safe for fast math. */
 ccl_device_inline bool isnan_safe(float f)
 {



More information about the Bf-blender-cvs mailing list