From a970db1978b919e550b981a5f4c31c6efd7590c5 Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Fri, 4 Apr 2014 15:53:49 -0500 Subject: Use gluegen's JUnit in Eclipse This fixes problems when Eclipse's default JUnit is too old for our code. --- .classpath | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.classpath b/.classpath index 6f661528..deaae283 100644 --- a/.classpath +++ b/.classpath @@ -15,6 +15,6 @@ - + -- cgit v1.2.3 From 5abb164b19a244345672a0b0f37b6e9ca68da7ba Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Fri, 4 Apr 2014 15:55:35 -0500 Subject: Start adding texture interop test. The test here is still not complete, just checking in so I can switch branches. --- test/com/jogamp/opencl/gl/CLGLTest.java | 83 +++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/test/com/jogamp/opencl/gl/CLGLTest.java b/test/com/jogamp/opencl/gl/CLGLTest.java index b5d85690..e7906cec 100644 --- a/test/com/jogamp/opencl/gl/CLGLTest.java +++ b/test/com/jogamp/opencl/gl/CLGLTest.java @@ -33,6 +33,7 @@ package com.jogamp.opencl.gl; import com.jogamp.common.nio.Buffers; +import com.jogamp.opencl.CLBuffer; import com.jogamp.opencl.CLCommandQueue; import javax.media.opengl.GL2; @@ -51,6 +52,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 +228,87 @@ public class CLGLTest extends UITestCase { } +// @Test(timeout=15000) + @Test + public void textureSharing() { + + out.println(" - - - glcl; textureSharing - - - "); + if(MiscUtils.isOpenCLUnavailable()) + return; + + initGL(); + makeGLCurrent(); + assertTrue(glcontext.isCurrent()); + + @SuppressWarnings("unchecked") + CLPlatform platform = CLPlatform.getDefault(glSharing(glcontext)); + if(platform == null) { + out.println("test aborted"); + return; + } + + @SuppressWarnings("unchecked") + CLDevice device = platform.getMaxFlopsDevice(CLDeviceFilters.glSharing()); + out.println(device); + + CLGLContext context = CLGLContext.create(glcontext, device); + + try { + out.println(context); + + 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]); +// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); +// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); +// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_BASE_LEVEL, 0); +// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAX_LEVEL, 0); + + ByteBuffer bufferGL = Buffers.newDirectByteBuffer(new byte [] { + (byte)0, (byte)5, (byte)10, (byte)0xff, + (byte)15, (byte)20, (byte)25, (byte)0xff, + (byte)30, (byte)35, (byte)40, (byte)0xff, + (byte)45, (byte)50, (byte)55, (byte)0xff}); + bufferGL.rewind(); + gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGBA, 2, 2, 0, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, bufferGL); + gl.glBindTexture(GL2.GL_TEXTURE_2D, 0); + gl.glFinish(); + + // create CLGL buffer + ByteBuffer bufferCL = Buffers.newDirectByteBuffer(2*2*4); + CLGLTexture2d clTexture = context.createFromGLTexture2d(bufferCL, GL2.GL_TEXTURE_2D, id[0], 0, CLBuffer.Mem.READ_ONLY); + +// assertEquals(bufferGL.capacity(), clTexture.getCLCapacity()); +// assertEquals(bufferGL.capacity(), clTexture.getCLSize()); + + CLCommandQueue queue = device.createCommandQueue(); + + // read gl buffer into cl nio buffer + queue.putAcquireGLObject(clTexture) + .putReadImage(clTexture, true) + .putReleaseGLObject(clTexture); + + while(bufferCL.hasRemaining()) { + byte bGL = bufferGL.get(); + byte bCL = bufferCL.get(); + assertEquals(bGL, bCL); + } + + out.println(clTexture); + + clTexture.release(); + gl.glDeleteBuffers(1, id, 0); + } + finally { + context.release(); + deinitGL(); + } + } + private void makeGLCurrent() { // we are patient... while(true) { -- cgit v1.2.3 From 00f4325c5a46bf7c46be8646c1eb6f53b632f30a Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Sun, 6 Apr 2014 14:20:19 -0500 Subject: Finish texture sharing test. Make the test modify a GL texture with a CL kernel, then loop over the texture afterwards to check each texel has the right value. Also make the test loop over all platforms and devices that support sharing. --- src/com/jogamp/opencl/util/CLDeviceFilters.java | 2 +- src/com/jogamp/opencl/util/CLPlatformFilters.java | 18 +++- test/com/jogamp/opencl/gl/CLGLTest.java | 112 ++++++++++++++-------- 3 files changed, 88 insertions(+), 44 deletions(-) diff --git a/src/com/jogamp/opencl/util/CLDeviceFilters.java b/src/com/jogamp/opencl/util/CLDeviceFilters.java index a5057fb6..6281b844 100644 --- a/src/com/jogamp/opencl/util/CLDeviceFilters.java +++ b/src/com/jogamp/opencl/util/CLDeviceFilters.java @@ -70,7 +70,7 @@ public class CLDeviceFilters { } /** - * Accepts all devices which support OpenGL-OpenCL interoparability. + * Accepts all devices which support OpenGL-OpenCL interoperability. */ public static Filter glSharing() { return new Filter() { diff --git a/src/com/jogamp/opencl/util/CLPlatformFilters.java b/src/com/jogamp/opencl/util/CLPlatformFilters.java index 48d20916..14e1507e 100644 --- a/src/com/jogamp/opencl/util/CLPlatformFilters.java +++ b/src/com/jogamp/opencl/util/CLPlatformFilters.java @@ -67,7 +67,7 @@ public class CLPlatformFilters { } /** - * Accepts all platforms containing at least one devices of which supports OpenGL-OpenCL interoparability. + * Accepts all platforms containing at least one devices of which supports OpenGL-OpenCL interoperability. */ public static Filter glSharing() { return new Filter() { @@ -86,7 +86,7 @@ public class CLPlatformFilters { /** * Accepts all with the given OpenGL context compatible platforms containing at least one - * devices of which supports OpenGL-OpenCL interoparability. + * devices of which supports OpenGL-OpenCL interoperability. */ public static Filter glSharing(final GLContext context) { return new Filter() { @@ -94,10 +94,22 @@ public class CLPlatformFilters { public boolean accept(CLPlatform item) { String glVendor = context.getGL().glGetString(GL.GL_VENDOR); String clVendor = item.getVendor(); - return clVendor.equals(glVendor) && glFilter.accept(item); + return areVendorsCompatible(glVendor,clVendor) && glFilter.accept(item); } }; } + + /** + * We need this test because on at least some AMD cards, the GL vendor is ATI, + * but the CL vendor is AMD. + * @param glVendor OpenGL vendor string. + * @param clVendor OpenCL vendor string. + * @return true if the strings are either the same, or indicate that they're part of the same card. + */ + private static boolean areVendorsCompatible(final String glVendor, final String clVendor) { + return( clVendor.equals(glVendor) + || (glVendor.contains("ATI Technologies") && clVendor.contains("Advanced Micro Devices"))); + } /** * Accepts all platforms supporting the given extensions. diff --git a/test/com/jogamp/opencl/gl/CLGLTest.java b/test/com/jogamp/opencl/gl/CLGLTest.java index e7906cec..8c729c08 100644 --- a/test/com/jogamp/opencl/gl/CLGLTest.java +++ b/test/com/jogamp/opencl/gl/CLGLTest.java @@ -35,6 +35,8 @@ 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; @@ -228,8 +230,7 @@ public class CLGLTest extends UITestCase { } -// @Test(timeout=15000) - @Test + @Test(timeout=15000) public void textureSharing() { out.println(" - - - glcl; textureSharing - - - "); @@ -241,20 +242,32 @@ public class CLGLTest extends UITestCase { assertTrue(glcontext.isCurrent()); @SuppressWarnings("unchecked") - CLPlatform platform = CLPlatform.getDefault(glSharing(glcontext)); - if(platform == null) { - out.println("test aborted"); + CLPlatform [] clplatforms = CLPlatform.listCLPlatforms(glSharing(glcontext)); + if(clplatforms.length == 0) { + out.println("no platform that supports OpenGL-OpenCL interoperability"); return; } - @SuppressWarnings("unchecked") - CLDevice device = platform.getMaxFlopsDevice(CLDeviceFilters.glSharing()); - out.println(device); + for(CLPlatform clplatform : clplatforms) { + + @SuppressWarnings("unchecked") + CLDevice [] cldevices = clplatform.listCLDevices(CLDeviceFilters.glSharing()); + + for(CLDevice cldevice : cldevices) { + out.println(cldevice); + textureSharingInner(cldevice); + } + } + + deinitGL(); + } - CLGLContext context = CLGLContext.create(glcontext, device); + public void textureSharingInner(CLDevice cldevice) { + + CLGLContext clglcontext = CLGLContext.create(glcontext, cldevice); try { - out.println(context); + out.println(clglcontext); GL2 gl = glcontext.getGL().getGL2(); @@ -263,39 +276,59 @@ public class CLGLTest extends UITestCase { gl.glGenTextures(id.length, id, 0); gl.glActiveTexture(GL2.GL_TEXTURE0); gl.glBindTexture (GL2.GL_TEXTURE_2D, id[0]); -// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); -// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); -// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_BASE_LEVEL, 0); -// gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAX_LEVEL, 0); - - ByteBuffer bufferGL = Buffers.newDirectByteBuffer(new byte [] { - (byte)0, (byte)5, (byte)10, (byte)0xff, - (byte)15, (byte)20, (byte)25, (byte)0xff, - (byte)30, (byte)35, (byte)40, (byte)0xff, - (byte)45, (byte)50, (byte)55, (byte)0xff}); - bufferGL.rewind(); - gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGBA, 2, 2, 0, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, bufferGL); + 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(2*2*4); - CLGLTexture2d clTexture = context.createFromGLTexture2d(bufferCL, GL2.GL_TEXTURE_2D, id[0], 0, CLBuffer.Mem.READ_ONLY); - -// assertEquals(bufferGL.capacity(), clTexture.getCLCapacity()); -// assertEquals(bufferGL.capacity(), clTexture.getCLSize()); - - CLCommandQueue queue = device.createCommandQueue(); - - // read gl buffer into cl nio buffer + ByteBuffer bufferCL = Buffers.newDirectByteBuffer(texWidth*texHeight*4); + CLGLTexture2d clTexture = clglcontext.createFromGLTexture2d(bufferCL, GL2.GL_TEXTURE_2D, id[0], 0, CLBuffer.Mem.READ_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(int y=1; y<=h; ++y) { \n" + + " for(int 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) - .putReadImage(clTexture, true) - .putReleaseGLObject(clTexture); - - while(bufferCL.hasRemaining()) { - byte bGL = bufferGL.get(); - byte bCL = bufferCL.get(); - assertEquals(bGL, bCL); + .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); @@ -304,8 +337,7 @@ public class CLGLTest extends UITestCase { gl.glDeleteBuffers(1, id, 0); } finally { - context.release(); - deinitGL(); + clglcontext.release(); } } -- cgit v1.2.3 From f98767152049ac141e115dcbb6a6ac66f4831d6a Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Sun, 6 Apr 2014 15:05:46 -0500 Subject: Fix CL-GL interoperability tests on Mac. Fixed detection of compatible interoperability platforms (was silently skipping platform because GL vendor was Nvidia, but CL vendor was Apple). Also fixed CL kernel syntax error about signed-unsigned comparison that ATI's driver on Windows didn't find, and fixed the CL memory object to be write-only instead of read-only (which ATI's Windows driver just ignored). --- src/com/jogamp/opencl/util/CLPlatformFilters.java | 8 +++++--- test/com/jogamp/opencl/gl/CLGLTest.java | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/com/jogamp/opencl/util/CLPlatformFilters.java b/src/com/jogamp/opencl/util/CLPlatformFilters.java index 14e1507e..451c6b1f 100644 --- a/src/com/jogamp/opencl/util/CLPlatformFilters.java +++ b/src/com/jogamp/opencl/util/CLPlatformFilters.java @@ -100,15 +100,17 @@ public class CLPlatformFilters { } /** - * We need this test because on at least some AMD cards, the GL vendor is ATI, - * but the CL vendor is AMD. + * We need this test because: + * - On at least some AMD cards, the GL vendor is ATI, but the CL vendor is AMD. + * - On at least some Macs, the GL vendor is Nvidia, but the CL vendor is Apple. * @param glVendor OpenGL vendor string. * @param clVendor OpenCL vendor string. * @return true if the strings are either the same, or indicate that they're part of the same card. */ private static boolean areVendorsCompatible(final String glVendor, final String clVendor) { return( clVendor.equals(glVendor) - || (glVendor.contains("ATI Technologies") && clVendor.contains("Advanced Micro Devices"))); + || (glVendor.contains("ATI Technologies") && clVendor.contains("Advanced Micro Devices")) + || (glVendor.contains("NVIDIA Corporation") && clVendor.contains("Apple"))); } /** diff --git a/test/com/jogamp/opencl/gl/CLGLTest.java b/test/com/jogamp/opencl/gl/CLGLTest.java index 8c729c08..8c477002 100644 --- a/test/com/jogamp/opencl/gl/CLGLTest.java +++ b/test/com/jogamp/opencl/gl/CLGLTest.java @@ -284,13 +284,13 @@ public class CLGLTest extends UITestCase { // create CLGL buffer ByteBuffer bufferCL = Buffers.newDirectByteBuffer(texWidth*texHeight*4); - CLGLTexture2d clTexture = clglcontext.createFromGLTexture2d(bufferCL, GL2.GL_TEXTURE_2D, id[0], 0, CLBuffer.Mem.READ_ONLY); + CLGLTexture2d 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(int y=1; y<=h; ++y) { \n" + - " for(int x=1; x<=w; ++x) { \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" + -- cgit v1.2.3 From 73313eb44d89faab8d502d780acfb07888b41ad3 Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Sun, 13 Apr 2014 16:04:16 -0500 Subject: Fix direct buffer usage in lowLevelVectorAddTest Increase buffer size and rewind before reuse in every possible place. This is to try to remove a couple of remaining failures on some platforms. The failure causes an abnormal JVM exit without a stack trace when System.gc() is called during teardown. --- test/com/jogamp/opencl/LowLevelBindingTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/com/jogamp/opencl/LowLevelBindingTest.java b/test/com/jogamp/opencl/LowLevelBindingTest.java index 52d74882..803fab91 100644 --- a/test/com/jogamp/opencl/LowLevelBindingTest.java +++ b/test/com/jogamp/opencl/LowLevelBindingTest.java @@ -259,7 +259,7 @@ public class LowLevelBindingTest extends UITestCase { // Was originally 4096, but had to make this bigger or it would crash in UITestCase.oneTimeTearDown(){ System.gc() } // without even dumping a stack when using AMD drivers. Presumably the drivers would write past the end // of the block and mess up GC info somehow. - ByteBuffer bb = newDirectByteBuffer(8192); + ByteBuffer bb = newDirectByteBuffer(32768); ret = cl.clGetContextInfo(context, CL.CL_CONTEXT_DEVICES, bb.capacity(), bb, null); checkError("on clGetContextInfo", ret); @@ -273,6 +273,7 @@ public class LowLevelBindingTest extends UITestCase { offset *= (is32Bit() ? 4 : 8); long device = is32Bit()?bb.getInt(offset):bb.getLong(offset); + bb.rewind(); ret = cl.clGetDeviceInfo(device, CL.CL_DEVICE_MAX_WORK_GROUP_SIZE, bb.capacity(), bb, null); checkError("on clGetDeviceInfo", ret); int maxWGS = bb.getInt(); @@ -358,11 +359,13 @@ public class LowLevelBindingTest extends UITestCase { out.println("program source length (cl): "+longBuffer.get(0)); out.println("program source length (java): "+programSource.length()); + bb.rewind(); ret = cl.clGetProgramInfo(program, CL.CL_PROGRAM_SOURCE, bb.capacity(), bb, null); checkError("on clGetProgramInfo CL_PROGRAM_SOURCE", ret); out.println("program source:\n" + clString2JavaString(bb, (int)longBuffer.get(0))); // Check program status + bb.rewind(); ret = cl.clGetProgramBuildInfo(program, device, CL.CL_PROGRAM_BUILD_STATUS, bb.capacity(), bb, null); checkError("on clGetProgramBuildInfo1", ret); -- cgit v1.2.3 From 82991ad1277fd31c54c08d3c1b74f921fcc585d0 Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Sat, 26 Apr 2014 14:40:03 -0500 Subject: Fix build instructions Fixed the build instructions to reflect the changes that bring JOCL into line with the other JogAmp modules. Also fixed dead links and updated the version of OpenCL we point to. --- doc/HowToBuild.html | 55 ++++++++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/doc/HowToBuild.html b/doc/HowToBuild.html index 2ae6f4cc..927ef72e 100644 --- a/doc/HowToBuild.html +++ b/doc/HowToBuild.html @@ -39,14 +39,15 @@

