diff --git a/src/java/org/lwjgl/PointerBuffer.java b/src/java/org/lwjgl/PointerBuffer.java index b731e263..3e81f698 100644 --- a/src/java/org/lwjgl/PointerBuffer.java +++ b/src/java/org/lwjgl/PointerBuffer.java @@ -289,6 +289,16 @@ public class PointerBuffer implements Comparable { return view.remaining(); } + /** + * Returns the number of bytes between the current position and the + * limit.

+ * + * @return The number of bytes remaining in this buffer + */ + public final int remainingByte() { + return remaining() * getPointerSize(); + } + /** * Tells whether there are any elements between the current position and * the limit.

diff --git a/src/java/org/lwjgl/PointerWrapperAbstract.java b/src/java/org/lwjgl/PointerWrapperAbstract.java index b6182044..972fb49f 100644 --- a/src/java/org/lwjgl/PointerWrapperAbstract.java +++ b/src/java/org/lwjgl/PointerWrapperAbstract.java @@ -87,6 +87,6 @@ public abstract class PointerWrapperAbstract implements PointerWrapper { } public String toString() { - return getClass().getSimpleName() + " pointer (0x" + Long.toHexString(pointer) + ")"; + return getClass().getSimpleName() + " pointer (0x" + Long.toHexString(pointer).toUpperCase() + ")"; } } \ No newline at end of file diff --git a/src/java/org/lwjgl/opencl/APIUtil.java b/src/java/org/lwjgl/opencl/APIUtil.java index 0f99081a..0c05645a 100644 --- a/src/java/org/lwjgl/opencl/APIUtil.java +++ b/src/java/org/lwjgl/opencl/APIUtil.java @@ -42,6 +42,11 @@ import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; +import static org.lwjgl.opencl.APPLEGLSharing.*; +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.EXTDeviceFission.*; +import static org.lwjgl.opencl.KHRGLSharing.*; + /** * Utility class for OpenCL API calls. * @@ -432,6 +437,19 @@ final class APIUtil { return extensions; } + static boolean isDevicesParam(final int param_name) { + switch ( param_name ) { + case CL_CONTEXT_DEVICES: + case CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR: + case CL_DEVICES_FOR_GL_CONTEXT_KHR: + case CL_CGL_DEVICE_FOR_CURRENT_VIRTUAL_SCREEN_APPLE: + case CL_CGL_DEVICES_FOR_SUPPORTED_VIRTUAL_SCREENS_APPLE: + return true; + } + + return false; + } + static CLPlatform getCLPlatform(final PointerBuffer properties) { long platformID = 0; @@ -441,7 +459,7 @@ final class APIUtil { if ( key == 0 ) break; - if ( key == 0x1084 ) { // CL_CONTEXT_PLATFORM + if ( key == CL_CONTEXT_PLATFORM ) { platformID = properties.get((k << 1) + 1); break; } @@ -452,7 +470,7 @@ final class APIUtil { final CLPlatform platform = CLPlatform.getCLPlatform(platformID); if ( platform == null ) - throw new IllegalStateException("Could not find a valid CLPlatform. Make sure clGetPlatformIDs has been used before creating a CLContext."); + throw new IllegalStateException("Could not find a valid CLPlatform. Make sure clGetPlatformIDs has been used before."); return platform; } @@ -546,25 +564,25 @@ final class APIUtil { } private static final ObjectDestructor DESTRUCTOR_CLSubDevice = new ObjectDestructor() { - public void release(final CLDevice object) { EXTDeviceFission.clReleaseDeviceEXT(object); } + public void release(final CLDevice object) { clReleaseDeviceEXT(object); } }; private static final ObjectDestructor DESTRUCTOR_CLMem = new ObjectDestructor() { - public void release(final CLMem object) { CL10.clReleaseMemObject(object); } + public void release(final CLMem object) { clReleaseMemObject(object); } }; private static final ObjectDestructor DESTRUCTOR_CLCommandQueue = new ObjectDestructor() { - public void release(final CLCommandQueue object) { CL10.clReleaseCommandQueue(object); } + public void release(final CLCommandQueue object) { clReleaseCommandQueue(object); } }; private static final ObjectDestructor DESTRUCTOR_CLSampler = new ObjectDestructor() { - public void release(final CLSampler object) { CL10.clReleaseSampler(object); } + public void release(final CLSampler object) { clReleaseSampler(object); } }; private static final ObjectDestructor DESTRUCTOR_CLProgram = new ObjectDestructor() { - public void release(final CLProgram object) { CL10.clReleaseProgram(object); } + public void release(final CLProgram object) { clReleaseProgram(object); } }; private static final ObjectDestructor DESTRUCTOR_CLKernel = new ObjectDestructor() { - public void release(final CLKernel object) { CL10.clReleaseKernel(object); } + public void release(final CLKernel object) { clReleaseKernel(object); } }; private static final ObjectDestructor DESTRUCTOR_CLEvent = new ObjectDestructor() { - public void release(final CLEvent object) { CL10.clReleaseEvent(object); } + public void release(final CLEvent object) { clReleaseEvent(object); } }; private interface ObjectDestructor { diff --git a/src/java/org/lwjgl/opencl/CLPlatform.java b/src/java/org/lwjgl/opencl/CLPlatform.java index 35f70e5a..e746f286 100644 --- a/src/java/org/lwjgl/opencl/CLPlatform.java +++ b/src/java/org/lwjgl/opencl/CLPlatform.java @@ -210,7 +210,7 @@ public final class CLPlatform extends CLObject { for ( int i = 0; i < count; i++ ) { final long id = devices.get(pos + i); if ( !clDevices.hasObject(id) ) - new CLDevice(devices.get(pos + i), this); + new CLDevice(id, this); } } @@ -226,7 +226,7 @@ public final class CLPlatform extends CLObject { final int offset = pos + (i * PointerBuffer.getPointerSize()); final long id = PointerBuffer.is64Bit() ? devices.getLong(offset) : devices.getInt(offset); if ( !clDevices.hasObject(id) ) - new CLDevice(devices.get(pos + i), this); + new CLDevice(id, this); } } diff --git a/src/java/org/lwjgl/opencl/InfoUtilFactory.java b/src/java/org/lwjgl/opencl/InfoUtilFactory.java index 41fbba2a..282d14b8 100644 --- a/src/java/org/lwjgl/opencl/InfoUtilFactory.java +++ b/src/java/org/lwjgl/opencl/InfoUtilFactory.java @@ -96,25 +96,31 @@ final class InfoUtilFactory { } /** Custom clCreateContext implementation (reuses APIUtil.getBufferPointer) */ - public CLContext create(final CLPlatform platform, final List devices, final CLContextCallback pfn_notify, final Drawable share_drawable, final IntBuffer errcode_ret) throws LWJGLException { + public CLContext create(final CLPlatform platform, final List devices, final CLContextCallback pfn_notify, final Drawable share_drawable, IntBuffer errcode_ret) throws LWJGLException { final int propertyCount = 2 + (share_drawable == null ? 0 : 4) + 1; - final PointerBuffer buffer = APIUtil.getBufferPointer(propertyCount + devices.size()); - buffer.put(CL_CONTEXT_PLATFORM).put(platform); + final PointerBuffer properties = APIUtil.getBufferPointer(propertyCount + devices.size()); + properties.put(CL_CONTEXT_PLATFORM).put(platform); if ( share_drawable != null ) - share_drawable.setCLSharingProperties(buffer); - buffer.put(0); + share_drawable.setCLSharingProperties(properties); + properties.put(0); - buffer.position(propertyCount); // Make sure we're at the right offset, setCLSharingProperties might not use all 4 positions. + properties.position(propertyCount); // Make sure we're at the right offset, setCLSharingProperties might not use all 4 positions. for ( CLDevice device : devices ) - buffer.put(device); + properties.put(device); final long function_pointer = CLCapabilities.clCreateContext; BufferChecks.checkFunctionAddress(function_pointer); + if ( errcode_ret != null ) + BufferChecks.checkBuffer(errcode_ret, 1); + else if ( LWJGLUtil.DEBUG ) + errcode_ret = APIUtil.getBufferInt(); final long user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify); CLContext __result = null; try { - __result = new CLContext(nclCreateContext(buffer.getBuffer(), 0, devices.size(), buffer.getBuffer(), propertyCount * PointerBuffer.getPointerSize(), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, errcode_ret, errcode_ret != null ? errcode_ret.position() : 0, function_pointer), platform); + __result = new CLContext(nclCreateContext(properties.getBuffer(), 0, devices.size(), properties.getBuffer(), propertyCount * PointerBuffer.getPointerSize(), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, errcode_ret, errcode_ret != null ? errcode_ret.position() : 0, function_pointer), platform); + if ( LWJGLUtil.DEBUG ) + Util.checkCLError(errcode_ret.get(0)); return __result; } finally { CallbackUtil.registerCallback(__result, user_data); @@ -282,7 +288,7 @@ final class InfoUtilFactory { return clGetMemObjectInfo(mem, param_name, param_value, param_value_size_ret); } - public CLMem createImage2D(final CLContext context, final long flags, final CLImageFormat image_format, final long image_width, final long image_height, final long image_row_pitch, final Buffer host_ptr, final IntBuffer errcode_ret) { + public CLMem createImage2D(final CLContext context, final long flags, final CLImageFormat image_format, final long image_width, final long image_height, final long image_row_pitch, final Buffer host_ptr, IntBuffer errcode_ret) { final ByteBuffer formatBuffer = APIUtil.getBufferByte(2 * 4); formatBuffer.putInt(0, image_format.getChannelOrder()); formatBuffer.putInt(4, image_format.getChannelType()); @@ -291,12 +297,18 @@ final class InfoUtilFactory { BufferChecks.checkFunctionAddress(function_pointer); if ( errcode_ret != null ) BufferChecks.checkBuffer(errcode_ret, 1); - return new CLMem(nclCreateImage2D(context.getPointer(), flags, formatBuffer, 0, image_width, image_height, image_row_pitch, host_ptr, - host_ptr != null ? BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(formatBuffer, image_width, image_height, image_row_pitch)) : 0, - errcode_ret, errcode_ret != null ? errcode_ret.position() : 0, function_pointer), context); + else if ( LWJGLUtil.DEBUG ) + errcode_ret = APIUtil.getBufferInt(); + + CLMem __result = new CLMem(nclCreateImage2D(context.getPointer(), flags, formatBuffer, 0, image_width, image_height, image_row_pitch, host_ptr, + host_ptr != null ? BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(formatBuffer, image_width, image_height, image_row_pitch)) : 0, + errcode_ret, errcode_ret != null ? errcode_ret.position() : 0, function_pointer), context); + if ( LWJGLUtil.DEBUG ) + Util.checkCLError(errcode_ret.get(0)); + return __result; } - public CLMem createImage3D(final CLContext context, final long flags, final CLImageFormat image_format, final long image_width, final long image_height, final long image_depth, final long image_row_pitch, final long image_slice_pitch, final Buffer host_ptr, final IntBuffer errcode_ret) { + public CLMem createImage3D(final CLContext context, final long flags, final CLImageFormat image_format, final long image_width, final long image_height, final long image_depth, final long image_row_pitch, final long image_slice_pitch, final Buffer host_ptr, IntBuffer errcode_ret) { final ByteBuffer formatBuffer = APIUtil.getBufferByte(2 * 4); formatBuffer.putInt(0, image_format.getChannelOrder()); formatBuffer.putInt(4, image_format.getChannelType()); @@ -305,9 +317,15 @@ final class InfoUtilFactory { BufferChecks.checkFunctionAddress(function_pointer); if ( errcode_ret != null ) BufferChecks.checkBuffer(errcode_ret, 1); - return new CLMem(nclCreateImage3D(context.getPointer(), flags, formatBuffer, 0, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, host_ptr, - host_ptr != null ? BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(formatBuffer, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch)) : 0, - errcode_ret, errcode_ret != null ? errcode_ret.position() : 0, function_pointer), context); + else if ( LWJGLUtil.DEBUG ) + errcode_ret = APIUtil.getBufferInt(); + + CLMem __result = new CLMem(nclCreateImage3D(context.getPointer(), flags, formatBuffer, 0, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, host_ptr, + host_ptr != null ? BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(formatBuffer, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch)) : 0, + errcode_ret, errcode_ret != null ? errcode_ret.position() : 0, function_pointer), context); + if ( LWJGLUtil.DEBUG ) + Util.checkCLError(errcode_ret.get(0)); + return __result; } public CLMem createSubBuffer(final CLMem mem, final long flags, final int buffer_create_type, final CLBufferRegion buffer_create_info, final IntBuffer errcode_ret) { @@ -317,7 +335,6 @@ final class InfoUtilFactory { infoBuffer.put(buffer_create_info.getSize()); return clCreateSubBuffer(mem, flags, buffer_create_type, infoBuffer.getBuffer(), errcode_ret); - } public ByteBuffer getInfoHostBuffer(final CLMem mem) { diff --git a/src/java/org/lwjgl/test/opencl/HelloOpenCL.java b/src/java/org/lwjgl/test/opencl/HelloOpenCL.java index 4bddddb8..485cc8b0 100644 --- a/src/java/org/lwjgl/test/opencl/HelloOpenCL.java +++ b/src/java/org/lwjgl/test/opencl/HelloOpenCL.java @@ -54,6 +54,9 @@ public class HelloOpenCL { CL.create(); final List platforms = CLPlatform.getPlatforms(); + if ( platforms == null ) + throw new RuntimeException("No OpenCL platforms found."); + for ( CLPlatform platform : platforms ) { System.out.println("\n-------------------------"); System.out.println("NEW PLATFORM: " + platform.getPointer()); diff --git a/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java b/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java index bc07cbcb..be4ec44e 100644 --- a/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java +++ b/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java @@ -67,6 +67,10 @@ public interface APPLE_gl_sharing { /** Error code returned by clGetGLContextInfoAPPLE if an invalid platform_gl_ctx is provided */ int CL_INVALID_GL_CONTEXT_APPLE = -1000; + @Code( + javaBeforeNative = "\t\tif ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer();", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) context.getParent().registerCLDevices(param_value, param_value_size_ret);" + ) @cl_int int clGetGLContextInfoAPPLE(@PointerWrapper("cl_context") CLContext context, @Check("1") @NativeType("cl_void") PointerBuffer platform_gl_ctx, diff --git a/src/templates/org/lwjgl/opencl/CL10.java b/src/templates/org/lwjgl/opencl/CL10.java index bcdcfb8b..0be0d27a 100644 --- a/src/templates/org/lwjgl/opencl/CL10.java +++ b/src/templates/org/lwjgl/opencl/CL10.java @@ -456,8 +456,8 @@ public interface CL10 { int clReleaseContext(@PointerWrapper("cl_context") CLContext context); @Code( - javaBeforeNative = "\t\tif ( param_name == CL_CONTEXT_DEVICES && param_value_size_ret == null ) param_value_size_ret = APIUtil.getBufferPointer();", - javaAfterNative = "\t\tif ( param_name == CL_CONTEXT_DEVICES && __result == CL_SUCCESS && param_value != null ) context.getParent().registerCLDevices(param_value, param_value_size_ret);" + javaBeforeNative = "\t\tif ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer();", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) context.getParent().registerCLDevices(param_value, param_value_size_ret);" ) @cl_int int clGetContextInfo(@PointerWrapper("cl_context") CLContext context, @@ -915,7 +915,7 @@ public interface CL10 { @cl_int int clGetProgramInfo2(@PointerWrapper("cl_program") CLProgram program, @Constant("CL_PROGRAM_BINARIES") @NativeType("cl_program_info") int param_name, - @Constant("sizes.remaining() * PointerBuffer.getPointerSize()") @size_t long param_value_size, + @Constant("sizes.remainingByte()") @size_t long param_value_size, @Helper(passToNative = true) @Check("1") @Const @NativeType("size_t") PointerBuffer sizes, @OutParameter @Check("APIUtil.getSize(sizes)") @PointerArray(value = "param_value_size", lengths = "sizes") @NativeType("cl_uchar") ByteBuffer param_value, @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); diff --git a/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java b/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java index 332d0779..535aa230 100644 --- a/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java +++ b/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java @@ -63,6 +63,10 @@ public interface KHR_gl_sharing { CL_WGL_HDC_KHR = 0x200B, CL_CGL_SHAREGROUP_KHR = 0x200C; + @Code( + javaBeforeNative = "\t\tif ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer();", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) APIUtil.getCLPlatform(properties).registerCLDevices(param_value, param_value_size_ret);" + ) @cl_int int clGetGLContextInfoKHR(@NullTerminated @Const @NativeType("cl_context_properties") PointerBuffer properties, @NativeType("cl_gl_context_info") int param_name,