/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.nativelibs4java.opencl;
import com.jogamp.opengl.util.FPSAnimator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import org.junit.BeforeClass;
import org.junit.Test;
import com.nativelibs4java.opencl.CLMem.GLObjectInfo;
import com.nativelibs4java.util.NIOUtils;
import javax.media.opengl.*;
import javax.media.opengl.awt.*;
import static javax.media.opengl.GL.*;
import static javax.media.opengl.GL2.*;
import com.jogamp.opengl.util.*;
import com.jogamp.common.nio.*;
import java.nio.ByteOrder;
@org.junit.Ignore
public class JOGLTest {
@BeforeClass
public static void initialise() {
//if (Platform.isWindows())
System.setProperty("sun.java2d.noddraw","true");
}
public GLCanvas createGLCanvas(int width, int height) {
//GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2));
caps.setHardwareAccelerated(true);
caps.setDoubleBuffered(true);
GLCanvas glCanvas = new GLCanvas(caps);//new GLCapabilities(GLProfile.get(GLProfile.GL)));
//GLCapabilitiesImmutable icaps = glCanvas.getChosenGLCapabilities();
//boolean hwa = icaps.getHardwareAccelerated();
glCanvas.setSize( width, height );
glCanvas.setIgnoreRepaint( true );
return glCanvas;
}
@Test
public void testBuffer() {
if (JavaCL.listGPUPoweredPlatforms().length == 0) {
System.out.println("#\n# Warning: There is no GPU-powered OpenCL platform available. Skipping test.\n#");
return;
}
try {
final Semaphore sem = new Semaphore(0);
JFrame f = new JFrame();
GLCanvas canvas = createGLCanvas(100, 100);
f.getContentPane().add("Center", canvas);
final AssertionError[] err = new AssertionError[1];
final Throwable[] exx = new Throwable[1];
canvas.addGLEventListener(new GLEventListener() {
@Override
public void init(GLAutoDrawable drawable) {
try {
CLContext context = JavaCL.createContextFromCurrentGL();
assertNotNull(context);
if (context != null) {
//int glcontext = gl.glGet.getContext().CONTEXT_CURRENT;
CLQueue queue = context.createDefaultQueue();
System.err.println("Initializing with OpenCL context = " + context + "...");
int bufferSize = 1024;
FloatBuffer buffer;
int[] VBO = new int[1];
int[] Texture = new int[1];
GL2 gl = (GL2)drawable.getGL();
buffer = NIOUtils.directFloats(bufferSize, ByteOrder.nativeOrder());
gl.glGenBuffers(1, VBO, 0); // Get A Valid Name
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO[0]); // Bind The Buffer
gl.glBufferData(GL.GL_ARRAY_BUFFER, bufferSize * 4 /*SIZEOF_FLOAT*/, buffer, GL2.GL_DYNAMIC_READ);
gl.glGenTextures(1, Texture, 0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, Texture[0]);
//gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
int width = 2, height = 2, border = 0;
//int width = 4, height = 4, border = 0;
byte bZero = (byte)0, bMin1 = (byte)0xFF;
ByteBuffer texData = NIOUtils.directCopy(ByteBuffer.wrap(new byte[] {
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1,
bMin1,bMin1,bMin1,bMin1, bMin1,bMin1,bMin1,bMin1
}), queue.getDevice().getByteOrder());
gl.glTexImage2D (
GL2.GL_TEXTURE_2D,
0, // no mipmap
4, // 4 colours
width,
height,
border,
GL.GL_LUMINANCE, GL2.GL_UNSIGNED_BYTE,
//GL.GL_RGBA, GL2.GL_UNSIGNED_INT_8_8_8_8,
texData
);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, 0);
gl.glFlush();
//gl.glFinish();
CLBuffer<Float> clbuf = context.createBufferFromGLBuffer(CLMem.Usage.Input, VBO[0]).as(Float.class);
CLImage2D climg = context.createImage2DFromGLTexture2D(CLMem.Usage.InputOutput, CLContext.GLTextureTarget.Texture2D, Texture[0], 0);
assertNotNull(clbuf);
assertNotNull(climg);
queue.enqueueAcquireGLObjects(new CLMem[] { clbuf });
queue.enqueueAcquireGLObjects(new CLMem[] { climg });
queue.finish();
{
GLObjectInfo info = clbuf.getGLObjectInfo();
assertNotNull(info);
assertEquals(CLMem.GLObjectType.Buffer, info.getType());
assertEquals(VBO[0], info.getName());
}
{
GLObjectInfo info = climg.getGLObjectInfo();
assertNotNull(info);
assertEquals(CLMem.GLObjectType.Texture2D, info.getType());
assertEquals(Texture[0], info.getName());
}
float expected = 10;
try {
CLKernel kernel = context.createProgram("__kernel void fill(__global float* out) { out[get_global_id(0)] = (float)" + expected + ";}").build().createKernel("fill", clbuf);
kernel.enqueueNDRange(queue, new int[]{bufferSize}).waitFor();
} catch (CLException.InvalidKernelArgs ex) {
assertTrue("GL-converted buffer was refused as kernel argument", false);
} catch (Throwable ex) {
assertTrue("Unexpected error : " + ex, false);
}
//inbuf.put(0, expected);
//clbuf.write(queue, 0, 4 * bufferSize, inbuf, true).waitFor();
queue.enqueueReleaseGLObjects(new CLMem[] { clbuf });
queue.finish();
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO[0]); // Bind The Buffer
ByteBuffer mb = gl.glMapBuffer(GL.GL_ARRAY_BUFFER, GL2.GL_READ_ONLY);
if (mb != null) {
buffer = mb.asFloatBuffer();
float val = buffer.get(0);
assertEquals(expected, val, 0);
}
}
} catch (AssertionError ex) {
ex.printStackTrace();
err[0] = ex;
} catch (Throwable ex) {
ex.printStackTrace();
exx[0] = ex;
} finally {
System.out.println("Releasing...");
sem.release();
}
}
public void dispose(GLAutoDrawable glad) {
throw new UnsupportedOperationException("Not supported yet.");
}
@SuppressWarnings("unused")
public void displayChanged(GLAutoDrawable glad, boolean bln, boolean bln1) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void display(GLAutoDrawable drawable) {
}
@Override
public void reshape(GLAutoDrawable drawable, int i, int i1, int i2, int i3) {
}
});
f.pack();
f.setVisible(true);
FPSAnimator animator = new FPSAnimator(canvas, 60);
//animator.setRunAsFastAsPossible(true);
animator.start();
System.out.println("Acquiring...");
sem.acquire();
System.out.println("Acquired !");
f.setVisible(false);
if (err[0] != null) {
throw err[0];
}
if (exx[0] != null) {
throw exx[0];
}
} catch (AssertionError ex) {
throw ex;
} catch (Throwable ex) {
Logger.getLogger(JOGLTest.class.getName()).log(Level.SEVERE, null, ex);
ex.printStackTrace();
assertTrue(ex.toString(), false);
}
}
}