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/com/jogamp/opencl/llb | |
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/com/jogamp/opencl/llb')
-rw-r--r-- | src/com/jogamp/opencl/llb/impl/CLDynamicLibraryBundleInfo.java | 152 | ||||
-rw-r--r-- | src/com/jogamp/opencl/llb/impl/CLImpl.java | 26 |
2 files changed, 158 insertions, 20 deletions
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; } |