4package com.jogamp.opencl.util;
6import com.jogamp.opencl.CLContext;
7import com.jogamp.opencl.CLDevice;
8import com.jogamp.opencl.CLPlatform;
9import com.jogamp.opencl.CLResource;
10import java.util.ArrayList;
11import java.util.Collection;
12import java.util.Collections;
13import java.util.HashMap;
17import static java.util.Arrays.*;
18import static com.jogamp.opencl.CLDevice.Type.*;
27 private final List<CLContext> contexts;
28 private boolean released;
31 contexts =
new ArrayList<CLContext>();
38 return create(platforms, ALL);
44 @SuppressWarnings(
"unchecked")
52 @SuppressWarnings(
"unchecked")
55 if(platforms ==
null) {
56 throw new NullPointerException(
"platform list was null");
57 }
else if(platforms.length == 0) {
58 throw new IllegalArgumentException(
"platform list was empty");
61 final List<CLDevice> devices =
new ArrayList<CLDevice>();
63 devices.addAll(asList(platform.listCLDevices(filters)));
74 if(devices.isEmpty()) {
75 throw new IllegalArgumentException(
"device list was empty");
78 final Map<CLPlatform, List<CLDevice>> platformDevicesMap = filterPlatformConflicts(devices);
82 for (
final Map.Entry<
CLPlatform, List<CLDevice>> entry : platformDevicesMap.entrySet()) {
83 final List<CLDevice> list = entry.getValue();
87 mc.contexts.add(context);
99 mc.contexts.addAll(asList(contexts));
107 private static Map<CLPlatform, List<CLDevice>> filterPlatformConflicts(
final Collection<CLDevice> devices) {
111 final Map<CLPlatform, List<CLDevice>> filtered =
new HashMap<CLPlatform, List<CLDevice>>();
112 final Map<String, CLPlatform> used =
new HashMap<String, CLPlatform>();
114 for (
final CLDevice device : devices) {
116 final String name = device.getName();
118 final CLPlatform platform = device.getPlatform();
119 final CLPlatform usedPlatform = used.get(name);
121 if(usedPlatform ==
null || platform.
equals(usedPlatform)) {
122 if(!filtered.containsKey(platform)) {
123 filtered.put(platform,
new ArrayList<CLDevice>());
125 filtered.get(platform).add(device);
126 used.put(name, platform);
141 throw new RuntimeException(getClass().getSimpleName()+
" already released");
144 for (
final CLContext context : contexts) {
151 return Collections.unmodifiableList(contexts);
158 final List<CLDevice> devices =
new ArrayList<CLDevice>();
159 for (
final CLContext context : contexts) {
160 devices.addAll(asList(context.getDevices()));
171 return getClass().getSimpleName()+
" [" + contexts.size()+
" contexts, "
CLContext is responsible for managing objects such as command-queues, memory, program and kernel obje...
static CLContext create()
Creates a context on all available devices (CL_DEVICE_TYPE_ALL).
This object represents an OpenCL device.
static Filter< CLDevice > type(final CLDevice.Type... types)
Accepts all devices of the given type.
Utility for organizing multiple CLContexts.
static CLMultiContext create(final CLPlatform... platforms)
Creates a multi context with all devices of the specified platforms.
static CLMultiContext create(final Collection< CLDevice > devices)
Creates a multi context with the specified devices.
List< CLContext > getContexts()
boolean isReleased()
Returns true if release() has been called.
static CLMultiContext wrap(final CLContext... contexts)
Creates a multi context with specified contexts.
List< CLDevice > getDevices()
Returns a list containing all devices used in this multi context.
void release()
Releases all contexts.
Enumeration for the type of a device.
Releasable OpenCL resource.