Misc CL fixes.
This commit is contained in:
parent
662abf403b
commit
76f2e5bf67
|
@ -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>
|
||||
|
|
|
@ -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() + ")";
|
||||
}
|
||||
}
|
|
@ -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> {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue