Do not error and exit if an OpenCL platform has no devices, just print a warning...
authorjsteube <jens.steube@gmail.com>
Mon, 11 Jul 2016 15:15:57 +0000 (17:15 +0200)
committerjsteube <jens.steube@gmail.com>
Mon, 11 Jul 2016 15:15:57 +0000 (17:15 +0200)
docs/changes.txt
src/hashcat.c

index 086efa7..666b5eb 100644 (file)
@@ -14,6 +14,7 @@
 - Replace LINUX macro with compiler predefined macro __linux__
 - Allow the use of enc_id == 0 in hash-mode 10600 and 10700 as it takes no part in the actual computation
 - Get rid of exit() calls in OpenCL wrapper library with the goal to have a better control which error can be ignored under special circumstances
+- Do not error and exit if an OpenCL platform has no devices, just print a warning and continue with the next platform
 
 ##
 ## Bugs
index 492e52d..027dd02 100644 (file)
@@ -14095,9 +14095,13 @@ int main (int argc, char **argv)
 
         if (CL_err != CL_SUCCESS)
         {
-          log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err));
+          //log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err));
 
-          return -1;
+          //return -1;
+
+          // Silently ignore at this point, it will be reused later and create a note for the user at that point
+
+          continue;
         }
 
         for (uint platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++)
@@ -14161,15 +14165,6 @@ int main (int argc, char **argv)
 
       cl_platform_id platform = platforms[platform_id];
 
-      CL_err = hc_clGetDeviceIDs (data.ocl, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt);
-
-      if (CL_err != CL_SUCCESS)
-      {
-        log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err));
-
-        return -1;
-      }
-
       char platform_vendor[INFOSZ] = { 0 };
 
       CL_err = hc_clGetPlatformInfo (data.ocl, platform, CL_PLATFORM_VENDOR, sizeof (platform_vendor), platform_vendor, NULL);
@@ -14224,7 +14219,18 @@ int main (int argc, char **argv)
         platform_vendor_id = VENDOR_ID_GENERIC;
       }
 
-      const uint platform_skipped = ((opencl_platforms_filter & (1 << platform_id)) == 0);
+      uint platform_skipped = ((opencl_platforms_filter & (1 << platform_id)) == 0);
+
+      CL_err = hc_clGetDeviceIDs (data.ocl, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt);
+
+      if (CL_err != CL_SUCCESS)
+      {
+        //log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err));
+
+        //return -1;
+
+        platform_skipped = 2;
+      }
 
       if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0))
       {
@@ -14240,11 +14246,16 @@ int main (int argc, char **argv)
 
             log_info (line);
           }
-          else
+          else if (platform_skipped == 1)
           {
             log_info ("OpenCL Platform #%u: %s, skipped", platform_id + 1, platform_vendor);
             log_info ("");
           }
+          else if (platform_skipped == 2)
+          {
+            log_info ("OpenCL Platform #%u: %s, skipped! No OpenCL compatible devices found", platform_id + 1, platform_vendor);
+            log_info ("");
+          }
         }
       }