Cleanup: add utility functions for packing integers
This commit is contained in:
parent
2ba7c3aa65
commit
eb71157e2a
|
@ -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)) {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue