/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.nativelibs4java.opencl.util; import com.nativelibs4java.opencl.CLBuffer; import com.nativelibs4java.opencl.CLBuildException; import com.nativelibs4java.opencl.CLContext; import com.nativelibs4java.opencl.CLEvent; import com.nativelibs4java.opencl.CLException; import com.nativelibs4java.opencl.CLMem; import com.nativelibs4java.opencl.CLQueue; import com.nativelibs4java.util.NIOUtils; import java.nio.Buffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import org.bridj.*; import static org.bridj.Pointer.*; /** * Generic homogeneous transformer class * @author ochafik * @param <A> primitive array class that represents the data consumed and produced by this transformer */ public interface Transformer<T, A> { CLContext getContext(); A transform(CLQueue queue, A input, boolean inverse); //B transform(CLQueue queue, B input, boolean inverse); Pointer<T> transform(CLQueue queue, Pointer<T> input, boolean inverse); CLEvent transform(CLQueue queue, CLBuffer<T> input, CLBuffer<T> output, boolean inverse, CLEvent... eventsToWaitFor) throws CLException; long computeOutputSize(long inputSize); public abstract class AbstractTransformer<T, A> implements Transformer<T, A> { protected final Class<T> primitiveClass; protected final CLContext context; public AbstractTransformer(CLContext context, Class<T> primitiveClass) { this.primitiveClass = primitiveClass; this.context = context; } public CLContext getContext() { return context; } public long computeOutputSize(long inputSize) { return inputSize; } public A transform(CLQueue queue, A input, boolean inverse) { return (A)transform(queue, (Pointer<T>)pointerToArray(input), inverse).getArray(); } public Pointer<T> transform(CLQueue queue, Pointer<T> in, boolean inverse) { long inputSize = (int)in.getValidElements(); long length = inputSize / 2; CLBuffer<T> inBuf = context.createBuffer(CLMem.Usage.Input, in, true); // true = copy CLBuffer<T> outBuf = context.createBuffer(CLMem.Usage.Output, primitiveClass, computeOutputSize(inputSize)); CLEvent dftEvt = transform(queue, inBuf, outBuf, inverse); inBuf.release(); Pointer<T> out = outBuf.read(queue, dftEvt); outBuf.release(); return out; } } }