From 6be41a8e457ec2881f4ce351395ba84748a737b6 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 19 Oct 2013 06:47:48 +0200 Subject: 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 ... --- .../llb/impl/CLDynamicLibraryBundleInfo.java | 152 +++++++++++++++++++++ src/com/jogamp/opencl/llb/impl/CLImpl.java | 26 +--- 2 files changed, 158 insertions(+), 20 deletions(-) create mode 100644 src/com/jogamp/opencl/llb/impl/CLDynamicLibraryBundleInfo.java (limited to 'src/com/jogamp/opencl/llb/impl') 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 glueLibNames; + static { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + Platform.initSingleton(); + + if( TempJarCache.isInitialized() ) { + // only: jocl.jar -> jocl-natives-.jar + JNILibLoaderBase.addNativeJarLibs(new Class[] { CLDynamicLibraryBundleInfo.class }, null, null ); + } + return null; + } + }); + + glueLibNames = new ArrayList(); + glueLibNames.add("jocl"); + } + + protected CLDynamicLibraryBundleInfo() { + } + + /** + *

+ * Returns true, + * since we might load the library and allow symbol access to subsequent libs. + *

+ */ + @Override + public final boolean shallLinkGlobal() { return true; } + + /** + * {@inheritDoc} + * Returns true on Android, + * and false 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 getGlueLibNames() { + return glueLibNames; + } + + @Override + public final List> getToolLibNames() { + List> libNamesList = new ArrayList>(); + + final List libCL = new ArrayList(); + { + // 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 getToolGetProcAddressFuncNameList() { + List res = new ArrayList(); + 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; } -- cgit v1.2.3