29package com.jogamp.opencl;
31import com.jogamp.opencl.util.CLBuildConfiguration;
32import com.jogamp.opencl.util.CLBuildListener;
33import com.jogamp.opencl.util.CLProgramConfiguration;
34import java.io.IOException;
35import java.io.ObjectInputStream;
36import java.io.ObjectOutputStream;
37import java.io.Serializable;
38import java.util.ArrayList;
39import java.util.Arrays;
40import java.util.Collections;
41import java.util.Iterator;
42import java.util.LinkedHashMap;
43import java.util.LinkedHashSet;
62 static final long serialVersionUID = 42;
64 private static final byte[] NO_BINARIES =
new byte[0];
69 private String source;
71 private final Set<String> optionSet =
new LinkedHashSet<String>();
72 private final Set<String> defineSet =
new LinkedHashSet<String>();
80 this(program,
null,
null);
84 this.program = program;
87 this.binariesMap.putAll(map);
124 if(allBinariesAvailable(config)) {
126 config.program = context.createProgram(config.binariesMap);
128 if(config.source !=
null) {
129 config.program = context.createProgram(config.source);
131 throw new IOException(
"Program configuration contained invalid program binaries and no source.", ex);
134 }
else if(config.source !=
null) {
135 config.program = context.createProgram(config.source);
137 throw new IOException(
"Program configuration did not contain program sources or binaries");
142 private static boolean allBinariesAvailable(
final CLProgramBuilder config) {
143 for (
final Map.Entry<
CLDevice,
byte[]> entry : config.binariesMap.entrySet()) {
144 if(Arrays.equals(NO_BINARIES, entry.getValue())) {
148 return config.binariesMap.size() > 0;
152 public void save(
final ObjectOutputStream oos)
throws IOException {
153 if(program !=
null) {
159 oos.writeObject(
this);
165 optionSet.add(option);
171 optionSet.addAll(Arrays.asList(options));
183 for (
final String name : names) {
197 for (
final Map.Entry<String, ? extends Object> define : defines.entrySet()) {
198 final String name = define.getKey();
199 final Object value = define.getValue();
207 if(!binariesMap.containsKey(device)) {
208 binariesMap.put(device, NO_BINARIES);
215 for (
final CLDevice device : devices) {
223 return build(program,
null);
228 return build(program, listener);
233 return build(program,
null);
238 if(program ==
null) {
239 throw new NullPointerException(
"no program has been set");
241 final List<String> setup =
new ArrayList<String>();
242 setup.addAll(optionSet);
243 setup.addAll(defineSet);
245 final CLDevice[] devices = binariesMap.keySet().toArray(
new CLDevice[binariesMap.size()]);
246 return program.
build(listener, options, devices);
276 private void writeObject(
final ObjectOutputStream out)
throws IOException {
277 out.defaultWriteObject();
281 if(!binariesMap.isEmpty()) {
282 final CLDevice device = binariesMap.keySet().iterator().next();
288 out.writeUTF(suffix);
289 out.writeInt(binariesMap.size());
291 for (
final Map.Entry<CLDevice,
byte[]> entry : binariesMap.entrySet()) {
292 final CLDevice device = entry.getKey();
293 final byte[] binaries = entry.getValue();
295 out.writeUTF(device.getName());
296 out.writeInt(binaries.length);
301 private void readObject(
final ObjectInputStream in)
throws IOException, ClassNotFoundException {
302 in.defaultReadObject();
304 final String suffix = in.readUTF();
305 CLPlatform platform =
null;
306 for (
final CLPlatform p : CLPlatform.listCLPlatforms()) {
307 if(suffix.isEmpty() || p.getICDSuffix().equals(suffix)) {
313 this.binariesMap =
new LinkedHashMap<CLDevice, byte[]>();
315 List<CLDevice> devices;
316 if(platform !=
null) {
317 devices =
new ArrayList<CLDevice>(Arrays.asList(platform.listCLDevices()));
319 devices = Collections.emptyList();
322 final int mapSize = in.readInt();
324 for (
int i = 0; i < mapSize; i++) {
325 final String name = in.readUTF();
326 final int length = in.readInt();
327 final byte[] binaries =
new byte[length];
328 in.readFully(binaries);
330 for (
int d = 0; d < devices.size(); d++) {
331 final CLDevice device = devices.get(d);
332 if(device.getName().equals(name)) {
333 binariesMap.put(device, binaries);
344 builder.defineSet.addAll(defineSet);
345 builder.optionSet.addAll(optionSet);
352 builder.defineSet.addAll(defineSet);
353 builder.optionSet.addAll(optionSet);
364 this.program = program;
370 final StringBuilder sb =
new StringBuilder();
371 sb.append(
"CLProgramBuilder");
372 sb.append(
"{options=").append(optionSet);
373 sb.append(
", defines=").append(defineSet);
374 sb.append(
", devices=").append(binariesMap);
376 return sb.toString();
381 if (
this == o)
return true;
382 if (o ==
null || getClass() != o.getClass())
return false;
386 if (source !=
null ? !source.equals(that.source) : that.source !=
null)
return false;
387 if (defineSet !=
null ? !defineSet.equals(that.defineSet) : that.defineSet !=
null)
return false;
388 if (optionSet !=
null ? !optionSet.equals(that.optionSet) : that.optionSet !=
null)
return false;
390 if(binariesMap !=
null && that.binariesMap !=
null) {
391 if(binariesMap.size() != that.binariesMap.size()) {
394 final Iterator<CLDevice> iterator0 = binariesMap.keySet().iterator();
395 final Iterator<CLDevice> iterator1 = that.binariesMap.keySet().iterator();
396 for (
int i = 0; i < binariesMap.size(); i++) {
397 final CLDevice device0 = iterator0.next();
398 final CLDevice device1 = iterator1.next();
399 if(!device0.
equals(device1) || !Arrays.equals(binariesMap.get(device0), that.binariesMap.get(device1)))
402 }
else if(binariesMap !=
null || that.binariesMap !=
null) {
411 int result = optionSet !=
null ? optionSet.hashCode() : 0;
412 result = 31 * result + (defineSet !=
null ? defineSet.hashCode() : 0);
413 result = 31 * result + (binariesMap !=
null ? binariesMap.hashCode() : 0);
CLContext is responsible for managing objects such as command-queues, memory, program and kernel obje...
This object represents an OpenCL device.
boolean equals(final Object obj)
CLPlatform getPlatform()
Returns the platform for this OpenCL object.
boolean isICDAvailable()
Returns isExtensionAvailable("cl_khr_icd").
CLException thrown on CL.CL_INVALID_BINARY errors.
Main Exception type for runtime OpenCL errors and failed function calls (e.g.
CLProgramBuilder is a helper for building programs with more complex configurations or building multi...
CLProgram build(final CLProgram program)
Builds or rebuilds the program.
CLProgram build(final CLBuildListener listener)
Builds or rebuilds a program.
static CLBuildConfiguration createConfiguration()
Creates a new CLBuildConfiguration.
boolean equals(final Object o)
CLProgramBuilder withDefine(final String name, final Object value)
Adds the definition to the build configuration.
CLProgramBuilder withOption(final String option)
Adds the compiler option to the build configuration.
CLProgramConfiguration resetDevices()
Resets this builder's device list.
CLProgramBuilder reset()
Resets this builder's configuration like options, devices and definitions.
static CLProgramConfiguration loadConfiguration(final ObjectInputStream ois, final CLContext context)
Loads a CLProgramConfiguration containing a CLProgram.
CLProgramBuilder forDevices(final CLDevice... devices)
Adds the devices as build target.
CLProgramBuilder clone()
Clones this configuration.
CLProgramConfiguration resetDefines()
Resets this builder's macro definitions.
CLProgramBuilder withDefines(final Map< String, ? extends Object > defines)
CLProgramBuilder setProgram(final CLProgram program)
Sets the program which should be build.
CLProgramConfiguration resetOptions()
Resets this builder's configuration options.
CLProgramBuilder forDevice(final CLDevice device)
Adds the device as build target.
CLProgram getProgram()
Returns the program.
CLProgram build()
Builds or rebuilds a program.
static CLProgramConfiguration createConfiguration(final CLProgram program)
Creates a new CLProgramConfiguration for this program.
CLProgramBuilder withDefine(final String name)
Adds the definition to the build configuration.
CLProgram build(final CLProgram program, final CLBuildListener listener)
Builds or rebuilds the program.
CLProgramBuilder withDefines(final String... names)
Adds the definitions to the build configuration.
void save(final ObjectOutputStream oos)
Saves this configuration to the ObjectOutputStream.
static CLBuildConfiguration loadConfiguration(final ObjectInputStream ois)
Loads a CLBuildConfiguration.
CLProgramBuilder withOptions(final String... options)
Adds the compiler options to the build configuration.
CLProgramBuilder asBuildConfiguration()
Returns a new instance of of this configuration without a CLProgram, program binaries or sources asso...
Represents a OpenCL program executed on one or more CLDevices.
static String define(final String name)
Utility method for defining macros as build options (Returns "-D name").
boolean isExecutable()
Returns true if the build status 'BUILD_SUCCESS' for at least one device of this program exists.
Map< CLDevice, byte[]> getBinaries()
Returns the binaries for this program in an ordered Map containing the device as key and the program ...
String getSource()
Returns the source code of this program.
CLProgram build()
Builds this program for all devices associated with the context.
static String optionsOf(final String... options)
Utility method which builds a properly seperated option string.
Configures the mapping process.
Configuration representing everything needed to build an OpenCL program.
A callback an application can register to be called when the program executable has been built (succe...
Configuration representing everything needed to build an OpenCL program (program included).