From 226eb5e3668699e7b1d9c985a2b79ac49020befc Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 20 Jan 2021 11:18:40 +0100 Subject: 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 --- intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'intern') 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. */ -- cgit v1.2.3