Commit: 1f0998baa796f4b25fd745536a8ad71356fb8048
Author: Hristo Gueorguiev
Date:   Thu Jun 8 05:08:52 2017 -0400
Branches: master
https://developer.blender.org/rB1f0998baa796f4b25fd745536a8ad71356fb8048

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

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

M       intern/cycles/device/opencl/opencl.h
M       intern/cycles/device/opencl/opencl_util.cpp

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

diff --git a/intern/cycles/device/opencl/opencl.h 
b/intern/cycles/device/opencl/opencl.h
index 52851061d7b..399fae9b42e 100644
--- a/intern/cycles/device/opencl/opencl.h
+++ b/intern/cycles/device/opencl/opencl.h
@@ -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.
diff --git a/intern/cycles/device/opencl/opencl_util.cpp 
b/intern/cycles/device/opencl/opencl_util.cpp
index d27aa05c312..4c6de60e8aa 100644
--- a/intern/cycles/device/opencl/opencl_util.cpp
+++ b/intern/cycles/device/opencl/opencl_util.cpp
@@ -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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to