forked from bartvdbraak/blender
Cycles: require Experimental to be set to enable CUDA on cards with shader model
lower than 1.3, since we're not officially supporting these. We're already not providing CUDA binaries for these, so better make it clear when compiling from source too.
This commit is contained in:
parent
94bc2b0cff
commit
9e01abf777
@ -257,7 +257,7 @@ SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background
|
|||||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||||
|
|
||||||
/* feature set */
|
/* feature set */
|
||||||
bool experimental = (RNA_enum_get(&cscene, "feature_set") != 0);
|
params.experimental = (RNA_enum_get(&cscene, "feature_set") != 0);
|
||||||
|
|
||||||
/* device type */
|
/* device type */
|
||||||
params.device_type = DEVICE_CPU;
|
params.device_type = DEVICE_CPU;
|
||||||
@ -266,14 +266,14 @@ SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background
|
|||||||
vector<DeviceType> types = Device::available_types();
|
vector<DeviceType> types = Device::available_types();
|
||||||
DeviceType dtype;
|
DeviceType dtype;
|
||||||
|
|
||||||
if(!experimental || RNA_enum_get(&cscene, "gpu_type") == 0)
|
if(!params.experimental || RNA_enum_get(&cscene, "gpu_type") == 0)
|
||||||
dtype = DEVICE_CUDA;
|
dtype = DEVICE_CUDA;
|
||||||
else
|
else
|
||||||
dtype = DEVICE_OPENCL;
|
dtype = DEVICE_OPENCL;
|
||||||
|
|
||||||
if(device_type_available(types, dtype))
|
if(device_type_available(types, dtype))
|
||||||
params.device_type = dtype;
|
params.device_type = dtype;
|
||||||
else if(experimental && device_type_available(types, DEVICE_OPENCL))
|
else if(params.experimental && device_type_available(types, DEVICE_OPENCL))
|
||||||
params.device_type = DEVICE_OPENCL;
|
params.device_type = DEVICE_OPENCL;
|
||||||
else if(device_type_available(types, DEVICE_CUDA))
|
else if(device_type_available(types, DEVICE_CUDA))
|
||||||
params.device_type = DEVICE_CUDA;
|
params.device_type = DEVICE_CUDA;
|
||||||
|
@ -112,7 +112,7 @@ public:
|
|||||||
virtual void *osl_memory() { return NULL; }
|
virtual void *osl_memory() { return NULL; }
|
||||||
|
|
||||||
/* load/compile kernels, must be called before adding tasks */
|
/* load/compile kernels, must be called before adding tasks */
|
||||||
virtual bool load_kernels() { return true; }
|
virtual bool load_kernels(bool experimental) { return true; }
|
||||||
|
|
||||||
/* tasks */
|
/* tasks */
|
||||||
virtual void task_add(DeviceTask& task) = 0;
|
virtual void task_add(DeviceTask& task) = 0;
|
||||||
|
@ -214,6 +214,21 @@ public:
|
|||||||
return string("CUDA ") + deviceName;
|
return string("CUDA ") + deviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool support_device(bool experimental)
|
||||||
|
{
|
||||||
|
if(!experimental) {
|
||||||
|
int major, minor;
|
||||||
|
cuDeviceComputeCapability(&major, &minor, cuDevId);
|
||||||
|
|
||||||
|
if(major <= 1 && minor <= 2) {
|
||||||
|
cuda_error(string_printf("CUDA device supported only with shader model 1.3 or up, found %d.%d.", major, minor));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
string compile_kernel()
|
string compile_kernel()
|
||||||
{
|
{
|
||||||
/* compute cubin name */
|
/* compute cubin name */
|
||||||
@ -236,11 +251,11 @@ public:
|
|||||||
if(path_exists(cubin))
|
if(path_exists(cubin))
|
||||||
return cubin;
|
return cubin;
|
||||||
|
|
||||||
#ifdef WITH_CUDA_BINARIES
|
#if defined(WITH_CUDA_BINARIES) && defined(_WIN32)
|
||||||
if(major <= 1 && minor <= 2)
|
if(major <= 1 && minor <= 2)
|
||||||
cuda_error(string_printf("CUDA device supported only with shader model 1.3 or up, found %d.%d.", major, minor));
|
cuda_error(string_printf("CUDA device supported only with shader model 1.3 or up, found %d.%d.", major, minor));
|
||||||
else
|
else
|
||||||
cuda_error("CUDA binary kernel for this graphics card not found.");
|
cuda_error("CUDA binary kernel for this graphics card shader model (%d.%d) not found.", major, minor);
|
||||||
return "";
|
return "";
|
||||||
#else
|
#else
|
||||||
/* if not, find CUDA compiler */
|
/* if not, find CUDA compiler */
|
||||||
@ -283,12 +298,15 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool load_kernels()
|
bool load_kernels(bool experimental)
|
||||||
{
|
{
|
||||||
/* check if cuda init succeeded */
|
/* check if cuda init succeeded */
|
||||||
if(cuContext == 0)
|
if(cuContext == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if(!support_device(experimental))
|
||||||
|
return false;
|
||||||
|
|
||||||
/* get kernel */
|
/* get kernel */
|
||||||
string cubin = compile_kernel();
|
string cubin = compile_kernel();
|
||||||
|
|
||||||
|
@ -132,10 +132,10 @@ public:
|
|||||||
return desc.str();
|
return desc.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool load_kernels()
|
bool load_kernels(bool experimental)
|
||||||
{
|
{
|
||||||
foreach(SubDevice& sub, devices)
|
foreach(SubDevice& sub, devices)
|
||||||
if(!sub.device->load_kernels())
|
if(!sub.device->load_kernels(experimental))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -365,7 +365,7 @@ public:
|
|||||||
return md5.get_hex();
|
return md5.get_hex();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool load_kernels()
|
bool load_kernels(bool experimental)
|
||||||
{
|
{
|
||||||
/* verify if device was initialized */
|
/* verify if device was initialized */
|
||||||
if(!device_initialized) {
|
if(!device_initialized) {
|
||||||
|
@ -410,7 +410,7 @@ void Session::run()
|
|||||||
/* load kernels */
|
/* load kernels */
|
||||||
progress.set_status("Loading render kernels (may take a few minutes the first time)");
|
progress.set_status("Loading render kernels (may take a few minutes the first time)");
|
||||||
|
|
||||||
if(!device->load_kernels()) {
|
if(!device->load_kernels(params.experimental)) {
|
||||||
string message = device->error_message();
|
string message = device->error_message();
|
||||||
if(message == "")
|
if(message == "")
|
||||||
message = "Failed loading render kernel, see console for errors";
|
message = "Failed loading render kernel, see console for errors";
|
||||||
|
@ -43,6 +43,7 @@ public:
|
|||||||
string output_path;
|
string output_path;
|
||||||
|
|
||||||
bool progressive;
|
bool progressive;
|
||||||
|
bool experimental;
|
||||||
int samples;
|
int samples;
|
||||||
int tile_size;
|
int tile_size;
|
||||||
int min_size;
|
int min_size;
|
||||||
@ -59,6 +60,7 @@ public:
|
|||||||
output_path = "";
|
output_path = "";
|
||||||
|
|
||||||
progressive = false;
|
progressive = false;
|
||||||
|
experimental = false;
|
||||||
samples = INT_MAX;
|
samples = INT_MAX;
|
||||||
tile_size = 64;
|
tile_size = 64;
|
||||||
min_size = 64;
|
min_size = 64;
|
||||||
@ -75,6 +77,7 @@ public:
|
|||||||
&& output_path == params.output_path
|
&& output_path == params.output_path
|
||||||
/* && samples == params.samples */
|
/* && samples == params.samples */
|
||||||
&& progressive == params.progressive
|
&& progressive == params.progressive
|
||||||
|
&& experimental == params.experimental
|
||||||
&& tile_size == params.tile_size
|
&& tile_size == params.tile_size
|
||||||
&& min_size == params.min_size
|
&& min_size == params.min_size
|
||||||
&& threads == params.threads
|
&& threads == params.threads
|
||||||
|
Loading…
Reference in New Issue
Block a user