External References

External Tutorials

OpenCL @@ -56,31 +57,30 @@

Prerequisites


- Follow all steps described in How to build JOGL, - since GlueGen and JOGL are required as compiletime dependencies. + Follow all steps described in How to build JOGL, + since GlueGen and JOGL are required as compile-time dependencies.

Platform and Component Requirements


- To verify the build you will have to install a OpenCL implementation on your platform. + To run the tests included with JOCL, you will have to install an OpenCL implementation on your platform.

- Some vendors ship OpenCL already with the graphics driver or operating system. - So please make sure your system is up2date. + Some vendors include OpenCL with the graphics driver or operating system. + So please make sure your system is up to date.

OpenCL SDKs for the desktop:
    -
  • GPU NVidia Geforce >= 8
    +
  • NVidia GPU Geforce >= 8
  • -
  • GPU AMD or
  • -
  • CPU x86 x86_64 SSE3 +
  • AMD GPU or CPU
  • -
  • CPU Intel +
  • Intel CPU @@ -90,16 +90,13 @@

    Build Steps


    - Here are the steps that are required in order to build JOCL. + Here are the steps required to build JOCL.

      -
    1. Optain the source code using git: - - - It is important that you checkout the source project side by side to its dependencies: +
    2. Check out and build Gluegen and JOGL as described here.
    3. +
    4. Get the JOCL source code from the JOCL Git repository. + It is important that you check out the source code side by side with its dependencies:
           /home/dude/projects/jogamp> git clone git://jogamp.org/srv/scm/jocl.git jocl
                                   
      @@ -110,23 +107,17 @@ /home/dude/projects/jogamp/jogl /home/dude/projects/jogamp/jocl - you can now open the projects with NetBeans or proceed with:
    5. Build the source tree:
      - Open a command shell in the "jocl" directory of the source tree and type "ant jar". + Open a command shell in the "jocl/make" directory of the source tree and type + "ant clean", then "ant".
    6. -
    7. Test your build:
      Stay in your command shell in the "jocl" directory of the source tree and type "ant test".
    8. -
    9. Build Javadoc:
      Stay in your command shell in the "jocl" directory of the source tree and type "ant javadoc". +
    10. Test your build:
      Stay in your command shell in the "jocl/make" directory of the source tree and type "ant junit.run".
    11. +
    12. Build Javadoc:
      Stay in your command shell in the "jocl/make" directory of the source tree and type "ant javadoc". This will produce the end-user documentation for JOCL.
    - -

    Common build problems

    - -
      -
    • TODO
    • -