46 lines
1.3 KiB
C++
46 lines
1.3 KiB
C++
/* SPDX-FileCopyrightText: 2021-2022 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#ifdef WITH_NANOVDB
|
|
/* Data type to replace `double` used in the NanoVDB headers. Cycles don't need doubles, and is
|
|
* safer and more portable to never use double datatype on GPU.
|
|
* Use a special structure, so that the following is true:
|
|
* - No unnoticed implicit cast or mathematical operations used on scalar 64bit type
|
|
* (which rules out trick like using `uint64_t` as a drop-in replacement for double).
|
|
* - Padding rules are matching exactly `double`
|
|
* (which rules out array of `uint8_t`). */
|
|
typedef struct ccl_vdb_double_t {
|
|
union ccl_vdb_helper_t {
|
|
double d;
|
|
uint64_t i;
|
|
};
|
|
|
|
uint64_t i;
|
|
ccl_vdb_double_t(double value)
|
|
{
|
|
ccl_vdb_helper_t helper;
|
|
helper.d = value;
|
|
i = helper.i;
|
|
}
|
|
/* We intentionally allow conversion to float in order to workaround compilation errors
|
|
* for defined math functions that take doubles. */
|
|
operator float() const
|
|
{
|
|
ccl_vdb_helper_t helper;
|
|
helper.i = i;
|
|
return (float)helper.d;
|
|
}
|
|
} ccl_vdb_double_t;
|
|
|
|
# define double ccl_vdb_double_t
|
|
# include "kernel/util/nanovdb.h"
|
|
# undef double
|
|
#endif
|
|
|
|
/* clang-format off */
|
|
struct ONEAPIKernelContext : public KernelGlobalsGPU {
|
|
public:
|
|
# include "kernel/device/oneapi/image.h"
|
|
/* clang-format on */
|