Added support for OpenCL 1.2 [UNTESTED]

This commit is contained in:
Ioannis Tsakpinis 2011-11-16 14:36:28 +00:00
parent fb788c9ec1
commit ad7769f9c9
22 changed files with 943 additions and 166 deletions

View File

@ -36,13 +36,10 @@
<include name="org/lwjgl/opencl/CLPlatform.java"/>
<include name="org/lwjgl/opencl/CLDevice.java"/>
<include name="org/lwjgl/opencl/CLContext.java"/>
<include name="org/lwjgl/opencl/CLContextCallback.java"/>
<include name="org/lwjgl/opencl/CLCommandQueue.java"/>
<include name="org/lwjgl/opencl/CLMem.java"/>
<include name="org/lwjgl/opencl/CLMemObjectDestructorCallback.java"/>
<include name="org/lwjgl/opencl/CLBuildProgramCallback.java"/>
<include name="org/lwjgl/opencl/CL*Callback.java"/>
<include name="org/lwjgl/opencl/CLNativeKernel.java"/>
<include name="org/lwjgl/opencl/CLEventCallback.java"/>
<include name="org/lwjgl/opencl/CLFunctionAddress.java"/>
</javac>
</target>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002-2010 LWJGL Project
* Copyright (c) 2002-2011 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -31,8 +31,6 @@
*/
package org.lwjgl.opencl;
import org.lwjgl.PointerWrapperAbstract;
/**
* Instances of this class can be used to receive OpenCL program build notifications.
* A single CLBuildProgramCallback instance should only be used with programs created
@ -40,37 +38,6 @@ import org.lwjgl.PointerWrapperAbstract;
*
* @author Spasi
*/
public abstract class CLBuildProgramCallback extends PointerWrapperAbstract {
private CLContext context;
protected CLBuildProgramCallback() {
super(CallbackUtil.getBuildProgramCallback());
}
/**
* Sets the context that contains the CLPrograms to which we're registered.
*
* @param context the CLContext object
*/
void setContext(final CLContext context) {
this.context = context;
}
/**
* Called from native code.
*
* @param program_address the CLProgram object pointer
*/
private void handleMessage(long program_address) {
handleMessage(context.getCLProgram(program_address));
}
/**
* The callback method.
*
* @param program the CLProgram object that was built
*/
protected abstract void handleMessage(CLProgram program);
public abstract class CLBuildProgramCallback extends CLProgramCallback {
}

View File

@ -53,23 +53,23 @@ final class CLChecks {
/**
* Calculates the number of bytes in the specified cl_mem buffer rectangle region.
*
* @param origin the host origin
* @param offset the host offset
* @param region the rectangle region
* @param row_pitch the host row pitch
* @param slice_pitch the host slice pitch
*
* @return the region size in bytes
*/
static int calculateBufferRectSize(final PointerBuffer origin, final PointerBuffer region, long row_pitch, long slice_pitch) {
static int calculateBufferRectSize(final PointerBuffer offset, final PointerBuffer region, long row_pitch, long slice_pitch) {
if ( !LWJGLUtil.CHECKS )
return 0;
final long x = origin.get(0);
final long y = origin.get(1);
final long z = origin.get(2);
final long x = offset.get(0);
final long y = offset.get(1);
final long z = offset.get(2);
if ( LWJGLUtil.DEBUG && (x < 0 || y < 0 || z < 0) )
throw new IllegalArgumentException("Invalid cl_mem host origin: " + x + ", " + y + ", " + z);
throw new IllegalArgumentException("Invalid cl_mem host offset: " + x + ", " + y + ", " + z);
final long w = region.get(0);
final long h = region.get(1);

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2002-2011 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opencl;
/**
* Instances of this class can be used to receive OpenCL program compilation notifications.
* A single CLCompileProgramCallback instance should only be used with programs created
* in the same CLContext.
*
* @author Spasi
*/
public abstract class CLCompileProgramCallback extends CLProgramCallback {
}

View File

@ -49,10 +49,14 @@ public final class CLContext extends CLObjectChild<CLPlatform> {
private static final CLContextUtil util = (CLContextUtil)CLPlatform.getInfoUtilInstance(CLContext.class, "CL_CONTEXT_UTIL");
private final CLObjectRegistry<CLCommandQueue> clCommandQueues;
private final CLObjectRegistry<CLMem> clMems;
private final CLObjectRegistry<CLSampler> clSamplers;
private final CLObjectRegistry<CLProgram> clPrograms;
private final CLObjectRegistry<CLEvent> clEvents;
private final CLObjectRegistry<CLMem> clMems;
private final CLObjectRegistry<CLSampler> clSamplers;
private final CLObjectRegistry<CLProgram> clPrograms;
private final CLObjectRegistry<CLEvent> clEvents;
private long
contextCallback,
printfCallback;
CLContext(final long pointer, final CLPlatform platform) {
super(pointer, platform);
@ -269,4 +273,50 @@ public final class CLContext extends CLObjectChild<CLPlatform> {
CLObjectRegistry<CLEvent> getCLEventRegistry() { return clEvents; }
private boolean checkCallback(final long callback, final int result) {
if ( result == 0 && (callback == 0 || isValid()) )
return true;
if ( callback != 0 )
CallbackUtil.deleteGlobalRef(callback);
return false;
}
/**
* Associates this context with the specified context callback reference. If the context
* is invalid, the callback reference is deleted. NO-OP if user_data is 0.
*
* @param callback the context callback pointer
*/
void setContextCallback(final long callback) {
if ( checkCallback(callback, 0) )
this.contextCallback = callback;
}
/**
* Associates this context with the specified printf callback reference. If the context
* is invalid, the callback reference is deleted. NO-OP if user_data is 0.
*
* @param callback the printf callback pointer
*/
void setPrintfCallback(final long callback, final int result) {
if ( checkCallback(callback, result) )
this.printfCallback = callback;
}
/**
* Decrements the context's reference count. If the reference
* count hits zero, it also deletes
* any callback objects associated with it.
*/
void releaseImpl() {
if ( release() > 0 )
return;
if ( contextCallback != 0 )
CallbackUtil.deleteGlobalRef(contextCallback);
if ( printfCallback != 0 )
CallbackUtil.deleteGlobalRef(printfCallback);
}
}

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2002-2011 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opencl;
/**
* Instances of this class can be used to receive OpenCL program linkage notifications.
* A single CLLinkProgramCallback instance should only be used with programs created
* in the same CLContext.
*
* @author Spasi
*/
public abstract class CLLinkProgramCallback extends CLProgramCallback {
}

View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 2002-2011 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opencl;
import org.lwjgl.PointerWrapperAbstract;
/**
* Instances of this class can be used to receive OpenCL printf messages.
* Different CLContexts should use different CLPrintfCallback instances.
*
* @author Spasi
*/
public abstract class CLPrintfCallback extends PointerWrapperAbstract {
protected CLPrintfCallback() {
super(CallbackUtil.getPrintfCallback());
}
/** The callback method. */
protected abstract void handleMessage(String data);
}

View File

@ -0,0 +1,74 @@
/*
* Copyright (c) 2002-2011 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opencl;
import org.lwjgl.PointerWrapperAbstract;
/**
* Base class for OpenCL program action notifications.
*
* @author Spasi
*/
abstract class CLProgramCallback extends PointerWrapperAbstract {
private CLContext context;
protected CLProgramCallback() {
super(CallbackUtil.getProgramCallback());
}
/**
* Sets the context that contains the CLPrograms to which we're registered.
*
* @param context the CLContext object
*/
final void setContext(final CLContext context) {
this.context = context;
}
/**
* Called from native code.
*
* @param program_address the CLProgram object pointer
*/
private void handleMessage(long program_address) {
handleMessage(context.getCLProgram(program_address));
}
/**
* The callback method.
*
* @param program the CLProgram object affected
*/
protected abstract void handleMessage(CLProgram program);
}

View File

@ -70,7 +70,7 @@ final class CallbackUtil {
*
* @param ref the GlobalRef memory address.
*/
private static native void deleteGlobalRef(long ref);
static native void deleteGlobalRef(long ref);
/**
* Deletes the global reference represented by user_data if an OpenCL error occured.
@ -99,40 +99,6 @@ final class CallbackUtil {
*/
static native long getContextCallback();
/**
* Associates the specified CLContext with the specified global reference. If the context
* is invalid, the global reference is deleted. NO-OP if user_data is 0.
*
* @param context the CLContext to register
* @param user_data the global reference pointer
*/
static void registerCallback(final CLContext context, final long user_data) {
if ( user_data == 0 )
return;
if ( context.isValid() )
contextUserData.put(context, user_data);
else
deleteGlobalRef(user_data);
}
/**
* Decrements the specified context's reference count, clears its association
* with a CLContextCallback object if it exists and deletes the corresponding
* global reference.
*
* @param context the CLContext to unregister
*/
static void unregisterCallback(final CLContext context) {
if ( context.release() > 0 )
return;
final Long user_data = contextUserData.remove(context);
if ( user_data != null )
deleteGlobalRef(user_data);
}
/* [ Other callback functionality ]
The other callbacks are simpler. We create the GlobalRef before passing the callback,
we delete it when we receive the callback call.
@ -150,7 +116,7 @@ final class CallbackUtil {
*
* @return the callback function address
*/
static native long getBuildProgramCallback();
static native long getProgramCallback();
/**
* Returns the memory address of the native function we pass to clEnqueueNativeKernel.
@ -166,6 +132,13 @@ final class CallbackUtil {
*/
static native long getEventCallback();
/**
* Returns the memory address of the native function we pass to clSetPrintfCallback.
*
* @return the callback function address
*/
static native long getPrintfCallback();
/**
* Returns the memory address of the native function we pass to clCreateContext(FromType),
* when <code>APPLEContextLoggingUtil.SYSTEM_LOG_CALLBACK</code> is used.

View File

@ -123,7 +123,7 @@ final class InfoUtilFactory {
Util.checkCLError(errcode_ret.get(0));
return __result;
} finally {
CallbackUtil.registerCallback(__result, user_data);
if ( __result != null ) __result.setContextCallback(user_data);
}
}

View File

@ -373,20 +373,22 @@ public class Utils {
if ( param != null && p.getSimpleName().equals(param.getSimpleName()) )
break;
if ( p.getAnnotation(NullTerminated.class) != null )
continue;
final Class type = Utils.getJavaType(p.getType());
if ( type.equals(CharSequence.class) ) {
if ( offset == null )
offset = p.getSimpleName() + ".length()";
else
offset += " + " + p.getSimpleName() + ".length()";
if ( p.getAnnotation(NullTerminated.class) != null ) offset += " + 1";
//if ( p.getAnnotation(NullTerminated.class) != null ) offset += " + 1";
} else if ( type.equals(CharSequence[].class) ) {
if ( offset == null )
offset = "APIUtil.getTotalLength(" + p.getSimpleName() + ")";
else
offset += " + APIUtil.getTotalLength(" + p.getSimpleName() + ")";
if ( p.getAnnotation(NullTerminated.class) != null ) offset += " + " + p.getSimpleName() + ".length";
//if ( p.getAnnotation(NullTerminated.class) != null ) offset += " + " + p.getSimpleName() + ".length";
}
}

View File

@ -51,7 +51,7 @@ public class CLPDCapabilitiesGenerator {
// TODO: Add future versions here
private static final int[][] CL_VERSIONS = {
{ 1 }, // OpenCL 1
{ 1, 2 }, // OpenCL 1
};
static void generateClassPrologue(final PrintWriter writer, final String name) {

View File

@ -61,9 +61,10 @@ typedef GLsync cl_GLsync;
typedef void (CL_CALLBACK * cl_create_context_callback)(const char *errinfo, const void *private_info, size_t cb, void *user_data);
typedef void (CL_CALLBACK * cl_mem_object_destructor_callback)(cl_mem memobj, void *user_data);
typedef void (CL_CALLBACK * cl_build_program_callback)(cl_program program, void *user_data);
typedef void (CL_CALLBACK * cl_program_callback)(cl_program program, void *user_data);
typedef void (CL_CALLBACK * cl_event_callback)(cl_event event, cl_int event_command_exec_status, void *user_data);
typedef void (CL_CALLBACK * cl_native_kernel_func)(void *args);
typedef void (CL_CALLBACK * cl_printf_callback)(cl_context context, cl_uint printf_data_len, char *printf_data_ptr, void *user_data);
// -----------------[ Cross-platform functions ]-----------------

View File

@ -20,8 +20,10 @@ typedef cl_uint cl_device_mem_cache_type;
typedef cl_uint cl_device_local_mem_type;
typedef cl_bitfield cl_device_exec_capabilities;
typedef cl_bitfield cl_command_queue_properties;
typedef intptr_t cl_device_partition_property;
typedef cl_bitfield cl_device_affinity_domain;
typedef intptr_t cl_context_properties;
typedef intptr_t cl_context_properties;
typedef cl_uint cl_context_info;
typedef cl_uint cl_command_queue_info;
typedef cl_uint cl_channel_order;
@ -29,6 +31,7 @@ typedef cl_uint cl_channel_type;
typedef cl_bitfield cl_mem_flags;
typedef cl_uint cl_mem_object_type;
typedef cl_uint cl_mem_info;
typedef cl_bitfield cl_mem_migration_flags;
typedef cl_uint cl_image_info;
typedef cl_uint cl_buffer_create_type;
typedef cl_uint cl_addressing_mode;
@ -37,8 +40,12 @@ typedef cl_uint cl_sampler_info;
typedef cl_bitfield cl_map_flags;
typedef cl_uint cl_program_info;
typedef cl_uint cl_program_build_info;
typedef cl_uint cl_program_binary_type;
typedef cl_int cl_build_status;
typedef cl_uint cl_kernel_info;
typedef cl_uint cl_kernel_arg_info;
typedef cl_uint cl_kernel_arg_address_qualifier;
typedef cl_uint cl_kernel_arg_access_qualifier;
typedef cl_uint cl_kernel_work_group_info;
typedef cl_uint cl_event_info;
typedef cl_uint cl_command_type;
@ -49,6 +56,19 @@ typedef struct _cl_image_format {
cl_channel_type image_channel_data_type;
} cl_image_format;
typedef struct _cl_image_desc {
cl_mem_object_type image_type;
size_t image_width;
size_t image_height;
size_t image_depth;
size_t image_array_size;
size_t image_row_pitch;
size_t image_slice_pitch;
cl_uint num_mip_levels;
cl_uint num_samples;
cl_mem buffer;
} cl_image_desc;
typedef struct _cl_buffer_region {
size_t origin;
size_t size;
@ -63,7 +83,7 @@ typedef cl_uint cl_gl_texture_info;
// -----------------[ Extension typedefs ]-----------------
// EXT_device_fission
typedef cl_bitfield cl_device_partition_property_ext;
typedef cl_ulong cl_device_partition_property_ext;
// EXT_migrate_memobject
typedef cl_bitfield cl_mem_migration_flags_ext;

View File

@ -43,9 +43,10 @@
static jmethodID contextCallbackJ;
static jmethodID memObjectDestructorCallbackJ;
static jmethodID buildProgramCallbackJ;
static jmethodID programCallbackJ;
static jmethodID nativeKernelCallbackJ;
static jmethodID eventCallbackJ;
static jmethodID printfCallbackJ;
JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_ncreateGlobalRef(JNIEnv *env, jclass clazz, jobject obj) {
return (intptr_t)(*env)->NewGlobalRef(env, obj);
@ -113,13 +114,13 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getMemObjectDestructo
return (jlong)(intptr_t)&memObjectDestructorCallback;
}
// ----------------- [ MEM OBJECT DESTRUCTOR CALLBACK ] -----------------
// ----------------- [ PROGRAM CALLBACK ] -----------------
static void CL_CALLBACK buildProgramCallback(cl_program program, void *user_data) {
static void CL_CALLBACK programCallback(cl_program program, void *user_data) {
JNIEnv *env = attachCurrentThread();
if ( env != NULL && !(*env)->ExceptionOccurred(env) && buildProgramCallbackJ != NULL ) {
(*env)->CallVoidMethod(env, (jobject)user_data, buildProgramCallbackJ,
if ( env != NULL && !(*env)->ExceptionOccurred(env) && programCallbackJ != NULL ) {
(*env)->CallVoidMethod(env, (jobject)user_data, programCallbackJ,
(jlong)(intptr_t)program
);
(*env)->DeleteGlobalRef(env, (jobject)user_data);
@ -128,16 +129,16 @@ static void CL_CALLBACK buildProgramCallback(cl_program program, void *user_data
detachCurrentThread();
}
JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getBuildProgramCallback(JNIEnv *env, jclass clazz) {
JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getProgramCallback(JNIEnv *env, jclass clazz) {
// Cache the callback methodID
jclass callbackClass;
if ( buildProgramCallbackJ == NULL ) {
callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLBuildProgramCallback");
if ( programCallbackJ == NULL ) {
callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLProgramCallback");
if ( callbackClass != NULL )
buildProgramCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(J)V");
programCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(J)V");
}
return (jlong)(intptr_t)&buildProgramCallback;
return (jlong)(intptr_t)&programCallback;
}
// ----------------- [ NATIVE KERNEL CALLBACK ] -----------------
@ -214,6 +215,32 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getEventCallback(JNIE
return (jlong)(intptr_t)&eventCallback;
}
// ----------------- [ PRINTF CALLBACK ] -----------------
static void CL_CALLBACK printfCallback(cl_context context, cl_uint printf_data_len, char *printf_data_ptr, void *user_data) {
JNIEnv *env = attachCurrentThread();
if ( env != NULL && !(*env)->ExceptionOccurred(env) && printfCallbackJ != NULL ) {
(*env)->CallVoidMethod(env, (jobject)user_data, printfCallbackJ,
NewStringNativeWithLength(env, printf_data_ptr, printf_data_len)
);
}
detachCurrentThread();
}
JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getPrintfCallback(JNIEnv *env, jclass clazz) {
// Cache the callback methodID
jclass callbackClass;
if ( printfCallbackJ == NULL ) {
callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLPrintfCallback");
if ( callbackClass != NULL )
printfCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(Ljava/lang/String;)V");
}
return (jlong)(intptr_t)&printfCallback;
}
// ----------------- [ APPLE_ContextLoggingFunctions CALLBACKS ] -----------------
JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToSystemLogAPPLE(JNIEnv *env, jclass clazz) {

View File

@ -399,7 +399,7 @@ public interface CL10 {
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify);",
// Associate context with the GlobalRef, so we can delete it later.
javaFinally = "\t\t\tCallbackUtil.registerCallback(__result, user_data);"
javaFinally = "\t\t\tif ( __result != null ) __result.setContextCallback(user_data);"
)
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_context", params = "APIUtil.getCLPlatform(properties)")
@ -417,7 +417,7 @@ public interface CL10 {
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify);",
// Associate context with the GlobalRef, so we can delete it later.
javaFinally = "\t\t\tCallbackUtil.registerCallback(__result, user_data);"
javaFinally = "\t\t\tif ( __result != null ) __result.setContextCallback(user_data);"
)
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_context", params = "APIUtil.getCLPlatform(properties)")
@ -434,7 +434,7 @@ public interface CL10 {
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify);",
// Associate context with the GlobalRef, so we can delete it later.
javaFinally = "\t\t\tCallbackUtil.registerCallback(__result, user_data);"
javaFinally = "\t\t\tif ( __result != null ) __result.setContextCallback(user_data);"
)
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_context", params = "APIUtil.getCLPlatform(properties)")
@ -450,7 +450,7 @@ public interface CL10 {
@Code(
javaBeforeNative = "\t\tAPIUtil.releaseObjects(context);",
javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) CallbackUtil.unregisterCallback(context);"
javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) context.releaseImpl();"
)
@cl_int
int clReleaseContext(@PointerWrapper("cl_context") CLContext context);
@ -511,7 +511,7 @@ public interface CL10 {
@PointerWrapper("cl_mem") CLMem buffer,
@cl_bool int blocking_read,
@size_t long offset,
@AutoSize("ptr") @size_t long cb,
@AutoSize("ptr") @size_t long size,
@OutParameter
@cl_byte
@cl_short
@ -529,7 +529,7 @@ public interface CL10 {
@PointerWrapper("cl_mem") CLMem buffer,
@cl_bool int blocking_write,
@size_t long offset,
@AutoSize("ptr") @size_t long cb,
@AutoSize("ptr") @size_t long size,
@Const
@cl_byte
@cl_short
@ -548,7 +548,7 @@ public interface CL10 {
@PointerWrapper("cl_mem") CLMem dst_buffer,
@size_t long src_offset,
@size_t long dst_offset,
@size_t long cb,
@size_t long size,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event);
@ -556,13 +556,13 @@ public interface CL10 {
@Code(javaAfterNative = "\t\tif ( __result != null ) command_queue.registerCLEvent(event);")
@Check(value = "errcode_ret", canBeNull = true)
@cl_void
@AutoSize("cb")
@AutoSize("size")
ByteBuffer clEnqueueMapBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@PointerWrapper("cl_mem") CLMem buffer,
@cl_bool int blocking_map,
@NativeType("cl_map_flags") long map_flags,
@size_t long offset,
@size_t long cb,
@size_t long size,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event,
@ -855,7 +855,7 @@ public interface CL10 {
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@Check @NullTerminated @Const @cl_char ByteBuffer options,
@PointerWrapper(value = "cl_build_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Alternate("clBuildProgram")
@ -872,7 +872,7 @@ public interface CL10 {
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@NullTerminated @Const CharSequence options,
@PointerWrapper(value = "cl_build_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Alternate("clBuildProgram")
@ -889,7 +889,7 @@ public interface CL10 {
@Constant("1") @cl_uint int num_devices,
@Constant(value = "APIUtil.getPointer(device)", keepParam = true) CLDevice device,
@NullTerminated @Const CharSequence options,
@PointerWrapper(value = "cl_build_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@cl_int

View File

@ -121,14 +121,14 @@ public interface CL11 {
int clEnqueueReadBufferRect(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@PointerWrapper("cl_mem") CLMem buffer,
@cl_bool int blocking_read,
@Const @Check("3") @NativeType("size_t") PointerBuffer buffer_origin,
@Const @Check("3") @NativeType("size_t") PointerBuffer host_origin,
@Const @Check("3") @NativeType("size_t") PointerBuffer buffer_offset,
@Const @Check("3") @NativeType("size_t") PointerBuffer host_offset,
@Const @Check("3") @NativeType("size_t") PointerBuffer region,
@size_t long buffer_row_pitch,
@size_t long buffer_slice_pitch,
@size_t long host_row_pitch,
@size_t long host_slice_pitch,
@OutParameter @Check("CLChecks.calculateBufferRectSize(host_origin, region, host_row_pitch, host_slice_pitch)")
@OutParameter @Check("CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)")
@cl_byte
@cl_short
@cl_int
@ -144,14 +144,14 @@ public interface CL11 {
int clEnqueueWriteBufferRect(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@PointerWrapper("cl_mem") CLMem buffer,
@cl_bool int blocking_write,
@Const @Check("3") @NativeType("size_t") PointerBuffer buffer_origin,
@Const @Check("3") @NativeType("size_t") PointerBuffer host_origin,
@Const @Check("3") @NativeType("size_t") PointerBuffer buffer_offset,
@Const @Check("3") @NativeType("size_t") PointerBuffer host_offset,
@Const @Check("3") @NativeType("size_t") PointerBuffer region,
@size_t long buffer_row_pitch,
@size_t long buffer_slice_pitch,
@size_t long host_row_pitch,
@size_t long host_slice_pitch,
@Const @Check("CLChecks.calculateBufferRectSize(host_origin, region, host_row_pitch, host_slice_pitch)")
@Const @Check("CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)")
@cl_byte
@cl_short
@cl_int

View File

@ -0,0 +1,445 @@
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opencl;
import org.lwjgl.PointerBuffer;
import org.lwjgl.util.generator.*;
import org.lwjgl.util.generator.opencl.*;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
/** The core OpenCL 1.1 API */
public interface CL12 {
/** Error Codes */
int CL_COMPILE_PROGRAM_FAILURE = -15,
CL_LINKER_NOT_AVAILABLE = -16,
CL_LINK_PROGRAM_FAILURE = -17,
CL_DEVICE_PARTITION_FAILED = -18,
CL_KERNEL_ARG_INFO_NOT_AVAILABLE = -19,
CL_INVALID_IMAGE_DESCRIPTOR = -65,
CL_INVALID_COMPILER_OPTIONS = -66,
CL_INVALID_LINKER_OPTIONS = -67,
CL_INVALID_DEVICE_PARTITION_COUNT = -68;
/** OpenCL Version */
int CL_VERSION_1_2 = 1;
/** cl_bool */
int CL_BLOCKING = CL10.CL_TRUE,
CL_NON_BLOCKING = CL10.CL_FALSE;
/** cl_device_type - bitfield */
int CL_DEVICE_TYPE_CUSTOM = (1 << 4);
/* cl_device_info */
int CL_DEVICE_DOUBLE_FP_CONFIG = 0x1032,
CL_DEVICE_LINKER_AVAILABLE = 0x103E,
CL_DEVICE_BUILT_IN_KERNELS = 0x103F,
CL_DEVICE_IMAGE_MAX_BUFFER_SIZE = 0x1040,
CL_DEVICE_IMAGE_MAX_ARRAY_SIZE = 0x1041,
CL_DEVICE_PARENT_DEVICE = 0x1042,
CL_DEVICE_PARTITION_MAX_SUB_DEVICES = 0x1043,
CL_DEVICE_PARTITION_PROPERTIES = 0x1044,
CL_DEVICE_PARTITION_AFFINITY_DOMAIN = 0x1045,
CL_DEVICE_PARTITION_TYPE = 0x1046,
CL_DEVICE_REFERENCE_COUNT = 0x1047,
CL_DEVICE_PREFERRED_INTEROP_USER_SYNC = 0x1048,
CL_DEVICE_PRINTF_BUFFER_SIZE = 0x1049;
/* cl_device_fp_config - bitfield */
int CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT = (1 << 7);
/* cl_context_properties */
int CL_CONTEXT_INTEROP_USER_SYNC = 0x1085;
/* cl_device_partition_property */
int CL_DEVICE_PARTITION_EQUALLY = 0x1086,
CL_DEVICE_PARTITION_BY_COUNTS = 0x1087,
CL_DEVICE_PARTITION_BY_COUNTS_LIST_END = 0x0,
CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN = 0x1088;
/* cl_device_affinity_domain */
int CL_DEVICE_AFFINITY_DOMAIN_NUMA = (1 << 0),
CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE = (1 << 1),
CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE = (1 << 2),
CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE = (1 << 3),
CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE = (1 << 4),
CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE = (1 << 5);
/* cl_mem_flags - bitfield */
int CL_MEM_HOST_WRITE_ONLY = (1 << 7),
CL_MEM_HOST_READ_ONLY = (1 << 8),
CL_MEM_HOST_NO_ACCESS = (1 << 9);
/* cl_mem_migration_flags - bitfield */
int CL_MIGRATE_MEM_OBJECT_HOST = (1 << 0),
CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED = (1 << 1);
/* cl_mem_object_type */
int CL_MEM_OBJECT_IMAGE2D_ARRAY = 0x10F3,
CL_MEM_OBJECT_IMAGE1D = 0x10F4,
CL_MEM_OBJECT_IMAGE1D_ARRAY = 0x10F5,
CL_MEM_OBJECT_IMAGE1D_BUFFER = 0x10F6;
/* cl_image_info */
int CL_IMAGE_ARRAY_SIZE = 0x1117,
CL_IMAGE_BUFFER = 0x1118,
CL_IMAGE_NUM_MIP_LEVELS = 0x1119,
CL_IMAGE_NUM_SAMPLES = 0x111A;
/* cl_map_flags - bitfield */
int CL_MAP_WRITE_INVALIDATE_REGION = (1 << 2);
/* cl_program_info */
int CL_PROGRAM_NUM_KERNELS = 0x1167,
CL_PROGRAM_KERNEL_NAMES = 0x1168;
/* cl_program_build_info */
int CL_PROGRAM_BINARY_TYPE = 0x1184;
/* cl_program_binary_type */
int CL_PROGRAM_BINARY_TYPE_NONE = 0x0,
CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT = 0x1,
CL_PROGRAM_BINARY_TYPE_LIBRARY = 0x2,
CL_PROGRAM_BINARY_TYPE_EXECUTABLE = 0x4;
/* cl_kernel_info */
int CL_KERNEL_ATTRIBUTES = 0x1195;
/* cl_kernel_arg_info */
int CL_KERNEL_ARG_ADDRESS_QUALIFIER = 0x1196,
CL_KERNEL_ARG_ACCESS_QUALIFIER = 0x1197,
CL_KERNEL_ARG_TYPE_NAME = 0x1198,
CL_KERNEL_ARG_NAME = 0x1199;
/* cl_kernel_arg_address_qualifier */
int CL_KERNEL_ARG_ADDRESS_GLOBAL = 0x119A,
CL_KERNEL_ARG_ADDRESS_LOCAL = 0x119B,
CL_KERNEL_ARG_ADDRESS_CONSTANT = 0x119C,
CL_KERNEL_ARG_ADDRESS_PRIVATE = 0x119D;
/* cl_kernel_arg_access_qualifier */
int CL_KERNEL_ARG_ACCESS_READ_ONLY = 0x11A0,
CL_KERNEL_ARG_ACCESS_WRITE_ONLY = 0x11A1,
CL_KERNEL_ARG_ACCESS_READ_WRITE = 0x11A2,
CL_KERNEL_ARG_ACCESS_NONE = 0x11A3;
/* cl_kernel_work_group_info */
int CL_KERNEL_GLOBAL_WORK_SIZE = 0x11B5;
/* cl_command_type */
int CL_COMMAND_BARRIER = 0x1205,
CL_COMMAND_MIGRATE_MEM_OBJECTS = 0x1206,
CL_COMMAND_FILL_BUFFER = 0x1207,
CL_COMMAND_FILL_IMAGE = 0x1208;
@Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) device.retain();")
@cl_int
int clRetainDevice(@PointerWrapper("cl_device_id") CLDevice device);
/**
* Warning: LWJGL will not automatically release any objects associated with sub-devices.
* The user is responsible for tracking and releasing everything prior to calling this method.
*
* @param device the parent CLDevice
*
* @return the error code
*/
@Code(
javaBeforeNative = "\t\tAPIUtil.releaseObjects(device);",
javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) device.release();"
)
@cl_int
int clReleaseDevice(@PointerWrapper("cl_device_id") CLDevice device);
@Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS && out_devices != null ) in_device.registerSubCLDevices(out_devices);")
@cl_int
int clCreateSubDevices(
@PointerWrapper("cl_device_id") CLDevice in_device,
@NullTerminated @Const @NativeType("cl_device_partition_property") LongBuffer properties,
@AutoSize(value = "out_devices", canBeNull = true) @cl_uint int num_devices,
@OutParameter @Check(canBeNull = true) @NativeType("cl_device_id") PointerBuffer out_devices,
@OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_devices_ret);
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_mem", params = "context")
CLMem clCreateImage(@PointerWrapper("cl_context") CLContext context,
@NativeType("cl_mem_flags") long flags,
@Check("2 * 4") @Const @NativeType("cl_image_format") ByteBuffer image_format,
@Check("3 * 4 + 7 * PointerBuffer.getPointerSize()") @Const @NativeType("cl_image_desc") ByteBuffer image_desc,
@Check
@cl_byte
@cl_short
@cl_int
@cl_float Buffer host_ptr,
@OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret);
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_program", params = "context")
CLProgram clCreateProgramWithBuiltInKernels(@PointerWrapper("cl_context") CLContext context,
@AutoSize("device_list") @cl_uint int num_devices,
@Check("1") @Const @NativeType("cl_device_id") PointerBuffer device_list,
@Check @Const @cl_char ByteBuffer kernel_names,
@OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret);
@Alternate("clCreateProgramWithBuiltInKernels")
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_program", params = "context")
CLProgram clCreateProgramWithBuiltInKernels(@PointerWrapper("cl_context") CLContext context,
@AutoSize("device_list") @cl_uint int num_devices,
@Check("1") @Const @NativeType("cl_device_id") PointerBuffer device_list,
CharSequence kernel_names,
@OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret);
/** Single null-terminated header include name. */
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);"
)
@cl_int
int clCompileProgram(@PointerWrapper("cl_program") CLProgram program,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@Check @NullTerminated @Const @cl_char ByteBuffer options,
@Constant("1") @cl_uint int num_input_headers,
@Check("1") @Const @NativeType("cl_program") PointerBuffer input_header,
@NullTerminated @Check @Const @cl_char @Indirect ByteBuffer header_include_name,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
/** Multiple null-terminated header include names, one after the other. */
@Alternate(value = "clCompileProgram", nativeAlt = true, javaAlt = true)
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);"
)
@cl_int
int clCompileProgramMulti(@PointerWrapper("cl_program") CLProgram program,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@Check @NullTerminated @Const @cl_char ByteBuffer options,
@AutoSize("input_headers") @cl_uint int num_input_headers,
@Check("1") @Const @NativeType("cl_program") PointerBuffer input_headers,
@NullTerminated("input_headers.remaining()") @Check @Const @Indirect @cl_char @PointerArray("num_input_headers") ByteBuffer header_include_names,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Alternate(value = "clCompileProgram", nativeAlt = true)
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);"
)
@cl_int
int clCompileProgram3(@PointerWrapper("cl_program") CLProgram program,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@Check @NullTerminated @Const @cl_char ByteBuffer options,
@Constant("header_include_names.length") @cl_uint int num_input_headers,
@Check("header_include_names.length") @Const @NativeType("cl_program") PointerBuffer input_headers,
@NullTerminated @Check("1") @PointerArray(value = "num_input_headers") @Const @NativeType("cl_char") ByteBuffer[] header_include_names,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Alternate("clCompileProgram")
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);"
)
@cl_int
int clCompileProgram(@PointerWrapper("cl_program") CLProgram program,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@NullTerminated CharSequence options,
@Constant("1") @cl_uint int num_input_headers,
@Check("1") @Const @NativeType("cl_program") PointerBuffer input_header,
@NullTerminated @Const CharSequence header_include_name,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Alternate(value = "clCompileProgram", nativeAlt = true, skipNative = true)
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);"
)
@cl_int
int clCompileProgramMulti(@PointerWrapper("cl_program") CLProgram program,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@NullTerminated CharSequence options,
@AutoSize("input_header") @cl_uint int num_input_headers,
@Check("1") @Const @NativeType("cl_program") PointerBuffer input_header,
@NullTerminated @PointerArray(value = "num_input_headers") @Const CharSequence[] header_include_name,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(context);",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(errcode_ret.get(errcode_ret.position()), user_data);"
)
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_program", params = "context")
CLProgram clLinkProgram(@PointerWrapper("cl_context") CLContext context,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@NullTerminated @Check @Const @cl_char ByteBuffer options,
@AutoSize("input_programs") @cl_uint int num_input_programs,
@Check @Const @NativeType("cl_program") PointerBuffer input_programs,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLLinkProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data,
@OutParameter @Check("1") @cl_int IntBuffer errcode_ret);
@Alternate("clLinkProgram")
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" +
"\t\tif ( pfn_notify != null ) pfn_notify.setContext(context);",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tCallbackUtil.checkCallback(errcode_ret.get(errcode_ret.position()), user_data);"
)
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_program", params = "context")
CLProgram clLinkProgram(@PointerWrapper("cl_context") CLContext context,
@AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices,
@Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list,
@NullTerminated CharSequence options,
@AutoSize("input_programs") @cl_uint int num_input_programs,
@Check @Const @NativeType("cl_program") PointerBuffer input_programs,
@PointerWrapper(value = "cl_program_callback", canBeNull = true) CLLinkProgramCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data,
@OutParameter @Check("1") @cl_int IntBuffer errcode_ret);
@cl_int
int clUnloadPlatformCompiler(@PointerWrapper("cl_platform_id") CLPlatform platform);
@cl_int
int clGetKernelArgInfo(@PointerWrapper("cl_kernel") CLKernel kernel,
@cl_uint int arg_indx,
@NativeType("cl_kernel_arg_info") int param_name,
@AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size,
@OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret);
@cl_int
int clEnqueueFillBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@PointerWrapper("cl_mem") CLMem buffer,
@Check @Const @cl_void ByteBuffer pattern,
@AutoSize("pattern") @size_t long pattern_size,
@size_t long offset,
@size_t long size,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event);
@cl_int
int clEnqueueFillImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@PointerWrapper("cl_mem") CLMem image,
@Check("4 * 4") @Const @cl_void ByteBuffer fill_color,
@Check("3") @Const @NativeType("size_t") PointerBuffer origin,
@Check("3") @Const @NativeType("size_t") PointerBuffer region,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event);
@cl_int
int clEnqueueMigrateMemObjects(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@AutoSize("mem_objects") @cl_uint int num_mem_objects,
@Check @Const @NativeType("cl_mem") PointerBuffer mem_objects,
@NativeType("cl_mem_migration_flags") long flags,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event);
@cl_int
int clEnqueueMarkerWithWaitList(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event);
@cl_int
int clEnqueueBarrierWithWaitList(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue,
@AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list,
@Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list,
@OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event);
@Code(
tryBlock = true,
// Create a GlobalRef to the callback object.
javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);",
// Check if we need to delete the GlobalRef.
javaFinally = "\t\t\tcontext.setPrintfCallback(user_data, __result);"
)
@cl_int
int clSetPrintfCallback(@PointerWrapper("cl_context") CLContext context,
@PointerWrapper("cl_printf_callback") CLPrintfCallback pfn_notify,
@Constant("user_data") @PointerWrapper("void *") long user_data);
@Private
@PointerWrapper("void *")
CLFunctionAddress clGetExtensionFunctionAddressForPlatform(@PointerWrapper("cl_platform_id") CLPlatform platform,
@Check("1") @Const @cl_char ByteBuffer func_name);
@Alternate("clGetExtensionFunctionAddressForPlatform")
@Private
@PointerWrapper("void *")
CLFunctionAddress clGetExtensionFunctionAddressForPlatform(@PointerWrapper("cl_platform_id") CLPlatform platform,
CharSequence func_name);
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opencl;
import org.lwjgl.util.generator.Check;
import org.lwjgl.util.generator.NativeType;
import org.lwjgl.util.generator.OutParameter;
import org.lwjgl.util.generator.PointerWrapper;
import org.lwjgl.util.generator.opencl.cl_int;
import java.nio.IntBuffer;
/** The core OpenCL 1.2 OpenGL interrop functionality. */
public interface CL12GL {
/* cl_gl_object_type */
int CL_GL_OBJECT_TEXTURE2D_ARRAY = 0x200E,
CL_GL_OBJECT_TEXTURE1D = 0x200F,
CL_GL_OBJECT_TEXTURE1D_ARRAY = 0x2010,
CL_GL_OBJECT_TEXTURE_BUFFER = 0x2011;
@Check(value = "errcode_ret", canBeNull = true)
@PointerWrapper(value = "cl_mem", params = "context")
CLMem clCreateFromGLTexture(@PointerWrapper("cl_context") CLContext context,
@NativeType("cl_mem_flags") long flags,
@NativeType("GLenum") int target,
@NativeType("GLint") int miplevel,
@NativeType("GLuint") int texture,
@OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret);
}

