diff options
author | Michael Bien <[email protected]> | 2011-05-26 02:01:18 +0200 |
---|---|---|
committer | Michael Bien <[email protected]> | 2011-05-26 02:01:18 +0200 |
commit | 08a479b22d4ba9da9ee79fc938ac4de7fb83dc5a (patch) | |
tree | 145abdd2ebc083e7167ccceb3d13a398c57a1dd0 /src/com/jogamp/opencl/impl | |
parent | cb859fd580d3e1f5afb3c0f77cee0a5e82a394bb (diff) |
introduced CLAccessorFactory spi and threadlocal default impl for CLDevice and CLPlatform.
Diffstat (limited to 'src/com/jogamp/opencl/impl')
-rw-r--r-- | src/com/jogamp/opencl/impl/CLTLAccessorFactory.java | 92 | ||||
-rw-r--r-- | src/com/jogamp/opencl/impl/CLTLInfoAccessor.java | 132 |
2 files changed, 224 insertions, 0 deletions
diff --git a/src/com/jogamp/opencl/impl/CLTLAccessorFactory.java b/src/com/jogamp/opencl/impl/CLTLAccessorFactory.java new file mode 100644 index 00000000..1c7f9526 --- /dev/null +++ b/src/com/jogamp/opencl/impl/CLTLAccessorFactory.java @@ -0,0 +1,92 @@ +/* + * Created on Wednesday, May 25 2011 00:57 + */ +package com.jogamp.opencl.impl; + +import java.nio.IntBuffer; +import com.jogamp.common.nio.NativeSizeBuffer; +import com.jogamp.opencl.CL; +import com.jogamp.opencl.spi.CLAccessorFactory; +import com.jogamp.opencl.spi.CLInfoAccessor; +import com.jogamp.opencl.spi.CLPlatformInfoAccessor; +import java.nio.Buffer; + +import static com.jogamp.opencl.CLException.*; + +/** + * + * @author Michael Bien + */ +public class CLTLAccessorFactory implements CLAccessorFactory { + + @Override + public CLInfoAccessor createDeviceInfoAccessor(CL cl, long id) { + return new CLDeviceInfoAccessor(cl, id); + } + + @Override + public CLPlatformInfoAccessor createPlatformInfoAccessor(CL cl, long id) { + return new CLTLPlatformInfoAccessor(cl, id); + } + + private final static class CLDeviceInfoAccessor extends CLTLInfoAccessor { + + private final CL cl; + private final long ID; + + private CLDeviceInfoAccessor(CL cl, long id) { + this.cl = cl; + this.ID = id; + } + + @Override + public int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet) { + return cl.clGetDeviceInfo(ID, name, valueSize, value, valueSizeRet); + } + + } + + private final static class CLTLPlatformInfoAccessor extends CLTLInfoAccessor implements CLPlatformInfoAccessor { + + private final long ID; + private final CL cl; + + private CLTLPlatformInfoAccessor(CL cl, long id) { + this.ID = id; + this.cl = cl; + } + + @Override + public int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet) { + return cl.clGetPlatformInfo(ID, name, valueSize, value, valueSizeRet); + } + + @Override + public long[] getDeviceIDs(long type) { + + IntBuffer buffer = getBB(4).asIntBuffer(); + int ret = cl.clGetDeviceIDs(ID, type, 0, null, buffer); + int count = buffer.get(0); + + // return an empty buffer rather than throwing an exception + if(ret == CL.CL_DEVICE_NOT_FOUND || count == 0) { + return new long[0]; + }else{ + checkForError(ret, "error while enumerating devices"); + + NativeSizeBuffer deviceIDs = NativeSizeBuffer.wrap(getBB(count*NativeSizeBuffer.elementSize())); + ret = cl.clGetDeviceIDs(ID, type, count, deviceIDs, null); + checkForError(ret, "error while enumerating devices"); + + long[] ids = new long[count]; + for (int i = 0; i < ids.length; i++) { + ids[i] = deviceIDs.get(i); + } + return ids; + } + + } + + } + +} diff --git a/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java b/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java new file mode 100644 index 00000000..ee5d0e47 --- /dev/null +++ b/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java @@ -0,0 +1,132 @@ +/* + * Copyright 2009 - 2010 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.impl; + +import com.jogamp.opencl.spi.CLInfoAccessor; +import com.jogamp.common.nio.NativeSizeBuffer; +import com.jogamp.common.os.Platform; +import com.jogamp.opencl.util.CLUtil; +import java.nio.Buffer; +import java.nio.ByteBuffer; + +import static com.jogamp.common.nio.Buffers.*; +import static com.jogamp.opencl.CLException.*; + +/** + * Internal utility for common OpenCL clGetFooInfo calls. + * Threadsafe, threadlocal implementation. + * @author Michael Bien + */ +public abstract class CLTLInfoAccessor implements CLInfoAccessor { + + private static final int BB_SIZE = 512; + + protected final static ThreadLocal<ByteBuffer> localBB = new ThreadLocal<ByteBuffer>() { + + @Override + protected ByteBuffer initialValue() { + return newDirectByteBuffer(BB_SIZE); + } + + }; + protected final static ThreadLocal<NativeSizeBuffer> localNSB = new ThreadLocal<NativeSizeBuffer>() { + + @Override + protected NativeSizeBuffer initialValue() { + return NativeSizeBuffer.allocateDirect(1); + } + + }; + + @Override + public final long getLong(int key) { + + ByteBuffer buffer = getBB(8).putLong(0, 0); + int ret = getInfo(key, 8, buffer, null); + checkForError(ret, "error while asking for info value"); + + return buffer.getLong(0); + } + + @Override + public final String getString(int key) { + + NativeSizeBuffer sizeBuffer = getNSB(); + int ret = getInfo(key, 0, null, sizeBuffer); + checkForError(ret, "error while asking for info string"); + + int clSize = (int)sizeBuffer.get(0); + ByteBuffer buffer = getBB(clSize); + + ret = getInfo(key, buffer.capacity(), buffer, null); + checkForError(ret, "error while asking for info string"); + + byte[] array = new byte[clSize]; + buffer.get(array).rewind(); + + return CLUtil.clString2JavaString(array, clSize); + + } + + @Override + public final int[] getInts(int key, int n) { + + ByteBuffer buffer = getBB(n * (Platform.is32Bit()?4:8)); + int ret = getInfo(key, buffer.capacity(), buffer, null); + checkForError(ret, "error while asking for info value"); + + int[] array = new int[n]; + for(int i = 0; i < array.length; i++) { + if(Platform.is32Bit()) { + array[i] = buffer.getInt(); + }else{ + array[i] = (int)buffer.getLong(); + } + } + buffer.rewind(); + + return array; + } + + protected ByteBuffer getBB(int minCapacity) { + if(minCapacity > BB_SIZE) { + return newDirectByteBuffer(minCapacity); + }else{ + return localBB.get(); + } + } + + protected NativeSizeBuffer getNSB() { + return localNSB.get(); + } + + protected abstract int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet); + + +} |