parent
53ebaba1e2
commit
e02eec0abd
@ -0,0 +1,60 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl; |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Sebastian Weiss |
||||||
|
*/ |
||||||
|
public interface Platform { |
||||||
|
|
||||||
|
List<? extends Device> getDevices(); |
||||||
|
|
||||||
|
String getProfile(); |
||||||
|
boolean isFullProfile(); |
||||||
|
boolean isEmbeddedProfile(); |
||||||
|
|
||||||
|
String getVersion(); |
||||||
|
int getVersionMajor(); |
||||||
|
int getVersionMinor(); |
||||||
|
|
||||||
|
String getName(); |
||||||
|
String getVendor(); |
||||||
|
boolean hasOpenGLInterop(); |
||||||
|
boolean hasExtension(String extension); |
||||||
|
Collection<? extends String> getExtensions(); |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl; |
||||||
|
|
||||||
|
import com.jme3.system.AppSettings; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* This SPI is called on startup to specify which platform and which devices |
||||||
|
* are used for context creation. |
||||||
|
* @author Sebastian Weiss |
||||||
|
* @see AppSettings#setOpenCLPlatformChooser(java.lang.Class) |
||||||
|
*/ |
||||||
|
public interface PlatformChooser { |
||||||
|
|
||||||
|
/** |
||||||
|
* Chooses one or more devices for the opencl context. |
||||||
|
* All returned devices must belong to the same platform. |
||||||
|
* If the returned list is empty, no context will be created. |
||||||
|
* @param platforms the available platforms |
||||||
|
* @return the list of devices |
||||||
|
*/ |
||||||
|
List<? extends Device> chooseDevices(List<? extends Platform> platforms); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,136 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl.lwjgl; |
||||||
|
|
||||||
|
import com.jme3.opencl.*; |
||||||
|
import com.jme3.scene.VertexBuffer; |
||||||
|
import com.jme3.scene.mesh.IndexBuffer; |
||||||
|
import java.nio.ByteBuffer; |
||||||
|
import java.util.List; |
||||||
|
import org.lwjgl.opencl.CLContext; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Sebastian Weiss |
||||||
|
*/ |
||||||
|
public class LwjglContext implements Context { |
||||||
|
private final CLContext context; |
||||||
|
|
||||||
|
public LwjglContext(CLContext context) { |
||||||
|
this.context = context; |
||||||
|
} |
||||||
|
|
||||||
|
public CLContext getContext() { |
||||||
|
return context; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<? extends Device> getDevices() { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public CommandQueue createQueue() { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public CommandQueue createQueue(Device device) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Buffer createBuffer(int size, MemoryAccess access) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Buffer createBuffer(int size) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Buffer useHostBuffer(ByteBuffer data, int size, MemoryAccess access) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Buffer useHostBuffer(ByteBuffer data, int size) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Image createImage(MemoryAccess access, ImageFormat format, ImageDescriptor descr, ByteBuffer hostPtr) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Buffer bindVertexBuffer(VertexBuffer vb) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Buffer bindIndexBuffer(IndexBuffer ib) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Image bindImage(com.jme3.texture.Image image) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Program createProgramFromSourceCode(String sourceCode) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Program createProgramFromSourceFilesWithInclude(String include, String... resources) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Program createProgramFormSourcesWithInclude(String include, List<String> resources) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Program createProgramFromSources(String... resources) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Program createProgramFromSources(List<String> resources) { |
||||||
|
throw new UnsupportedOperationException("Not supported yet."); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,293 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl.lwjgl; |
||||||
|
|
||||||
|
import com.jme3.opencl.Device; |
||||||
|
import com.jme3.opencl.Platform; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Collection; |
||||||
|
import org.lwjgl.opencl.CL10; |
||||||
|
import org.lwjgl.opencl.CL11; |
||||||
|
import org.lwjgl.opencl.CLDevice; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Sebastian Weiss |
||||||
|
*/ |
||||||
|
public final class LwjglDevice implements Device { |
||||||
|
|
||||||
|
final CLDevice device; |
||||||
|
final LwjglPlatform platform; |
||||||
|
|
||||||
|
public LwjglDevice(CLDevice device, LwjglPlatform platform) { |
||||||
|
this.device = device; |
||||||
|
this.platform = platform; |
||||||
|
} |
||||||
|
|
||||||
|
public CLDevice getDevice() { |
||||||
|
return device; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public LwjglPlatform getPlatform() { |
||||||
|
return platform; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public DeviceType getDeviceType() { |
||||||
|
int type = device.getInfoInt(CL10.CL_DEVICE_TYPE); |
||||||
|
switch (type) { |
||||||
|
case CL10.CL_DEVICE_TYPE_ACCELERATOR: return DeviceType.ACCELEARTOR; |
||||||
|
case CL10.CL_DEVICE_TYPE_CPU: return DeviceType.CPU; |
||||||
|
case CL10.CL_DEVICE_TYPE_GPU: return DeviceType.GPU; |
||||||
|
default: return DeviceType.DEFAULT; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getVendorId() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_VENDOR_ID); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isAvailable() { |
||||||
|
return device.getInfoBoolean(CL10.CL_DEVICE_AVAILABLE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasCompiler() { |
||||||
|
return device.getInfoBoolean(CL10.CL_DEVICE_COMPILER_AVAILABLE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasDouble() { |
||||||
|
return hasExtension("cl_khr_fp64"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasHalfFloat() { |
||||||
|
return hasExtension("cl_khr_fp16"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasErrorCorrectingMemory() { |
||||||
|
return device.getInfoBoolean(CL10.CL_DEVICE_ERROR_CORRECTION_SUPPORT); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasUnifiedMemory() { |
||||||
|
return device.getInfoBoolean(CL11.CL_DEVICE_HOST_UNIFIED_MEMORY); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasImageSupport() { |
||||||
|
return device.getInfoBoolean(CL10.CL_DEVICE_IMAGE_SUPPORT); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasWritableImage3D() { |
||||||
|
return hasExtension("cl_khr_3d_image_writes"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasOpenGLInterop() { |
||||||
|
return hasExtension("cl_khr_gl_sharing"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasExtension(String extension) { |
||||||
|
return getExtensions().contains(extension); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Collection<? extends String> getExtensions() { |
||||||
|
return Arrays.asList(device.getInfoString(CL10.CL_DEVICE_EXTENSIONS).split(" ")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getComputeUnits() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_MAX_COMPUTE_UNITS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getClockFrequency() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_MAX_CLOCK_FREQUENCY); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getAddressBits() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_ADDRESS_BITS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isLittleEndian() { |
||||||
|
return device.getInfoBoolean(CL10.CL_DEVICE_ENDIAN_LITTLE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long getMaximumWorkItemDimensions() { |
||||||
|
return device.getInfoSize(CL10.CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long[] getMaximumWorkItemSizes() { |
||||||
|
return device.getInfoSizeArray(CL10.CL_DEVICE_MAX_WORK_ITEM_SIZES); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long getMaxiumWorkItemsPerGroup() { |
||||||
|
return device.getInfoSize(CL10.CL_DEVICE_MAX_WORK_GROUP_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getMaximumSamplers() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_MAX_SAMPLERS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getMaximumReadImages() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_MAX_READ_IMAGE_ARGS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getMaximumWriteImages() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_MAX_WRITE_IMAGE_ARGS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long[] getMaximumImage2DSize() { |
||||||
|
return new long[] { |
||||||
|
device.getInfoSize(CL10.CL_DEVICE_IMAGE2D_MAX_WIDTH), |
||||||
|
device.getInfoSize(CL10.CL_DEVICE_IMAGE2D_MAX_HEIGHT) |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long[] getMaximumImage3DSize() { |
||||||
|
return new long[] { |
||||||
|
device.getInfoSize(CL10.CL_DEVICE_IMAGE3D_MAX_WIDTH), |
||||||
|
device.getInfoSize(CL10.CL_DEVICE_IMAGE3D_MAX_HEIGHT), |
||||||
|
device.getInfoSize(CL10.CL_DEVICE_IMAGE3D_MAX_DEPTH) |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long getMaximumAllocationSize() { |
||||||
|
return device.getInfoLong(CL10.CL_DEVICE_MAX_MEM_ALLOC_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long getGlobalMemorySize() { |
||||||
|
return device.getInfoLong(CL10.CL_DEVICE_GLOBAL_MEM_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long getLocalMemorySize() { |
||||||
|
return device.getInfoLong(CL10.CL_DEVICE_LOCAL_MEM_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public long getMaximumConstantBufferSize() { |
||||||
|
return device.getInfoLong(CL10.CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getMaximumConstantArguments() { |
||||||
|
return device.getInfoInt(CL10.CL_DEVICE_MAX_CONSTANT_ARGS); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getProfile() { |
||||||
|
return device.getInfoString(CL10.CL_DEVICE_PROFILE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getVersion() { |
||||||
|
return device.getInfoString(CL10.CL_DEVICE_VERSION); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getVersionMajor() { |
||||||
|
return Utils.getMajorVersion(getVersion(), "OpenCL "); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getVersionMinor() { |
||||||
|
return Utils.getMinorVersion(getVersion(), "OpenCL "); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getCompilerVersion() { |
||||||
|
return device.getInfoString(CL11.CL_DEVICE_OPENCL_C_VERSION); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getCompilerVersionMajor() { |
||||||
|
return Utils.getMajorVersion(getCompilerVersion(), "OpenCL C "); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getCompilerVersionMinor() { |
||||||
|
return Utils.getMinorVersion(getCompilerVersion(), "OpenCL C "); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getDriverVersion() { |
||||||
|
return device.getInfoString(CL10.CL_DRIVER_VERSION); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getDriverVersionMajor() { |
||||||
|
return Utils.getMajorVersion(getDriverVersion(), ""); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getDriverVersionMinor() { |
||||||
|
return Utils.getMinorVersion(getDriverVersion(), ""); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getName() { |
||||||
|
return device.getInfoString(CL10.CL_DEVICE_NAME); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getVendor() { |
||||||
|
return device.getInfoString(CL10.CL_DEVICE_VENDOR); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getName(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,127 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl.lwjgl; |
||||||
|
|
||||||
|
import com.jme3.opencl.Device; |
||||||
|
import com.jme3.opencl.Platform; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Collection; |
||||||
|
import java.util.List; |
||||||
|
import org.lwjgl.opencl.CL10; |
||||||
|
import org.lwjgl.opencl.CLDevice; |
||||||
|
import org.lwjgl.opencl.CLPlatform; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Sebastian Weiss |
||||||
|
*/ |
||||||
|
public final class LwjglPlatform implements Platform { |
||||||
|
|
||||||
|
final CLPlatform platform; |
||||||
|
List<LwjglDevice> devices; |
||||||
|
|
||||||
|
public LwjglPlatform(CLPlatform platform) { |
||||||
|
this.platform = platform; |
||||||
|
} |
||||||
|
|
||||||
|
public CLPlatform getPlatform() { |
||||||
|
return platform; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<LwjglDevice> getDevices() { |
||||||
|
if (devices == null) { |
||||||
|
devices = new ArrayList<>(); |
||||||
|
for (CLDevice d : platform.getDevices(CL10.CL_DEVICE_TYPE_ALL)) { |
||||||
|
devices.add(new LwjglDevice(d, this)); |
||||||
|
} |
||||||
|
} |
||||||
|
return devices; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getProfile() { |
||||||
|
return platform.getInfoString(CL10.CL_PLATFORM_PROFILE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isFullProfile() { |
||||||
|
return getProfile().contains("FULL_PROFILE"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isEmbeddedProfile() { |
||||||
|
return getProfile().contains("EMBEDDED_PROFILE"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getVersion() { |
||||||
|
return platform.getInfoString(CL10.CL_PLATFORM_VERSION); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getVersionMajor() { |
||||||
|
return Utils.getMajorVersion(getVersion(), "OpenCL "); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getVersionMinor() { |
||||||
|
return Utils.getMinorVersion(getVersion(), "OpenCL "); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getName() { |
||||||
|
return platform.getInfoString(CL10.CL_PLATFORM_NAME); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getVendor() { |
||||||
|
return platform.getInfoString(CL10.CL_PLATFORM_VENDOR); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasExtension(String extension) { |
||||||
|
return getExtensions().contains(extension); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean hasOpenGLInterop() { |
||||||
|
return hasExtension("cl_khr_gl_sharing"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Collection<? extends String> getExtensions() { |
||||||
|
return Arrays.asList(platform.getInfoString(CL10.CL_PLATFORM_EXTENSIONS).split(" ")); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,92 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl.lwjgl; |
||||||
|
|
||||||
|
import com.jme3.opencl.Device; |
||||||
|
import com.jme3.opencl.Platform; |
||||||
|
import com.jme3.opencl.PlatformChooser; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Sebastian Weiss |
||||||
|
*/ |
||||||
|
public class PlatformChooserImpl implements PlatformChooser { |
||||||
|
private static final Logger LOG = Logger.getLogger(PlatformChooserImpl.class.getName()); |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<? extends Device> chooseDevices(List<? extends Platform> platforms) { |
||||||
|
ArrayList<Device> result = new ArrayList<Device>(); |
||||||
|
for (Platform p : platforms) { |
||||||
|
if (!p.hasOpenGLInterop()) { |
||||||
|
continue; //must support interop
|
||||||
|
} |
||||||
|
for (Device d : p.getDevices()) { |
||||||
|
if (d.hasOpenGLInterop() && d.getDeviceType()==Device.DeviceType.GPU) { |
||||||
|
result.add(d); //GPU prefered
|
||||||
|
} |
||||||
|
} |
||||||
|
if (!result.isEmpty()) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
||||||
|
//no GPU devices found, try all
|
||||||
|
for (Platform p : platforms) { |
||||||
|
if (!p.hasOpenGLInterop()) { |
||||||
|
continue; //must support interop
|
||||||
|
} |
||||||
|
for (Device d : p.getDevices()) { |
||||||
|
if (d.hasOpenGLInterop()) { |
||||||
|
result.add(d); //just interop needed
|
||||||
|
} |
||||||
|
} |
||||||
|
if (!result.isEmpty()) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
||||||
|
//still no one found, try without interop
|
||||||
|
LOG.warning("No device with OpenCL-OpenGL-interop found, try without"); |
||||||
|
for (Platform p : platforms) { |
||||||
|
for (Device d : p.getDevices()) { |
||||||
|
result.add(d); |
||||||
|
} |
||||||
|
if (!result.isEmpty()) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
||||||
|
//no devices available at all!
|
||||||
|
return result; //result is empty
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2016 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.opencl.lwjgl; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Sebastian Weiss |
||||||
|
*/ |
||||||
|
public class Utils { |
||||||
|
|
||||||
|
public static int getMajorVersion(String version, String prefix) { |
||||||
|
String s = version.substring(prefix.length()); |
||||||
|
return Integer.parseInt(s); |
||||||
|
} |
||||||
|
|
||||||
|
public static int getMinorVersion(String version, String prefix) { |
||||||
|
String s = version.substring(prefix.length()); |
||||||
|
int major = Integer.parseInt(s); |
||||||
|
s = s.substring((int) (Math.log10(major) + 2)); |
||||||
|
return Integer.parseInt(s); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue