Cleanup: add utility functions for packing integers

This commit is contained in:
Brecht Van Lommel 2021-10-14 17:51:27 +02:00
parent 2ba7c3aa65
commit eb71157e2a
3 changed files with 42 additions and 9 deletions

View File

@ -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)) {

View File

@ -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()

View File

@ -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)
{