Misc CL fixes.

This commit is contained in:
Ioannis Tsakpinis 2010-09-30 23:36:37 +00:00
parent 662abf403b
commit 76f2e5bf67
9 changed files with 88 additions and 32 deletions

View File

@ -289,6 +289,16 @@ public class PointerBuffer implements Comparable {
return view.remaining();
}
/**
* Returns the number of bytes between the current position and the
* limit. </p>
*
* @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. </p>

View File

@ -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() + ")";
}
}

View File

@ -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<CLDevice> DESTRUCTOR_CLSubDevice = new ObjectDestructor<CLDevice>() {
public void release(final CLDevice object) { EXTDeviceFission.clReleaseDeviceEXT(object); }
public void release(final CLDevice object) { clReleaseDeviceEXT(object); }
};
private static final ObjectDestructor<CLMem> DESTRUCTOR_CLMem = new ObjectDestructor<CLMem>() {
public void release(final CLMem object) { CL10.clReleaseMemObject(object); }
public void release(final CLMem object) { clReleaseMemObject(object); }
};
private static final ObjectDestructor<CLCommandQueue> DESTRUCTOR_CLCommandQueue = new ObjectDestructor<CLCommandQueue>() {
public void release(final CLCommandQueue object) { CL10.clReleaseCommandQueue(object); }
public void release(final CLCommandQueue object) { clReleaseCommandQueue(object); }
};
private static final ObjectDestructor<CLSampler> DESTRUCTOR_CLSampler = new ObjectDestructor<CLSampler>() {
public void release(final CLSampler object) { CL10.clReleaseSampler(object); }
public void release(final CLSampler object) { clReleaseSampler(object); }
};
private static final ObjectDestructor<CLProgram> DESTRUCTOR_CLProgram = new ObjectDestructor<CLProgram>() {
public void release(final CLProgram object) { CL10.clReleaseProgram(object); }
public void release(final CLProgram object) { clReleaseProgram(object); }
};
private static final ObjectDestructor<CLKernel> DESTRUCTOR_CLKernel = new ObjectDestructor<CLKernel>() {
public void release(final CLKernel object) { CL10.clReleaseKernel(object); }
public void release(final CLKernel object) { clReleaseKernel(object); }
};
private static final ObjectDestructor<CLEvent> DESTRUCTOR_CLEvent = new ObjectDestructor<CLEvent>() {
public void release(final CLEvent object) { CL10.clReleaseEvent(object); }
public void release(final CLEvent object) { clReleaseEvent(object); }
};
private interface ObjectDestructor<T extends CLObjectChild> {

View File

@ -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);
}
}

View File

@ -96,25 +96,31 @@ final class InfoUtilFactory {
}
/** Custom clCreateContext implementation (reuses APIUtil.getBufferPointer) */
public CLContext create(final CLPlatform platform, final List<CLDevice> devices, final CLContextCallback pfn_notify, final Drawable share_drawable, final IntBuffer errcode_ret) throws LWJGLException {
public CLContext create(final CLPlatform platform, final List<CLDevice> 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) {

View File

@ -54,6 +54,9 @@ public class HelloOpenCL {
CL.create();
final List<CLPlatform> 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());

View File

@ -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,

View File

@ -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);

View File

@ -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,