diff options
author | Sven Gothel <[email protected]> | 2013-10-19 06:47:48 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2013-10-19 06:47:48 +0200 |
commit | 6be41a8e457ec2881f4ce351395ba84748a737b6 (patch) | |
tree | 057311ecf74b576f0dd5187f8d44e507ff2cc07e /src | |
parent | 412dd81be138c49f8c683f9d350aa16322605281 (diff) |
Bug 773 - Device specific JOCL dynamic library look-up on Android - Part 1/2
Use DynamicLibraryBundleInfo w/ alternative native library names,
drop manual coding of loading and binding, i.e. JOCLJNILibLoader.
After trying opencl native libs (and failing), try GL libs ..
We use a manual impl. to CL's 'clGetExtensionFunctionAddress' similar to JOAL, JOGL ...
Diffstat (limited to 'src')
-rw-r--r-- | src/com/jogamp/opencl/CLPlatform.java | 81 | ||||
-rw-r--r-- | src/com/jogamp/opencl/JOCLJNILibLoader.java | 72 | ||||
-rw-r--r-- | src/com/jogamp/opencl/llb/impl/CLDynamicLibraryBundleInfo.java | 152 | ||||
-rw-r--r-- | src/com/jogamp/opencl/llb/impl/CLImpl.java | 26 |
4 files changed, 176 insertions, 155 deletions
diff --git a/src/com/jogamp/opencl/CLPlatform.java b/src/com/jogamp/opencl/CLPlatform.java index 7a4f6b43..99b2e16d 100644 --- a/src/com/jogamp/opencl/CLPlatform.java +++ b/src/com/jogamp/opencl/CLPlatform.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -36,11 +36,8 @@ import com.jogamp.opencl.llb.CLImageBinding; import com.jogamp.opencl.llb.CL; import com.jogamp.opencl.impl.CLTLAccessorFactory; import com.jogamp.common.nio.Buffers; -import com.jogamp.common.os.DynamicLookupHelper; import com.jogamp.common.JogampRuntimeException; -import com.jogamp.common.os.NativeLibrary; import com.jogamp.common.nio.PointerBuffer; -import com.jogamp.gluegen.runtime.FunctionAddressResolver; import com.jogamp.opencl.llb.CLBufferBinding; import com.jogamp.opencl.llb.CLCommandQueueBinding; import com.jogamp.opencl.llb.CLContextBinding; @@ -50,7 +47,6 @@ import com.jogamp.opencl.llb.CLMemObjBinding; import com.jogamp.opencl.spi.CLPlatformInfoAccessor; import com.jogamp.opencl.util.CLUtil; import com.jogamp.opencl.llb.impl.CLImpl; -import com.jogamp.opencl.llb.impl.CLProcAddressTable; import com.jogamp.opencl.spi.CLAccessorFactory; import com.jogamp.opencl.util.Filter; import com.jogamp.opencl.util.JOCLVersion; @@ -63,15 +59,13 @@ import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.Set; -import java.security.PrivilegedAction; -import static java.security.AccessController.*; import static com.jogamp.opencl.CLException.*; import static com.jogamp.opencl.llb.CL.*; /** * CLPlatfrorm representing a OpenCL implementation (e.g. graphics driver). - * + * * optional eager initialization: * <p><pre> * try{ @@ -80,15 +74,15 @@ import static com.jogamp.opencl.llb.CL.*; * throw new RuntimeException("could not load Java OpenCL Binding"); * } * </pre></p> - * + * * Example initialization: * <p><pre> * CLPlatform platform = CLPlatform.getDefault(type(GPU)); - * + * * if(platform == null) { * throw new RuntimeException("please update your graphics drivers"); * } - * + * * CLContext context = CLContext.create(platform.getMaxFlopsDevice()); * try { * // use it @@ -98,7 +92,7 @@ import static com.jogamp.opencl.llb.CL.*; * </pre></p> * concurrency:<br/> * CLPlatform is threadsafe. - * + * * @author Michael Bien, et al. * @see #initialize() * @see #getDefault() @@ -159,7 +153,7 @@ public class CLPlatform { if(cl != null) { return; } - + if(defaultFactory == null) { if(factory == null) { defaultFactory = new CLTLAccessorFactory(); @@ -169,49 +163,10 @@ public class CLPlatform { } try { - - final CLProcAddressTable table = new CLProcAddressTable(new FunctionAddressResolver() { - @Override - public long resolve(String name, DynamicLookupHelper lookup) { - - //FIXME workaround to fix a gluegen issue - if(name.endsWith("Impl")) { - name = name.substring(0, name.length() - "Impl".length()); - } - - if(name.endsWith("KHR") || name.endsWith("EXT")) { - long address = ((CLImpl) cl).clGetExtensionFunctionAddress(name); - if(address != 0) { - return address; - } - } - - return lookup.dynamicLookupFunction(name); - } - }); - - cl = new CLImpl(table); - - //load JOCL and init table - doPrivileged(new PrivilegedAction<Object>() { - @Override - public Object run() { - - NativeLibrary libOpenCL = JOCLJNILibLoader.loadOpenCL(); - if(libOpenCL == null) { - throw new JogampRuntimeException("OpenCL library not found."); - } - - //eagerly init function to query extension addresses (used in reset()) - table.initEntry("clGetExtensionFunctionAddressImpl", libOpenCL); - table.reset(libOpenCL); - return null; - } - }); - -// System.out.println("\n"+table); -// System.out.println("unavailable functions: "+table.getNullPointerFunctions()); - + if( null == CLImpl.getCLProcAddressTable() ) { + throw new JogampRuntimeException("JOCL ProcAddressTable is NULL"); + } + cl = new CLImpl(); }catch(UnsatisfiedLinkError ex) { System.err.println(JOCLVersion.getAllVersions()); throw ex; @@ -321,7 +276,7 @@ public class CLPlatform { initialize(); List<CLDevice> list = new ArrayList<CLDevice>(); - + for(int t = 0; t < types.length; t++) { CLDevice.Type type = types[t]; @@ -344,7 +299,7 @@ public class CLPlatform { initialize(); List<CLDevice> list = new ArrayList<CLDevice>(); - + long[] deviceIDs = info.getDeviceIDs(CL_DEVICE_TYPE_ALL); //add device to list @@ -381,7 +336,7 @@ public class CLPlatform { static CLDevice findMaxFlopsDevice(CLDevice[] devices) { return findMaxFlopsDevice(devices, null); } - + static CLDevice findMaxFlopsDevice(CLDevice[] devices, CLDevice.Type type) { initialize(); @@ -470,7 +425,7 @@ public class CLPlatform { } /** - * @see CLVersion#isAtLeast(int, int) + * @see CLVersion#isAtLeast(int, int) */ public boolean isAtLeast(int major, int minor) { return version.isAtLeast(major, minor); diff --git a/src/com/jogamp/opencl/JOCLJNILibLoader.java b/src/com/jogamp/opencl/JOCLJNILibLoader.java deleted file mode 100644 index 83ca22d6..00000000 --- a/src/com/jogamp/opencl/JOCLJNILibLoader.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2009 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community 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. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ - -package com.jogamp.opencl; - -import java.security.AccessController; -import java.security.PrivilegedAction; - -import com.jogamp.common.jvm.JNILibLoaderBase; -import com.jogamp.common.os.NativeLibrary; -import com.jogamp.common.os.Platform; -import com.jogamp.common.util.cache.TempJarCache; - - -/** - * Responsible for JOCL lib loading. - * @author Michael Bien - */ -class JOCLJNILibLoader extends JNILibLoaderBase { - - /** - * Loads the native binding and returns the OpenCL library for dynamic linking. - * @return Returns libOpenCL represented as NativeLibrary. - */ - static NativeLibrary loadOpenCL() { - return AccessController.doPrivileged(new PrivilegedAction<NativeLibrary>() { - public NativeLibrary run() { - Platform.initSingleton(); - - // Implementation should move to com.jogamp.common.os.DynamicLibraryBundleInfo, - // eg.: jogamp.opengl.GLDynamicLibraryBundleInfo etc. - final String libName = "jocl"; - if(TempJarCache.isInitialized() && null == TempJarCache.findLibrary(libName)) { - // only: jocl.jar -> jocl-natives-<os.and.arch>.jar - addNativeJarLibs(new Class<?>[] { JOCLJNILibLoader.class }, null, null ); - } - loadLibrary(libName, false, JOCLJNILibLoader.class.getClassLoader()); - NativeLibrary res = NativeLibrary.open("OpenCL", JOCLJNILibLoader.class.getClassLoader()); - if(null == res) { - // try unix name w/ version (eg.: AMD has a /usr/lib32/fglrx/libOpenCL.so.1 only) - res = NativeLibrary.open("libOpenCL.so.1", JOCLJNILibLoader.class.getClassLoader()); - } - return res; - } - }); - } -} diff --git a/src/com/jogamp/opencl/llb/impl/CLDynamicLibraryBundleInfo.java b/src/com/jogamp/opencl/llb/impl/CLDynamicLibraryBundleInfo.java new file mode 100644 index 00000000..ff5a122a --- /dev/null +++ b/src/com/jogamp/opencl/llb/impl/CLDynamicLibraryBundleInfo.java @@ -0,0 +1,152 @@ +/** + * Copyright 2013 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community 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. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +package com.jogamp.opencl.llb.impl; + +import com.jogamp.common.jvm.JNILibLoaderBase; +import com.jogamp.common.os.DynamicLibraryBundle; +import com.jogamp.common.os.DynamicLibraryBundleInfo; +import com.jogamp.common.os.Platform; +import com.jogamp.common.util.RunnableExecutor; +import com.jogamp.common.util.cache.TempJarCache; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.*; + +public final class CLDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo { + private static final List<String> glueLibNames; + static { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + Platform.initSingleton(); + + if( TempJarCache.isInitialized() ) { + // only: jocl.jar -> jocl-natives-<os.and.arch>.jar + JNILibLoaderBase.addNativeJarLibs(new Class<?>[] { CLDynamicLibraryBundleInfo.class }, null, null ); + } + return null; + } + }); + + glueLibNames = new ArrayList<String>(); + glueLibNames.add("jocl"); + } + + protected CLDynamicLibraryBundleInfo() { + } + + /** + * <p> + * Returns <code>true</code>, + * since we might load the library and allow symbol access to subsequent libs. + * </p> + */ + @Override + public final boolean shallLinkGlobal() { return true; } + + /** + * {@inheritDoc} + * Returns <code>true</code> on <code>Android</code>, + * and <code>false</code> otherwise. + */ + @Override + public final boolean shallLookupGlobal() { + if ( Platform.OSType.ANDROID == Platform.OS_TYPE ) { + // Android requires global symbol lookup + return true; + } + // default behavior for other platforms + return false; + } + + @Override + public final List<String> getGlueLibNames() { + return glueLibNames; + } + + @Override + public final List<List<String>> getToolLibNames() { + List<List<String>> libNamesList = new ArrayList<List<String>>(); + + final List<String> libCL = new ArrayList<String>(); + { + // this is the default OpenCL lib name, according to the spec + libCL.add("libOpenCL.so.1"); // unix + libCL.add("OpenCL"); // windows, OSX + + // try this one as well, if spec fails + libCL.add("libGL.so.1"); + + // ES2: This is the default lib name, according to the spec + libCL.add("libGLESv2.so.2"); + + // ES2: Try these as well, if spec fails + libCL.add("libGLESv2.so"); + libCL.add("GLESv2"); + + } + libNamesList.add(libCL); + + return libNamesList; + } + + @Override + public final List<String> getToolGetProcAddressFuncNameList() { + List<String> res = new ArrayList<String>(); + res.add("clGetExtensionFunctionAddress"); + return res; + } + + private static String Impl_str = "Impl"; + private static int Impl_len = Impl_str.length(); + + @Override + public final long toolGetProcAddress(long toolGetProcAddressHandle, String funcName) { + //FIXME workaround to fix a gluegen issue + if( funcName.endsWith(Impl_str) ) { + funcName = funcName.substring(0, funcName.length() - Impl_len); + } + if(funcName.endsWith("KHR") || funcName.endsWith("EXT")) { + return CLImpl.clGetExtensionFunctionAddress(toolGetProcAddressHandle, funcName); + } + return 0; // on libs .. + } + + @Override + public final boolean useToolGetProcAdressFirst(String funcName) { + return true; + } + + @Override + public final RunnableExecutor getLibLoaderExecutor() { + return DynamicLibraryBundle.getDefaultRunnableExecutor(); + } +} + + diff --git a/src/com/jogamp/opencl/llb/impl/CLImpl.java b/src/com/jogamp/opencl/llb/impl/CLImpl.java index 253e19e6..ad89ff9f 100644 --- a/src/com/jogamp/opencl/llb/impl/CLImpl.java +++ b/src/com/jogamp/opencl/llb/impl/CLImpl.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -50,8 +50,8 @@ public class CLImpl extends CLAbstractImpl { //maps the context id to its error handler's global object pointer private final LongLongHashMap contextCallbackMap; - public CLImpl(CLProcAddressTable addressTable) { - super(addressTable); + public CLImpl() { + super(); this.contextCallbackMap = new LongLongHashMap(); this.contextCallbackMap.setKeyNotFoundValue(0); } @@ -253,20 +253,6 @@ public class CLImpl extends CLAbstractImpl { int num_events_in_wait_list, Object event_wait_list, int event_wait_list_byte_offset, Object event, int event_byte_offset, Object errcode_ret, int errcode_ret_byte_offset); - /** - * Returns the extension function address for the given function name. - */ - public long clGetExtensionFunctionAddress(String name) { - ByteBuffer res = super.clGetExtensionFunctionAddressImpl(name); - if(res == null) { - return 0; - }else if (Platform.is32Bit()) { - return res.getInt(); - } else { - return res.getLong(); - } - } - public CLProcAddressTable getAddressTable() { return addressTable; } |