Browse Source

Bugfix: Clarify goffset decision code, and refuse to compile kernels in situations where they won't work

Luke Dashjr 11 years ago
parent
commit
7efe730d7e
1 changed files with 33 additions and 2 deletions
  1. 33 2
      ocl.c

+ 33 - 2
ocl.c

@@ -750,8 +750,39 @@ bool opencl_load_kernel(struct cgpu_info * const cgpu, _clState * const clState,
 	       cgpu->dev_repr, kernel_file,
 	       opencl_get_kernel_interface_name(kernelinfo->interface));
 
-	if (((kernelinfo->interface == KL_POCLBM || kernelinfo->interface == KL_DIABLO || kernelinfo->interface == KL_DIAKGCN || kernelinfo->interface) && clState->vwidth == 1 && clState->hasOpenCL11plus) || kernelinfo->interface == KL_SCRYPT)
-		kernelinfo->goffset = true;
+	{
+		int kernel_goffset_support = 0;  // 0 = none; 1 = optional; 2 = required
+		switch (kernelinfo->interface)
+		{
+			case KL_DIABLO:
+			case KL_DIAKGCN:
+			case KL_POCLBM:
+				kernel_goffset_support = 1;
+				break;
+			case KL_PHATK:
+				kernel_goffset_support = 0;
+				break;
+			case KL_NONE: case OPENCL_KERNEL_INTERFACE_COUNT:
+#ifdef USE_SCRYPT
+			case KL_SCRYPT:
+#endif
+				kernel_goffset_support = 2;
+				break;
+		}
+		const bool device_goffset_support = (clState->hasOpenCL11plus && !clState->is_mesa);
+		if (device_goffset_support)
+		{
+			if (kernel_goffset_support)
+				kernelinfo->goffset = true;
+		}
+		else
+		if (kernel_goffset_support == 2)
+		{
+			// FIXME: Determine this before min_nonce_diff returns positive
+			applog(LOG_ERR, "%s: Need goffset support!", cgpu->dev_repr);
+			return false;
+		}
+	}
 
 	if (data->work_size && data->work_size <= clState->max_work_size)
 		kernelinfo->wsize = data->work_size;