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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2021-01-20 13:18:40 +0300
committerSergey Sharybin <sergey@blender.org>2021-01-22 16:31:06 +0300
commit226eb5e3668699e7b1d9c985a2b79ac49020befc (patch)
tree3edbaf9cd95e0bcf0e48cf9de9e79b85da47bca2 /intern/cycles/kernel/kernels
parent644976548d59fd77593dc2ab91700a52ff17cc0b (diff)
Cycles: Fix usage of double floating precision in CNanoVDB
Double floating point precision is an extension of OpenCL, which might not be implemented by certain drivers, such as Intel Xe graphics. Cycles does not use double floating point precision, and there is no need on keeping doubles unless there is an explicit decision to use them. This is a simple fix from Cycles side to replace double floating point type with a type of same size and alignment rules. Inspired by Brecht and Patrick. Tested on NVidia Titan V, Radeon RX Vega M, and TGL laptop. Differential Revision: https://developer.blender.org/D10143
Diffstat (limited to 'intern/cycles/kernel/kernels')
-rw-r--r--intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
index 79e3a16ef19..d87e5f193ad 100644
--- a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
+++ b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
@@ -15,7 +15,20 @@
*/
#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 mathermatical 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 {
+ uint64_t i;
+} ccl_vdb_double_t;
+
+# define double ccl_vdb_double_t
# include "nanovdb/CNanoVDB.h"
+# undef double
#endif
/* For OpenCL we do manual lookup and interpolation. */