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,