diff options
Diffstat (limited to 'src/com/jogamp/opencl/CLSampler.java')
-rw-r--r-- | src/com/jogamp/opencl/CLSampler.java | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/com/jogamp/opencl/CLSampler.java b/src/com/jogamp/opencl/CLSampler.java new file mode 100644 index 00000000..79ef6067 --- /dev/null +++ b/src/com/jogamp/opencl/CLSampler.java @@ -0,0 +1,123 @@ +package com.jogamp.opencl; + +import com.jogamp.common.nio.Int64Buffer; + +import java.nio.Buffer; + +import static com.jogamp.opencl.CLException.*; +import static com.jogamp.opencl.CL.*; +import static com.jogamp.opencl.util.CLUtil.*; + +/** + * Object representing an OpenCL sampler. + * @see CLContext#createSampler(com.jogamp.opencl.CLSampler.AddressingMode, com.jogamp.opencl.CLSampler.FilteringMode, boolean) + * @author Michael Bien + */ +public class CLSampler extends CLObject implements CLResource { + + private final CLSamplerInfoAccessor samplerInfo; + + private CLSampler(CLContext context, long id, AddressingMode addrMode, FilteringMode filtMode, boolean normalizedCoords) { + super(context, id); + this.samplerInfo = new CLSamplerInfoAccessor(); + } + + static CLSampler create(CLContext context, AddressingMode addrMode, FilteringMode filtMode, boolean normalizedCoords) { + int[] error = new int[1]; + + long id = context.cl.clCreateSampler(context.ID, clBoolean(normalizedCoords), addrMode.MODE, filtMode.MODE, error, 0); + + checkForError(error[0], "can not create sampler"); + return new CLSampler(context, id, addrMode, filtMode, normalizedCoords); + } + + public FilteringMode getFilteringMode() { + int info = (int)samplerInfo.getLong(CL_SAMPLER_FILTER_MODE); + return FilteringMode.valueOf(info); + } + + public AddressingMode getAddressingMode() { + int info = (int)samplerInfo.getLong(CL_SAMPLER_ADDRESSING_MODE); + return AddressingMode.valueOf(info); + } + + public boolean hasNormalizedCoords() { + return samplerInfo.getLong(CL_SAMPLER_NORMALIZED_COORDS) == CL_TRUE; + } + + public void release() { + int ret = cl.clReleaseSampler(ID); + context.onSamplerReleased(this); + checkForError(ret, "can not release sampler"); + } + + public void close() { + release(); + } + + private class CLSamplerInfoAccessor extends CLInfoAccessor { + + @Override + protected int getInfo(int name, long valueSize, Buffer value, Int64Buffer valueSizeRet) { + return cl.clGetSamplerInfo(ID, name, valueSize, value, valueSizeRet); + } + + } + + public enum FilteringMode { + + NEAREST(CL_FILTER_NEAREST), + LINEAR(CL_FILTER_LINEAR); + + /** + * Value of wrapped OpenCL sampler filtering mode type. + */ + public final int MODE; + + private FilteringMode(int mode) { + this.MODE = mode; + } + + public static FilteringMode valueOf(int mode) { + switch(mode) { + case(CL_FILTER_NEAREST): + return NEAREST; + case(CL_FILTER_LINEAR): + return LINEAR; + } + return null; + } + } + + public enum AddressingMode { + + REPEAT(CL_ADDRESS_REPEAT), + CLAMP_TO_EDGE(CL_ADDRESS_CLAMP_TO_EDGE), + CLAMP(CL_ADDRESS_CLAMP), + NONE(CL_ADDRESS_NONE); + + /** + * Value of wrapped OpenCL sampler addressing mode type. + */ + public final int MODE; + + private AddressingMode(int mode) { + this.MODE = mode; + } + + public static AddressingMode valueOf(int mode) { + switch(mode) { + case(CL_ADDRESS_REPEAT): + return REPEAT; + case(CL_ADDRESS_CLAMP_TO_EDGE): + return CLAMP_TO_EDGE; + case(CL_ADDRESS_CLAMP): + return CLAMP; + case(CL_ADDRESS_NONE): + return NONE; + } + return null; + } + } + +} |