[Bf-blender-cvs] [91c44fe8854] master: Cycles: disable NanoVDB for AMD OpenCL

Brecht Van Lommel noreply at git.blender.org
Tue Mar 30 00:01:38 CEST 2021


Commit: 91c44fe88547ee4e4d78858d816068876a3db3c4
Author: Brecht Van Lommel
Date:   Mon Mar 29 22:58:19 2021 +0200
Branches: master
https://developer.blender.org/rB91c44fe88547ee4e4d78858d816068876a3db3c4

Cycles: disable NanoVDB for AMD OpenCL

It is causing issue with AMD OpenCL drivers, due to a potential driver bug.

Ref T84461

===================================================================

M	intern/cycles/blender/blender_image.cpp
M	intern/cycles/blender/blender_image.h
M	intern/cycles/blender/blender_volume.cpp
M	intern/cycles/device/device.cpp
M	intern/cycles/device/device.h
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/device/device_opencl.cpp
M	intern/cycles/device/opencl/device_opencl_impl.cpp
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/image_oiio.cpp
M	intern/cycles/render/image_oiio.h
M	intern/cycles/render/image_sky.cpp
M	intern/cycles/render/image_sky.h
M	intern/cycles/render/image_vdb.cpp
M	intern/cycles/render/image_vdb.h

===================================================================

diff --git a/intern/cycles/blender/blender_image.cpp b/intern/cycles/blender/blender_image.cpp
index 459dc1779fb..3a9d159e461 100644
--- a/intern/cycles/blender/blender_image.cpp
+++ b/intern/cycles/blender/blender_image.cpp
@@ -29,7 +29,7 @@ BlenderImageLoader::BlenderImageLoader(BL::Image b_image, int frame)
 {
 }
 
