diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 20ea5b179c3..c0c3a280447 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -1695,15 +1695,16 @@ class CyclesPreferences(bpy.types.AddonPreferences): import _cycles compute_device_type = self.get_compute_device_type() - # We need any OptiX devices, used for rendering - for device in _cycles.available_devices(compute_device_type): - device_type = device[1] - if device_type == 'CPU': - continue + if compute_device_type == 'OPTIX': + # We need any OptiX devices, used for rendering + for device in _cycles.available_devices(compute_device_type): + device_type = device[1] + if device_type == 'CPU': + continue - has_device_optixdenoiser_support = device[6] - if has_device_optixdenoiser_support and self.find_existing_device_entry(device).use: - return True + has_device_optixdenoiser_support = device[6] + if has_device_optixdenoiser_support and self.find_existing_device_entry(device).use: + return True return False diff --git a/intern/cycles/integrator/denoiser.cpp b/intern/cycles/integrator/denoiser.cpp index 374bb542f2a..d0241ada8d4 100644 --- a/intern/cycles/integrator/denoiser.cpp +++ b/intern/cycles/integrator/denoiser.cpp @@ -97,7 +97,9 @@ unique_ptr Denoiser::create(Device *denoiser_device, bool is_cpu_denoiser_device = single_denoiser_device->info.type == DEVICE_CPU; if (is_cpu_denoiser_device == false) { #ifdef WITH_OPTIX - if (params.type == DENOISER_OPTIX) { + if (params.type == DENOISER_OPTIX && + OptiXDenoiser::is_device_supported(single_denoiser_device->info)) + { return make_unique(single_denoiser_device, params); } #endif diff --git a/intern/cycles/integrator/denoiser_optix.cpp b/intern/cycles/integrator/denoiser_optix.cpp index 955d370ea25..04692a59767 100644 --- a/intern/cycles/integrator/denoiser_optix.cpp +++ b/intern/cycles/integrator/denoiser_optix.cpp @@ -219,6 +219,14 @@ uint OptiXDenoiser::get_device_type_mask() const return DEVICE_MASK_OPTIX; } +bool OptiXDenoiser::is_device_supported(const DeviceInfo &device) +{ + if (device.type == DEVICE_OPTIX) { + return device.denoisers & DENOISER_OPTIX; + } + return false; +} + bool OptiXDenoiser::denoise_buffer(const DenoiseTask &task) { OptiXDevice *const optix_device = static_cast(denoiser_device_); diff --git a/intern/cycles/integrator/denoiser_optix.h b/intern/cycles/integrator/denoiser_optix.h index 67b4788052c..a61c7905162 100644 --- a/intern/cycles/integrator/denoiser_optix.h +++ b/intern/cycles/integrator/denoiser_optix.h @@ -18,6 +18,8 @@ class OptiXDenoiser : public DenoiserGPU { OptiXDenoiser(Device *denoiser_device, const DenoiseParams ¶ms); ~OptiXDenoiser(); + static bool is_device_supported(const DeviceInfo &device); + protected: virtual uint get_device_type_mask() const override;