View File

@ -135,7 +135,6 @@ public interface EXT_device_fission {
@cl_int
int clCreateSubDevicesEXT(
@PointerWrapper("cl_device_id") CLDevice in_device,
// TODO: cl_device_partition_property_ext is a cl_bitfield (ulong), but the spec says properties is a {property-value, cl_int[]} list...
@NullTerminated @Const @NativeType("cl_device_partition_property_ext") LongBuffer properties,
@AutoSize(value = "out_devices", canBeNull = true) @cl_uint int num_entries,
@OutParameter @Check(canBeNull = true) @NativeType("cl_device_id") PointerBuffer out_devices,

View File

@ -32,7 +32,6 @@
package org.lwjgl.opengl;
import org.lwjgl.util.generator.*;
import org.lwjgl.util.generator.Alternate;
import org.lwjgl.util.generator.opengl.*;
import java.nio.ByteBuffer;
@ -44,12 +43,12 @@ import java.nio.IntBuffer;
public interface ARB_separate_shader_objects {
/** Accepted by &lt;stages&gt; parameter to UseProgramStages: */
int GL_VERTEX_SHADER_BIT = 0x00000001,
GL_FRAGMENT_SHADER_BIT = 0x00000002,
GL_GEOMETRY_SHADER_BIT = 0x00000004,
GL_TESS_CONTROL_SHADER_BIT = 0x00000008,
int GL_VERTEX_SHADER_BIT = 0x00000001,
GL_FRAGMENT_SHADER_BIT = 0x00000002,
GL_GEOMETRY_SHADER_BIT = 0x00000004,
GL_TESS_CONTROL_SHADER_BIT = 0x00000008,
GL_TESS_EVALUATION_SHADER_BIT = 0x00000010,
GL_ALL_SHADER_BITS = 0xFFFFFFFF;
GL_ALL_SHADER_BITS = 0xFFFFFFFF;
/**
* Accepted by the &lt;pname&gt; parameter of ProgramParameteri and
@ -72,10 +71,24 @@ public interface ARB_separate_shader_objects {
@Reuse("GL41")
void glActiveShaderProgram(@GLuint int pipeline, @GLuint int program);
/** Single null-terminated source code string. */
@Reuse("GL41")
@StripPostfix(value = "string", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated @Check @Const @Indirect @GLchar ByteBuffer string);
/** Multiple null-terminated source code strings, one after the other. */
@Reuse("GL41")
@Alternate(value = "glCreateShaderProgramv", nativeAlt = true)
@StripPostfix(value = "strings", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @GLsizei int count, @Check @Const @Indirect @GLchar ByteBuffer strings);
int glCreateShaderProgramv2(@GLenum int type, @GLsizei int count, @NullTerminated("count") @Check @Const @Indirect @GLchar @PointerArray("count") ByteBuffer strings);
@Reuse("GL41")
@Alternate(value = "glCreateShaderProgramv", nativeAlt = true)
@StripPostfix(value = "strings", postfix = "v")
@GLuint
int glCreateShaderProgramv3(@GLenum int type, @Constant("strings.length") @GLsizei int count, @NullTerminated @Check("1") @PointerArray(value = "count") @Const @NativeType("GLchar") ByteBuffer[] strings);
@Reuse("GL41")
@Alternate("glCreateShaderProgramv")
@ -84,11 +97,11 @@ public interface ARB_separate_shader_objects {
int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated CharSequence string);
@Reuse("GL41")
@Alternate("glCreateShaderProgramv")
@Alternate(value = "glCreateShaderProgramv", nativeAlt = true, skipNative = true)
@StripPostfix(value = "strings", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @Constant("strings.length") @GLsizei int count,
@Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings);
int glCreateShaderProgramv2(@GLenum int type, @Constant("strings.length") @GLsizei int count,
@Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings);
@Reuse("GL41")
void glBindProgramPipeline(@GLuint int pipeline);

View File

@ -46,12 +46,12 @@ public interface GL41 {
* Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv,
* GetInteger64v, GetFloatv, and GetDoublev:
*/
int GL_SHADER_COMPILER = 0x8DFA,
GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9,
GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
GL_MAX_VARYING_VECTORS = 0x8DFC,
GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD,
GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A,
int GL_SHADER_COMPILER = 0x8DFA,
GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9,
GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
GL_MAX_VARYING_VECTORS = 0x8DFC,
GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD,
GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A,
GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
/** Accepted by the &lt;type&gt; parameter of VertexAttribPointer: */
@ -61,12 +61,12 @@ public interface GL41 {
* Accepted by the &lt;precisiontype&gt; parameter of
* GetShaderPrecisionFormat:
*/
int GL_LOW_FLOAT = 0x8DF0,
int GL_LOW_FLOAT = 0x8DF0,
GL_MEDIUM_FLOAT = 0x8DF1,
GL_HIGH_FLOAT = 0x8DF2,
GL_LOW_INT = 0x8DF3,
GL_MEDIUM_INT = 0x8DF4,
GL_HIGH_INT = 0x8DF5;
GL_HIGH_FLOAT = 0x8DF2,
GL_LOW_INT = 0x8DF3,
GL_MEDIUM_INT = 0x8DF4,
GL_HIGH_INT = 0x8DF5;
void glReleaseShaderCompiler();
@ -99,7 +99,7 @@ public interface GL41 {
* GetInteger64v, GetFloatv and GetDoublev:
*/
int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE,
GL_PROGRAM_BINARY_FORMATS = 0x87FF;
GL_PROGRAM_BINARY_FORMATS = 0x87FF;
void glGetProgramBinary(@GLuint int program, @AutoSize("binary") @GLsizei int bufSize,
@Check(value = "1", canBeNull = true) @GLsizei IntBuffer length,
@ -115,12 +115,12 @@ public interface GL41 {
// ---------------------------------------------------------------------------
/** Accepted by &lt;stages&gt; parameter to UseProgramStages: */
int GL_VERTEX_SHADER_BIT = 0x00000001,
GL_FRAGMENT_SHADER_BIT = 0x00000002,
GL_GEOMETRY_SHADER_BIT = 0x00000004,
GL_TESS_CONTROL_SHADER_BIT = 0x00000008,
int GL_VERTEX_SHADER_BIT = 0x00000001,
GL_FRAGMENT_SHADER_BIT = 0x00000002,
GL_GEOMETRY_SHADER_BIT = 0x00000004,
GL_TESS_CONTROL_SHADER_BIT = 0x00000008,
GL_TESS_EVALUATION_SHADER_BIT = 0x00000010,
GL_ALL_SHADER_BITS = 0xFFFFFFFF;
GL_ALL_SHADER_BITS = 0xFFFFFFFF;
/**
* Accepted by the &lt;pname&gt; parameter of ProgramParameteri and
@ -141,20 +141,32 @@ public interface GL41 {
void glActiveShaderProgram(@GLuint int pipeline, @GLuint int program);
/** Single null-terminated source code string. */
@StripPostfix(value = "string", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated @Check @Const @Indirect @GLchar ByteBuffer string);
/** Multiple null-terminated source code strings, one after the other. */
@Alternate(value = "glCreateShaderProgramv", nativeAlt = true)
@StripPostfix(value = "strings", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @GLsizei int count, @Check @Const @Indirect @GLchar ByteBuffer strings);
int glCreateShaderProgramv2(@GLenum int type, @GLsizei int count, @NullTerminated("count") @Check @Const @Indirect @GLchar @PointerArray("count") ByteBuffer strings);
@Alternate(value = "glCreateShaderProgramv", nativeAlt = true)
@StripPostfix(value = "strings", postfix = "v")
@GLuint
int glCreateShaderProgramv3(@GLenum int type, @Constant("strings.length") @GLsizei int count, @NullTerminated @Check("1") @PointerArray(value = "count") @Const @NativeType("GLchar") ByteBuffer[] strings);
@Alternate("glCreateShaderProgramv")
@StripPostfix(value = "string", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated CharSequence string);
@Alternate("glCreateShaderProgramv")
@Alternate(value = "glCreateShaderProgramv", nativeAlt = true, skipNative = true)
@StripPostfix(value = "strings", postfix = "v")
@GLuint
int glCreateShaderProgramv(@GLenum int type, @Constant("strings.length") @GLsizei int count,
@Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings);
int glCreateShaderProgramv2(@GLenum int type, @Constant("strings.length") @GLsizei int count,
@Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings);
void glBindProgramPipeline(@GLuint int pipeline);
@ -342,12 +354,12 @@ public interface GL41 {
// -----------------------------------------------------------------------
/** Returned in the &lt;type&gt; parameter of GetActiveAttrib: */
int GL_DOUBLE_VEC2 = 0x8FFC;
int GL_DOUBLE_VEC3 = 0x8FFD;
int GL_DOUBLE_VEC4 = 0x8FFE;
int GL_DOUBLE_MAT2 = 0x8F46;
int GL_DOUBLE_MAT3 = 0x8F47;
int GL_DOUBLE_MAT4 = 0x8F48;
int GL_DOUBLE_VEC2 = 0x8FFC;
int GL_DOUBLE_VEC3 = 0x8FFD;
int GL_DOUBLE_VEC4 = 0x8FFE;
int GL_DOUBLE_MAT2 = 0x8F46;
int GL_DOUBLE_MAT3 = 0x8F47;
int GL_DOUBLE_MAT4 = 0x8F48;
int GL_DOUBLE_MAT2x3 = 0x8F49;
int GL_DOUBLE_MAT2x4 = 0x8F4A;
int GL_DOUBLE_MAT3x2 = 0x8F4B;
@ -391,10 +403,10 @@ public interface GL41 {
* Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv,
* GetDoublev and GetInteger64v:
*/
int GL_MAX_VIEWPORTS = 0x825B,
GL_VIEWPORT_SUBPIXEL_BITS = 0x825C,
GL_VIEWPORT_BOUNDS_RANGE = 0x825D,
GL_LAYER_PROVOKING_VERTEX = 0x825E,
int GL_MAX_VIEWPORTS = 0x825B,
GL_VIEWPORT_SUBPIXEL_BITS = 0x825C,
GL_VIEWPORT_BOUNDS_RANGE = 0x825D,
GL_LAYER_PROVOKING_VERTEX = 0x825E,
GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F;
/** Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: */
@ -414,9 +426,9 @@ public interface GL41 {
* LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX:
*/
int GL_FIRST_VERTEX_CONVENTION = 0x8E4D,
GL_LAST_VERTEX_CONVENTION = 0x8E4E,
GL_PROVOKING_VERTEX = 0x8E4F,
GL_UNDEFINED_VERTEX = 0x8260;
GL_LAST_VERTEX_CONVENTION = 0x8E4E,
GL_PROVOKING_VERTEX = 0x8E4F,
GL_UNDEFINED_VERTEX = 0x8260;
@StripPostfix("v")
void glViewportArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const FloatBuffer v);