-bool BlenderImageLoader::load_metadata(ImageMetaData &metadata)
+bool BlenderImageLoader::load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata)
 {
   metadata.width = b_image.size()[0];
   metadata.height = b_image.size()[1];
@@ -171,7 +171,7 @@ BlenderPointDensityLoader::BlenderPointDensityLoader(BL::Depsgraph b_depsgraph,
 {
 }
 
-bool BlenderPointDensityLoader::load_metadata(ImageMetaData &metadata)
+bool BlenderPointDensityLoader::load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata)
 {
   metadata.channels = 4;
   metadata.width = b_node.resolution();
diff --git a/intern/cycles/blender/blender_image.h b/intern/cycles/blender/blender_image.h
index b58a159a6ba..fddbbfd9c37 100644
--- a/intern/cycles/blender/blender_image.h
+++ b/intern/cycles/blender/blender_image.h
@@ -27,7 +27,7 @@ class BlenderImageLoader : public ImageLoader {
  public:
   BlenderImageLoader(BL::Image b_image, int frame);
 
-  bool load_metadata(ImageMetaData &metadata) override;
+  bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override;
   bool load_pixels(const ImageMetaData &metadata,
                    void *pixels,
                    const size_t pixels_size,
@@ -44,7 +44,7 @@ class BlenderPointDensityLoader : public ImageLoader {
  public:
   BlenderPointDensityLoader(BL::Depsgraph depsgraph, BL::ShaderNodeTexPointDensity b_node);
 
-  bool load_metadata(ImageMetaData &metadata) override;
+  bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override;
   bool load_pixels(const ImageMetaData &metadata,
                    void *pixels,
                    const size_t pixels_size,
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index 410f7a72cf5..0ff4de846e1 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -41,7 +41,7 @@ class BlenderSmokeLoader : public ImageLoader {
     mesh_texture_space(b_mesh, texspace_loc, texspace_size);
   }
 
-  bool load_metadata(ImageMetaData &metadata) override
+  bool load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata) override
   {
     if (!b_domain) {
       return false;
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 94732cd1855..ed53fbb54ae 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -619,6 +619,7 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo> &subdevices,
   info.num = 0;
 
   info.has_half_images = true;
+  info.has_nanovdb = true;
   info.has_volume_decoupled = true;
   info.has_branched_path = true;
   info.has_adaptive_stop_per_sample = true;
@@ -665,6 +666,7 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo> &subdevices,
 
     /* Accumulate device info. */
     info.has_half_images &= device.has_half_images;
+    info.has_nanovdb &= device.has_nanovdb;
     info.has_volume_decoupled &= device.has_volume_decoupled;
     info.has_branched_path &= device.has_branched_path;
     info.has_adaptive_stop_per_sample &= device.has_adaptive_stop_per_sample;
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 0a731969c79..b5468248e5a 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -78,6 +78,7 @@ class DeviceInfo {
   int num;
   bool display_device;               /* GPU is used as a display device. */
   bool has_half_images;              /* Support half-float textures. */
+  bool has_nanovdb;                  /* Support NanoVDB volumes. */
   bool has_volume_decoupled;         /* Decoupled volume shading. */
   bool has_branched_path;            /* Supports branched path tracing. */
   bool has_adaptive_stop_per_sample; /* Per-sample adaptive sampling stopping. */
@@ -99,6 +100,7 @@ class DeviceInfo {
     cpu_threads = 0;
     display_device = false;
     has_half_images = false;
+    has_nanovdb = false;
     has_volume_decoupled = false;
     has_branched_path = true;
     has_adaptive_stop_per_sample = false;
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index e2f9c7391da..0e3c771dbc3 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -1654,6 +1654,7 @@ void device_cpu_info(vector<DeviceInfo> &devices)
   info.has_adaptive_stop_per_sample = true;
   info.has_osl = true;
   info.has_half_images = true;
+  info.has_nanovdb = true;
   info.has_profiling = true;
   info.denoisers = DENOISER_NLM;
   if (openimagedenoise_supported()) {
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index d9ffcceb06e..2e225ecfaf8 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -128,6 +128,7 @@ void device_cuda_info(vector<DeviceInfo> &devices)
     info.num = num;
 
     info.has_half_images = (major >= 3);
+    info.has_nanovdb = true;
     info.has_volume_decoupled = false;
     info.has_adaptive_stop_per_sample = false;
     info.denoisers = DENOISER_NLM;
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index 11376ee4883..9abb7cfb7fe 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -126,6 +126,9 @@ void device_opencl_info(vector<DeviceInfo> &devices)
     /* Check OpenCL extensions */
     info.has_half_images = platform_device.device_extensions.find("cl_khr_fp16") != string::npos;
 
+    /* Disabled for now due to apparent AMD driver bug. */
+    info.has_nanovdb = platform_name != "AMD Accelerated Parallel Processing";
+
     devices.push_back(info);
     num_devices++;
   }
diff --git a/intern/cycles/device/opencl/device_opencl_impl.cpp b/intern/cycles/device/opencl/device_opencl_impl.cpp
index aee3b0fb64f..d378d32914c 100644
--- a/intern/cycles/device/opencl/device_opencl_impl.cpp
+++ b/intern/cycles/device/opencl/device_opencl_impl.cpp
@@ -2036,7 +2036,9 @@ string OpenCLDevice::kernel_build_options(const string *debug_src)
 #  endif
 
 #  ifdef WITH_NANOVDB
-  build_options += "-DWITH_NANOVDB ";
+  if (info.has_nanovdb) {
+    build_options += "-DWITH_NANOVDB ";
+  }
 #  endif
 
   return build_options;
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 29a95beaf7e..27f9b7df1dd 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -303,7 +303,8 @@ ImageManager::ImageManager(const DeviceInfo &info)
   animation_frame = 0;
 
   /* Set image limits */
-  has_half_images = info.has_half_images;
+  features.has_half_float = info.has_half_images;
+  features.has_nanovdb = info.has_nanovdb;
 }
 
 ImageManager::~ImageManager()
@@ -347,7 +348,7 @@ void ImageManager::load_image_metadata(Image *img)
   metadata = ImageMetaData();
   metadata.colorspace = img->params.colorspace;
 
-  if (img->loader->load_metadata(metadata)) {
+  if (img->loader->load_metadata(features, metadata)) {
     assert(metadata.type != IMAGE_DATA_NUM_TYPES);
   }
   else {
@@ -356,15 +357,10 @@ void ImageManager::load_image_metadata(Image *img)
 
   metadata.detect_colorspace();
 
-  /* No half textures on OpenCL, use full float instead. */
-  if (!has_half_images) {
-    if (metadata.type == IMAGE_DATA_TYPE_HALF4) {
-      metadata.type = IMAGE_DATA_TYPE_FLOAT4;
-    }
-    else if (metadata.type == IMAGE_DATA_TYPE_HALF) {
-      metadata.type = IMAGE_DATA_TYPE_FLOAT;
-    }
-  }
+  assert(features.has_half_float ||
+         (metadata.type != IMAGE_DATA_TYPE_HALF4 && metadata.type != IMAGE_DATA_TYPE_HALF));
+  assert(features.has_nanovdb || (metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT ||
+                                  metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT3));
 
   img->need_metadata = false;
 }
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index c802521db56..dede9513d5f 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -97,6 +97,13 @@ class ImageMetaData {
   void detect_colorspace();
 };
 
+/* Information about supported features that Image loaders can use. */
+class ImageDeviceFeatures {
+ public:
+  bool has_half_float;
+  bool has_nanovdb;
+};
+
 /* Image loader base class, that can be subclassed to load image data
  * from custom sources (file, memory, procedurally generated, etc). */
 class ImageLoader {
@@ -105,7 +112,7 @@ class ImageLoader {
   virtual ~ImageLoader(){};
 
   /* Load metadata without actual image yet, should be fast. */
-  virtual bool load_metadata(ImageMetaData &metadata) = 0;
+  virtual bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) = 0;
 
   /* Load actual image contents. */
   virtual bool load_pixels(const ImageMetaData &metadata,
@@ -212,7 +219,8 @@ class ImageManager {
 
  private:
   bool need_update_;
-  bool has_half_images;
+
+  ImageDeviceFeatures features;
 
   thread_mutex device_mutex;
   thread_mutex images_mutex;
diff --git a/intern/cycles/render/image_oiio.cpp b/intern/cycles/render/image_oiio.cpp
index e9c87461822..4867efe6ac0 100644
--- a/intern/cycles/render/image_oiio.cpp
+++ b/intern/cycles/render/image_oiio.cpp
@@ -30,7 +30,7 @@ OIIOImageLoader::~OIIOImageLoader()
 {
 }
 
-bool OIIOImageLoader::load_metadata(ImageMetaData &metadata)
+bool OIIOImageLoader::load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata)
 {
   /* Perform preliminary checks, with meaningful logging. */
   if (!path_exists(filepath.string())) {
@@ -76,7 +76,7 @@ bool OIIOImageLoader::load_metadata(ImageMetaData &metadata)
   }
 
   /* check if it's half float */
-  if (spec.format == TypeDesc::HALF) {
+  if (spec.format == TypeDesc::HALF && features.has_half_float) {
     is_half = true;
   }
 
diff --git a/intern/cycles/render/image_oiio.h b/intern/cycles/render/image_oiio.h
index a234b968557..a6dbb168b65 100644
---

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list