aboutsummaryrefslogtreecommitdiffstats
path: root/test/com/jogamp
diff options
context:
space:
mode:
authorWade Walker <[email protected]>2014-04-13 16:52:01 -0500
committerWade Walker <[email protected]>2014-04-13 16:52:01 -0500
commit5ba5c8d1e14e0e9edb087c091586c6c14e037fb4 (patch)
tree47b97589145402fc7d95d4473aae23dd1bc29a43 /test/com/jogamp
parent73313eb44d89faab8d502d780acfb07888b41ad3 (diff)
parentf98767152049ac141e115dcbb6a6ac66f4831d6a (diff)
Merge branch 'bug_1003_add_texture_interop_test'
Diffstat (limited to 'test/com/jogamp')
-rw-r--r--test/com/jogamp/opencl/gl/CLGLTest.java115
1 files changed, 115 insertions, 0 deletions
diff --git a/test/com/jogamp/opencl/gl/CLGLTest.java b/test/com/jogamp/opencl/gl/CLGLTest.java
index b5d85690..8c477002 100644
--- a/test/com/jogamp/opencl/gl/CLGLTest.java
+++ b/test/com/jogamp/opencl/gl/CLGLTest.java
@@ -33,7 +33,10 @@
package com.jogamp.opencl.gl;
import com.jogamp.common.nio.Buffers;
+import com.jogamp.opencl.CLBuffer;
import com.jogamp.opencl.CLCommandQueue;
+import com.jogamp.opencl.CLKernel;
+import com.jogamp.opencl.CLProgram;
import javax.media.opengl.GL2;
import javax.media.opengl.GLException;
@@ -51,6 +54,7 @@ import com.jogamp.opencl.util.CLDeviceFilters;
import com.jogamp.opencl.util.CLPlatformFilters;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import javax.media.opengl.GLCapabilities;
@@ -226,6 +230,117 @@ public class CLGLTest extends UITestCase {
}
+ @Test(timeout=15000)
+ public void textureSharing() {
+
+ out.println(" - - - glcl; textureSharing - - - ");
+ if(MiscUtils.isOpenCLUnavailable())
+ return;
+
+ initGL();
+ makeGLCurrent();
+ assertTrue(glcontext.isCurrent());
+
+ @SuppressWarnings("unchecked")
+ CLPlatform [] clplatforms = CLPlatform.listCLPlatforms(glSharing(glcontext));
+ if(clplatforms.length == 0) {
+ out.println("no platform that supports OpenGL-OpenCL interoperability");
+ return;
+ }
+
+ for(CLPlatform clplatform : clplatforms) {
+
+ @SuppressWarnings("unchecked")
+ CLDevice [] cldevices = clplatform.listCLDevices(CLDeviceFilters.glSharing());
+
+ for(CLDevice cldevice : cldevices) {
+ out.println(cldevice);
+ textureSharingInner(cldevice);
+ }
+ }
+
+ deinitGL();
+ }
+
+ public void textureSharingInner(CLDevice cldevice) {
+
+ CLGLContext clglcontext = CLGLContext.create(glcontext, cldevice);
+
+ try {
+ out.println(clglcontext);
+
+ GL2 gl = glcontext.getGL().getGL2();
+
+ // create and write GL texture
+ int[] id = new int[1];
+ gl.glGenTextures(id.length, id, 0);
+ gl.glActiveTexture(GL2.GL_TEXTURE0);
+ gl.glBindTexture (GL2.GL_TEXTURE_2D, id[0]);
+ int texWidth = 2;
+ int texHeight = 2;
+ gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGBA, texWidth, texHeight, 0, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, null );
+ gl.glBindTexture(GL2.GL_TEXTURE_2D, 0);
+ gl.glFinish();
+
+ // create CLGL buffer
+ ByteBuffer bufferCL = Buffers.newDirectByteBuffer(texWidth*texHeight*4);
+ CLGLTexture2d<ByteBuffer> clTexture = clglcontext.createFromGLTexture2d(bufferCL, GL2.GL_TEXTURE_2D, id[0], 0, CLBuffer.Mem.WRITE_ONLY);
+
+ // set texel values to a formula that can be read back and verified
+ String sourceCL = "__kernel void writeTexture (__write_only image2d_t imageTex, unsigned w, unsigned h ) \n" +
+ "{ \n" +
+ " for(unsigned y=1; y<=h; ++y) { \n" +
+ " for(unsigned x=1; x<=w; ++x) { \n" +
+ " write_imagef(imageTex, (int2)(x-1,y-1), (float4)(((float)x)/((float)(4*w)), ((float)y)/((float)(4*h)), 0.0f, 1.0f)); \n" +
+ " } \n" +
+ " } \n" +
+ "}";
+ CLProgram program = clglcontext.createProgram(sourceCL);
+ program.build();
+ System.out.println(program.getBuildStatus());
+ System.out.println(program.getBuildLog());
+ assertTrue(program.isExecutable());
+
+ CLKernel clkernel = program.createCLKernel("writeTexture")
+ .putArg(clTexture)
+ .putArg(texWidth)
+ .putArg(texHeight)
+ .rewind();
+
+ CLCommandQueue queue = cldevice.createCommandQueue();
+
+ // write gl texture with cl kernel, then read it to host buffer
+ queue.putAcquireGLObject(clTexture)
+ .put1DRangeKernel(clkernel, 0, 1, 1)
+ .putReadImage(clTexture, true)
+ .putReleaseGLObject(clTexture)
+ .finish();
+
+ for(int y = 1; y <= texHeight; y++) {
+ for(int x = 1; x <= texWidth; x++) {
+ byte bX = bufferCL.get();
+ byte bY = bufferCL.get();
+ byte bZero = bufferCL.get();
+ byte bMinusOne = bufferCL.get();
+ byte bXCheck = (byte)(((float)x)/((float)(4*texWidth))*256);
+ byte bYCheck = (byte)(((float)y)/((float)(4*texHeight))*256);
+ assertEquals(bXCheck, bX);
+ assertEquals(bYCheck, bY);
+ assertEquals(0, bZero);
+ assertEquals(-1, bMinusOne);
+ }
+ }
+
+ out.println(clTexture);
+
+ clTexture.release();
+ gl.glDeleteBuffers(1, id, 0);
+ }
+ finally {
+ clglcontext.release();
+ }
+ }
+
private void makeGLCurrent() {
// we are patient...
while(true) {