Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2021-10-14 18:51:27 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-10-15 16:42:44 +0300
commiteb71157e2a9c7abdeb7045bdf9b79d8ca27ba263 (patch)
tree16debc9c1a427e28d909890c917e55e9dfd16c5e /intern
parent2ba7c3aa650c3c795d903a24998204f67c75b017 (diff)
Cleanup: add utility functions for packing integers
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/bvh/bvh.h17
-rw-r--r--intern/cycles/kernel/device/optix/kernel.cu4
-rw-r--r--intern/cycles/util/util_math.h30
3 files changed, 42 insertions, 9 deletions
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)
{