public CLProgram AddProgram(CLAPI instance, string file, bool throwEx, out CLProgramBuildResult ex) { ex = new CLProgramBuildResult(file, "", new List <CLProgramBuildError>()); if (!File.Exists(file)) { Exception e = new FileNotFoundException("File not found: " + file); if (throwEx) { throw e; } ex.BuildErrors.Add(new CLProgramBuildError(ErrorType.ProgramBuild, e)); } string path = file; Logger.Log(LogType.Log, "Creating CLProgram from file: " + file, 3); CLProgramBuildResult br = CLProgram.TryBuildProgram(instance, path, out CLProgram program); ex.Source = br.Source; if (!br) { if (throwEx) { throw br.GetAggregateException(); } ex.BuildErrors.AddRange(br.BuildErrors); return(null); } loadedPrograms.Add(program); foreach (KeyValuePair <string, CLKernel> containedKernel in program.ContainedKernels) { if (!loadedKernels.ContainsKey(containedKernel.Key)) { Logger.Log(LogType.Log, "Adding Kernel: " + containedKernel.Key, 4); loadedKernels.Add(containedKernel.Key, containedKernel.Value); } else { Logger.Log( LogType.Log, "Kernel with name: " + containedKernel.Key + " is already loaded. Skipping...", 5 ); } } return(program); }
public CLProgram AddProgram( CLAPI instance, string source, string filePath, bool throwEx, out CLProgramBuildResult ex) { ex = new CLProgramBuildResult(filePath, "", new List <CLProgramBuildError>()); CLProgramBuildResult br = CLProgram.TryBuildProgram(instance, source, filePath, out CLProgram program); ex.Source = br.Source; if (!br) { if (throwEx) { throw br.GetAggregateException(); } ex.BuildErrors.AddRange(br.BuildErrors); return(null); } loadedPrograms.Add(program); foreach (KeyValuePair <string, CLKernel> containedKernel in program.ContainedKernels) { if (!loadedKernels.ContainsKey(containedKernel.Key)) { Logger.Log(LogType.Log, "Adding Kernel: " + containedKernel.Key, 4); loadedKernels.Add(containedKernel.Key, containedKernel.Value); } else { Logger.Log( LogType.Log, "Kernel with name: " + containedKernel.Key + " is already loaded. Skipping...", 5 ); } } return(program); }
public static CLProgramBuildResult TryBuildProgram( CLAPI instance, string source, string filePath, out CLProgram program) { CLProgramBuildResult result = new CLProgramBuildResult( filePath, source, new List <CLProgramBuildError>() ); string[] kernelNames = FindKernelNames(source); if (kernelNames.Length == 0) { program = new CLProgram(filePath, new Dictionary <string, CLKernel>(), source); return(result); } Program prgHandle; try { prgHandle = CLAPI.CreateClProgramFromSource(instance, source); } catch (Exception e) { result.BuildErrors.Add(new CLProgramBuildError(ErrorType.ProgramBuild, e)); program = null; return(result); //We can not progress } Dictionary <string, CLKernel> kernels = new Dictionary <string, CLKernel>(); foreach (string kernelName in kernelNames) { try { Kernel k = CLAPI.CreateKernelFromName(prgHandle, kernelName); int kernelNameIndex = source.IndexOf(" " + kernelName + " (", StringComparison.InvariantCulture); kernelNameIndex = kernelNameIndex == -1 ? source.IndexOf(" " + kernelName + "(", StringComparison.InvariantCulture) : kernelNameIndex; KernelParameter[] parameter = KernelParameter.CreateKernelParametersFromKernelCode( source, kernelNameIndex, source.Substring( kernelNameIndex, source.Length - kernelNameIndex ). IndexOf( ')' ) + 1 ); if (k == null) { result.BuildErrors.Add( new CLProgramBuildError( ErrorType.KernelBuild, new OpenClException( $"Header parser completed on {kernelName} but the kernel could not be loaded." ) ) ); kernels.Add(kernelName, new CLKernel(instance, null, kernelName, parameter)); } else { kernels.Add(kernelName, new CLKernel(instance, k, kernelName, parameter)); } } catch (Exception e) { result.BuildErrors.Add(new CLProgramBuildError(ErrorType.KernelBuild, e)); //We can try other kernels } } program = new CLProgram(filePath, kernels, source); program.ClProgramHandle = prgHandle; return(result); }
public CLBuildException(CLProgramBuildResult result) : this(new List <CLProgramBuildResult> { result }) { }