Cycles: Blacklist unsupported OpenCL devices

Due to various driver issues with AMD GCN 1 cards we can no longer support
these GPUs. This patch makes them unavailable to select for Cycles rendering.

GCN cards 2 and higher are still supported. Please use the most recent
drivers available to ensure proper functionality.

See here for a list to check which GPUs are supported:
https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units
This commit is contained in:
Hristo Gueorguiev 2017-06-08 05:08:52 -04:00 committed by Mai Lavelle
parent c73206acc5
commit 1f0998baa7
Notes: blender-bot 2023-02-14 07:39:46 +01:00
Referenced by issue #52095, Blender 2.78.5/2.79 - Cannot switch to OpenCL render.
2 changed files with 56 additions and 0 deletions

View File

@ -130,6 +130,11 @@ public:
cl_int* error = NULL);
static cl_device_type get_device_type(cl_device_id device_id);
static bool get_driver_version(cl_device_id device_id,
int *major,
int *minor,
cl_int* error = NULL);
static int mem_address_alignment(cl_device_id device_id);
/* Get somewhat more readable device name.

View File

@ -608,6 +608,14 @@ bool OpenCLInfo::device_supported(const string& platform_name,
if(!get_device_name(device_id, &device_name)) {
return false;
}
int driver_major = 0;
int driver_minor = 0;
if(!get_driver_version(device_id, &driver_major, &driver_minor)) {
return false;
}
VLOG(3) << "OpenCL driver version " << driver_major << "." << driver_minor;
/* It is possible tyo have Iris GPU on AMD/Apple OpenCL framework
* (aka, it will not be on Intel framework). This isn't supported
* and needs an explicit blacklist.
@ -618,6 +626,21 @@ bool OpenCLInfo::device_supported(const string& platform_name,
if(platform_name == "AMD Accelerated Parallel Processing" &&
device_type == CL_DEVICE_TYPE_GPU)
{
if(driver_major < 2348) {
VLOG(1) << "AMD driver version " << driver_major << "." << driver_minor << " not supported";
return false;
}
const char *blacklist[] = {
/* GCN 1 */
"Tahiti", "Pitcairn", "Capeverde", "Oland",
NULL
};
for (int i = 0; blacklist[i] != NULL; i++) {
if(device_name == blacklist[i]) {
VLOG(1) << "AMD device " << device_name << " not supported";
return false;
}
}
return true;
}
if(platform_name == "Apple" && device_type == CL_DEVICE_TYPE_GPU) {
@ -1073,6 +1096,34 @@ string OpenCLInfo::get_readable_device_name(cl_device_id device_id)
return get_device_name(device_id);
}
bool OpenCLInfo::get_driver_version(cl_device_id device_id,
int *major,
int *minor,
cl_int* error)
{
char buffer[1024];
cl_int err;
if((err = clGetDeviceInfo(device_id,
CL_DRIVER_VERSION,
sizeof(buffer),
&buffer,
NULL)) != CL_SUCCESS)
{
if(error != NULL) {
*error = err;
}
return false;
}
if(error != NULL) {
*error = CL_SUCCESS;
}
if(sscanf(buffer, "%d.%d", major, minor) < 2) {
VLOG(1) << string_printf("OpenCL: failed to parse driver version string (%s).", buffer);
return false;
}
return true;
}
int OpenCLInfo::mem_address_alignment(cl_device_id device_id)
{
int base_align_bits;