diff options
-rw-r--r-- | src/com/jogamp/opencl/CLContext.java | 48 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLImageFormat.java | 15 | ||||
-rw-r--r-- | test/com/jogamp/opencl/HighLevelBindingTest.java | 29 |
3 files changed, 89 insertions, 3 deletions
diff --git a/src/com/jogamp/opencl/CLContext.java b/src/com/jogamp/opencl/CLContext.java index 72694d61..5deaf4cf 100644 --- a/src/com/jogamp/opencl/CLContext.java +++ b/src/com/jogamp/opencl/CLContext.java @@ -1,10 +1,10 @@ package com.jogamp.opencl; import com.jogamp.opencl.CLDevice.Type; -import com.jogamp.opencl.CLMemory.Mem; import com.jogamp.opencl.CLSampler.AddressingMode; import com.jogamp.opencl.CLSampler.FilteringMode; import com.jogamp.common.nio.PointerBuffer; +import com.jogamp.opencl.impl.CLImageFormatImpl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -27,6 +27,8 @@ import static java.lang.System.*; import static com.jogamp.opencl.CLException.*; import static com.jogamp.common.nio.Buffers.*; import static com.jogamp.common.os.Platform.*; +import static com.jogamp.opencl.CL.*; +import static com.jogamp.opencl.CLBuffer.*; /** * CLContext is responsible for managing objects such as command-queues, memory, @@ -414,6 +416,50 @@ public class CLContext extends CLObject implements CLResource { device.setContext(this); } + private CLImageFormat[] getSupportedImageFormats(int flags, int type) { + + int[] entries = new int[1]; + int ret = cl.clGetSupportedImageFormats(ID, flags, type, 0, null, entries, 0); + if(ret != CL_SUCCESS) { + throw newException(ret, "error calling clGetSupportedImageFormats"); + } + + int count = entries[0]; + if(count == 0) { + return new CLImageFormat[0]; + } + + CLImageFormat[] formats = new CLImageFormat[count]; + CLImageFormatImpl impl = CLImageFormatImpl.create(newDirectByteBuffer(count * CLImageFormatImpl.size())); + ret = cl.clGetSupportedImageFormats(ID, flags, type, count, impl, null, 0); + if(ret != CL_SUCCESS) { + throw newException(ret, "error calling clGetSupportedImageFormats"); + } + + ByteBuffer buffer = impl.getBuffer(); + for (int i = 0; i < formats.length; i++) { + formats[i] = new CLImageFormat(CLImageFormatImpl.create(buffer.slice())); + buffer.position(i*CLImageFormatImpl.size()); + } + + return formats; + + } + + /** + * Returns all supported 2d image formats with the (optional) memory allocation flags. + */ + public CLImageFormat[] getSupportedImage2dFormats(Mem... flags) { + return getSupportedImageFormats(flags==null?0:Mem.flagsToInt(flags), CL_MEM_OBJECT_IMAGE2D); + } + + /** + * Returns all supported 3d image formats with the (optional) memory allocation flags. + */ + public CLImageFormat[] getSupportedImage3dFormats(Mem... flags) { + return getSupportedImageFormats(flags==null?0:Mem.flagsToInt(flags), CL_MEM_OBJECT_IMAGE3D); + } + /** * Returns the CLPlatform this context is running on. */ diff --git a/src/com/jogamp/opencl/CLImageFormat.java b/src/com/jogamp/opencl/CLImageFormat.java index 20f2c4b1..e3eb3667 100644 --- a/src/com/jogamp/opencl/CLImageFormat.java +++ b/src/com/jogamp/opencl/CLImageFormat.java @@ -5,17 +5,23 @@ import com.jogamp.opencl.impl.CLImageFormatImpl; import static com.jogamp.opencl.CL.*; /** - * + * Represents the OpenCL image format with its channeltype and order. * @author Michael Bien */ public final class CLImageFormat { - private final CLImageFormatImpl format = CLImageFormatImpl.create(); + private final CLImageFormatImpl format; CLImageFormat() { + format = CLImageFormatImpl.create(); + } + + CLImageFormat(CLImageFormatImpl format) { + this.format = format; } public CLImageFormat(ChannelOrder order, ChannelType type) { + format = CLImageFormatImpl.create(); setImageChannelOrder(order); setImageChannelDataType(type); } @@ -45,6 +51,11 @@ public final class CLImageFormat { return format; } + @Override + public String toString() { + return "CLImageFormat["+getImageChannelOrder()+" "+getImageChannelDataType()+"]"; + } + /** * Specifies the number of channels and the channel layout i.e. the memory * layout in which channels are stored in the image. diff --git a/test/com/jogamp/opencl/HighLevelBindingTest.java b/test/com/jogamp/opencl/HighLevelBindingTest.java index 588be480..ba2b11fa 100644 --- a/test/com/jogamp/opencl/HighLevelBindingTest.java +++ b/test/com/jogamp/opencl/HighLevelBindingTest.java @@ -321,5 +321,34 @@ public class HighLevelBindingTest { context.release(); } + @Test + public void supportedImageFormatsTest() { + + CLDevice[] devices = CLPlatform.getDefault().listCLDevices(); + + CLDevice theChosenOne = null; + for (CLDevice device : devices) { + if(device.isImageSupportAvailable()) { + theChosenOne = device; + break; + } + } + + if(theChosenOne == null) { + out.println("can not test image api."); + return; + } + + CLContext context = CLContext.create(theChosenOne); + + try{ + CLImageFormat[] formats = context.getSupportedImage2dFormats(); + assertTrue(formats.length > 0); + out.println("sample image format: "+formats[0]); + }finally{ + context.release(); + } + + } } |