/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.nativelibs4java.opencl;
import static com.nativelibs4java.util.NIOUtils.directBuffer;
import static com.nativelibs4java.util.NIOUtils.get;
import static com.nativelibs4java.util.NIOUtils.put;
import static org.junit.Assert.*;
import java.nio.*;
import org.junit.BeforeClass;
import org.junit.Test;
import com.nativelibs4java.util.NIOUtils;
import org.bridj.*;
import java.nio.ByteOrder;
import static org.bridj.Pointer.*;
import java.nio.ByteOrder;
import java.util.List;
import org.junit.runners.Parameterized;
/**
*
* @author ochafik
*/
@SuppressWarnings("unchecked")
public class BufferTest extends AbstractCommon {
public BufferTest(CLDevice device) {
super(device);
}
@Parameterized.Parameters
public static List<Object[]> getDeviceParameters() {
return AbstractCommon.getDeviceParameters();
}
static ByteOrder otherOrder(ByteOrder o) {
return o.equals(ByteOrder.BIG_ENDIAN) ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
}
@Test(expected = IllegalArgumentException.class)
public void testMismatchingOrder() {
context.createBuffer(CLMem.Usage.InputOutput, allocateFloats(10).order(otherOrder(context.getByteOrder())));
}
@Test
public void testMismatchingByteOrder() {
context.createBuffer(CLMem.Usage.InputOutput, allocateBytes(10).order(otherOrder(context.getByteOrder())));
}
@Test
public void testReadWrite() {
for (Class<?> bufferClass : bufferClasses)
testReadWrite(bufferClass, 10, 3, 3);
}
public <B> void testReadWrite(Class<B> bufferClass, int n, int zeroOffset, int zeroLength) {
CLBuffer<B> buf = context.createBuffer(CLMem.Usage.InputOutput, bufferClass, n);
assertEquals(n, buf.getElementCount());
Pointer<B> initial = allocateArray(bufferClass, n).order(context.getByteOrder());
Pointer<B> zeroes = allocateArray(bufferClass, n).order(context.getByteOrder());
for (int i = 0; i < n; i++) {
int v = i + 1;
Object value = null;
if (bufferClass == Integer.class)
value = (Object)v;
else if (bufferClass == Long.class)
value = (Object)(long)v;
else if (bufferClass == Short.class)
value = (Object)(short)v;
else if (bufferClass == Byte.class)
value = (Object)(byte)v;
else if (bufferClass == Double.class)
value = (Object)(double)v;
else if (bufferClass == Float.class)
value = (Object)(float)v;
else if (bufferClass == Boolean.class)
value = (Object)(v != 0);
else if (bufferClass == Character.class)
value = (Object)(char)v;
else
throw new RuntimeException();
initial.set(i, (B)value);
}
buf.write(queue, initial, true);
Pointer<B> retrieved = buf.read(queue);
assertEquals(buf.getElementCount(), retrieved.getValidElements());
for (int i = 0; i < n; i++)
assertEquals(bufferClass.getName(), initial.get(i), retrieved.get(i));
buf.write(queue, zeroOffset, zeroLength, zeroes, true);
boolean direct = true;
String type = direct ? "read to direct buffer" : "read to indirect buffer";
Pointer<B> readBuffer;
//if (direct)
readBuffer = retrieved;
//else
// readBuffer = NIOUtils.indirectBuffer(n, bufferClass);
buf.read(queue, readBuffer, true);
for (int i = 0; i < n; i++) {
if (i >= zeroOffset && i < (zeroOffset + zeroLength))
assertEquals(bufferClass.getName(), zeroes.get(i), readBuffer.get(i));
else
assertEquals(bufferClass.getName(), initial.get(i), readBuffer.get(i));
}
}
Class<?>[] bufferClasses = new Class[] {
Integer.class,
Long.class,
Short.class,
Byte.class,
Double.class,
Float.class
};
Class<? extends Buffer>[] primClasses = new Class[] {
Integer.class,
Long.class,
Short.class,
Byte.class,
Double.class,
Character.class,
Float.class
};
@Test
public void testMap() {
for (Class<?> bufferClass : bufferClasses)
testMap(bufferClass);
}
public <T> void testMap(Class<T> bufferClass) {
int size = 10;
Pointer<Byte> data = allocateBytes(size).order(context.getByteOrder());
CLBuffer<T> buf = context.createBuffer(CLMem.Usage.Input, data, false).as(bufferClass);
Pointer<T> mapped = buf.map(queue, CLMem.MapFlags.Read);
assertEquals(data, mapped);
}
@Test
public void testFill() {
Pointer<Integer> pattern = pointerToInts(1, 2, 3, 4);
int n = 12;
CLBuffer<Integer> buf = context.createIntBuffer(CLMem.Usage.InputOutput, n);
CLEvent e = buf.fillBuffer(queue, pattern);
assertNotNull(e);
Pointer<Integer> data = buf.read(queue, e);
for (int i = 0; i < n; i++) {
int expectedValue = (i % 4) + 1;
assertEquals(expectedValue, data.getIntAtIndex(i));
}
try {
buf.fillBuffer(queue, pattern, pattern.getValidElements(), 0, n - 1);
fail("Expected fill length failure");
} catch (Throwable th) {}
try {
buf.fillBuffer(queue, pattern, pattern.getValidElements() + 1, 0, n);
fail("Expected pattern length failure");
} catch (Throwable th) {}
}
@Test
public void testCopyTo_full() {
CLBuffer<Integer> b = context.createIntBuffer(CLMem.Usage.InputOutput, pointerToInts(1, 2, 3, 4, 5, 6));
CLBuffer<Integer> out = context.createIntBuffer(CLMem.Usage.InputOutput, 6);
CLEvent e = b.copyTo(queue, out);
assertArrayEquals(new int[] { 1, 2, 3, 4, 5, 6 }, out.read(queue, e).getInts());
}
@Test
public void testCopyTo_partial() {
CLBuffer<Integer> b = context.createIntBuffer(CLMem.Usage.InputOutput, pointerToInts(1, 2, 3, 4, 5, 6));
CLBuffer<Integer> out = context.createIntBuffer(CLMem.Usage.InputOutput, 6);
CLEvent e = b.copyElementsTo(queue, out, 2, 1, 2);
assertArrayEquals(new int[] { 3, 4 }, out.read(queue, e).next().validElements(2).getInts());
}
}