summaryrefslogtreecommitdiffstats
path: root/src/net/java/games/gluegen/CMethodBindingEmitter.java
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2004-10-04 22:55:39 +0000
committerKenneth Russel <[email protected]>2004-10-04 22:55:39 +0000
commit4b93bb531605fa082bdad6452d3e6a51cbb15bed (patch)
treec1de89e45cb309b82af89f90a06f263c305f2fe0 /src/net/java/games/gluegen/CMethodBindingEmitter.java
parenta74c41bb00bb2fd0a6d2a5470332dbaa1e53958c (diff)
Fixed Issue 71: glMultiDrawElements() is missing
Added support to GlueGen to handle pointer-to-pointer types for primitive types, like void** and int**. These are exposed as arrays of appropriately-typed direct java.nio Buffers for simplicity. Checks for whether the buffers are direct are performed and null checks for the individual Buffer objects are done as well. Fixed an existing bug in the conversion of outgoing char** arguments in C to String[] in Java where null checks were missing; this showed up as crashes in glShaderSourceARB. Exposed glMultiDrawElements and several other less-common entry points taking void** arguments. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@154 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/net/java/games/gluegen/CMethodBindingEmitter.java')
-rw-r--r--src/net/java/games/gluegen/CMethodBindingEmitter.java163
1 files changed, 109 insertions, 54 deletions
diff --git a/src/net/java/games/gluegen/CMethodBindingEmitter.java b/src/net/java/games/gluegen/CMethodBindingEmitter.java
index e0abf86a6..b9cc0091e 100644
--- a/src/net/java/games/gluegen/CMethodBindingEmitter.java
+++ b/src/net/java/games/gluegen/CMethodBindingEmitter.java
@@ -576,7 +576,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
throw new RuntimeException(
"Could not copy data for type \"" + cArgType +
"\"; copying only supported for types of the form " +
- "ptr-to-ptr-to-primitive.");
+ "ptr-to-ptr-to-type.");
}
PointerType cArgPtrType = cArgType.asPointer();
if (cArgPtrType == null) {
@@ -611,6 +611,13 @@ public class CMethodBindingEmitter extends FunctionEmitter
"(jstring) _tmpObj",
"(const char*)"+convName+"_copy[_copyIndex]");
}
+ else if (isNIOBufferClass(subArrayElementJavaType))
+ {
+ emitGetDirectBufferAddress(writer,
+ "_tmpObj",
+ cArgElementType.getName(),
+ convName + "_copy[_copyIndex]");
+ }
else
{
// Question: do we always need to copy the sub-arrays, or just
@@ -625,7 +632,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
cArgElementType.getTargetType().getName(), // assumes cArgPtrType is ptr-to-ptr-to-primitive !!
"(*env)->GetArrayLength(env, _tmpObj)",
"Could not allocate buffer during copying of data in argument \\\""+binding.getArgumentName(i)+"\\\"");
- // FIXME: copy the data (use Get<type>ArrayRegion() calls)
+ // FIXME: copy the data (use matched Get/ReleasePrimitiveArrayCritical() calls)
if (true) throw new RuntimeException(
"Cannot yet handle type \"" + cArgType.getName() +
"\"; need to add support for copying ptr-to-ptr-to-primitiveType subarrays");
@@ -727,63 +734,58 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.println(" /* Clean up " + convName + "_copy */");
- // Re-fetch length of array that was copied
- String arrayLenName = "_tmpArrayLen";
- writer.print(" ");
- writer.print(arrayLenName);
- writer.print(" = (*env)->GetArrayLength(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(");");
-
- // free each element
- PointerType cArgPtrType = cArgType.asPointer();
- if (cArgPtrType == null) {
- throw new RuntimeException(
- "Could not copy data for type \"" + cArgType +
- "\"; currently only pointer types supported.");
- }
- PointerType cArgElementType = cArgPtrType.getTargetType().asPointer();
+ // Only need to perform cleanup for individual array
+ // elements if they are not direct buffers
+ if (!isNIOBufferClass(subArrayElementJavaType)) {
+ // Re-fetch length of array that was copied
+ String arrayLenName = "_tmpArrayLen";
+ writer.print(" ");
+ writer.print(arrayLenName);
+ writer.print(" = (*env)->GetArrayLength(env, ");
+ writer.print(binding.getArgumentName(i));
+ writer.println(");");
+
+ // free each element
+ PointerType cArgPtrType = cArgType.asPointer();
+ if (cArgPtrType == null) {
+ throw new RuntimeException(
+ "Could not copy data for type \"" + cArgType +
+ "\"; currently only pointer types supported.");
+ }
+ PointerType cArgElementType = cArgPtrType.getTargetType().asPointer();
- // process each element in the array
- writer.println(" for (_copyIndex = 0; _copyIndex < " + arrayLenName +"; ++_copyIndex) {");
-
- // get each array element
- writer.println(" /* free each element of " +convName +"_copy */");
- String subArrayElementJNITypeString = jniType(subArrayElementJavaType);
- writer.print(" _tmpObj = (");
- writer.print(subArrayElementJNITypeString);
- writer.print(") (*env)->GetObjectArrayElement(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(", _copyIndex);");
-
- if (subArrayElementJNITypeString == "jstring")
- {
- writer.print(" (*env)->ReleaseStringUTFChars(env, ");
- writer.print("(jstring) _tmpObj");
- writer.print(", ");
- writer.print(convName+"_copy[_copyIndex]");
- writer.println(");");
- }
- else
- {
- // FIXME: free up stuff here
- if (true) throw new RuntimeException(
- "Cannot yet handle type \"" + cArgType.getName() +
- "\"; need to add support for cleaning up copied ptr-to-ptr-to-primitiveType subarrays");
+ // process each element in the array
+ writer.println(" for (_copyIndex = 0; _copyIndex < " + arrayLenName +"; ++_copyIndex) {");
+
+ // get each array element
+ writer.println(" /* free each element of " +convName +"_copy */");
+ String subArrayElementJNITypeString = jniType(subArrayElementJavaType);
+ writer.print(" _tmpObj = (");
+ writer.print(subArrayElementJNITypeString);
+ writer.print(") (*env)->GetObjectArrayElement(env, ");
+ writer.print(binding.getArgumentName(i));
+ writer.println(", _copyIndex);");
+
+ if (subArrayElementJNITypeString == "jstring") {
+ writer.print(" (*env)->ReleaseStringUTFChars(env, ");
+ writer.print("(jstring) _tmpObj");
+ writer.print(", ");
+ writer.print(convName+"_copy[_copyIndex]");
+ writer.println(");");
+ } else {
+ if (true) throw new RuntimeException(
+ "Cannot yet handle type \"" + cArgType.getName() +
+ "\"; need to add support for cleaning up copied ptr-to-ptr-to-primitiveType subarrays");
+ }
+ writer.println(" }");
}
- writer.println(" }");
// free the main array
writer.print(" free(");
writer.print(convName+"_copy");
writer.println(");");
-
-
- writer.println();
} // end of cleaning up copied data
-
-
if (EMIT_NULL_CHECKS) {
writer.println(" }");
}
@@ -1059,10 +1061,12 @@ public class CMethodBindingEmitter extends FunctionEmitter
return "j" + javaType.getName();
} else if (javaType == java.lang.String.class) {
return "jstring";
+ } else if (isNIOBufferClass(javaType)) {
+ return "jobject";
} else {
throw new RuntimeException(
"Could not determine JNI type for Java class \"" +
- javaType.getName() + "\"; was not String or primitive");
+ javaType.getName() + "\"; was not String, primitive or direct buffer");
}
}
@@ -1112,7 +1116,10 @@ public class CMethodBindingEmitter extends FunctionEmitter
String sourceVarName,
String receivingVarName)
{
- writer.print(" ");
+ writer.print(" if (");
+ writer.print(sourceVarName);
+ writer.println(" != NULL) {");
+ writer.print(" ");
writer.print(receivingVarName);
writer.print(" = (*env)->GetStringUTFChars(env, ");
writer.print(sourceVarName);
@@ -1124,8 +1131,39 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer, receivingVarName,
"Failed to get UTF-8 chars for argument \\\""+sourceVarName+"\\\"");
}
+ writer.println(" } else {");
+ writer.print(" ");
+ writer.print(receivingVarName);
+ writer.println(" = NULL;");
+ writer.println(" }");
}
+ private void emitGetDirectBufferAddress(PrintWriter writer,
+ String sourceVarName,
+ String receivingVarTypeString,
+ String receivingVarName) {
+ if (EMIT_NULL_CHECKS) {
+ writer.print(" if (");
+ writer.print(sourceVarName);
+ writer.println(" != NULL) {");
+ }
+ writer.print(" ");
+ writer.print(receivingVarName);
+ writer.print(" = (");
+ writer.print(receivingVarTypeString);
+ writer.print(") (*env)->GetDirectBufferAddress(env, ");
+ writer.print(sourceVarName);
+ writer.println(");");
+ if (EMIT_NULL_CHECKS) {
+ writer.println(" } else {");
+ writer.print(" ");
+ writer.print(receivingVarName);
+ writer.println(" = NULL;");
+ writer.println(" }");
+ }
+ }
+
+
// Note: if the data in the Type needs to be converted from the Java memory
// model to the C memory model prior to calling any C-side functions, then
// an extra variable named XXX_copy (where XXX is the value of the
@@ -1156,7 +1194,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
else if (elementType == java.lang.String.class)
{
- ptrTypeString = "jstring *";
+ ptrTypeString = "jstring";
}
else if (elementType.isArray())
{
@@ -1174,6 +1212,11 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
}
+ else if (isNIOBufferClass(elementType))
+ {
+ // type is an array of direct buffers of some sort
+ ptrTypeString = cType.getName();
+ }
else
{
// Type is pointer to something we can't/don't handle
@@ -1228,6 +1271,12 @@ public class CMethodBindingEmitter extends FunctionEmitter
Type cType,
String incomingArgumentName,
String cVariableName) {
+ emitGetDirectBufferAddress(writer,
+ incomingArgumentName,
+ cType.getName(),
+ cVariableName);
+
+ /*
if (EMIT_NULL_CHECKS) {
writer.print(" if (");
writer.print(incomingArgumentName);
@@ -1245,6 +1294,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (EMIT_NULL_CHECKS) {
writer.println(" }");
}
+ */
}
protected String pointerConversionArgumentName(int i) {
@@ -1280,9 +1330,14 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (javaArgType.isArray()) {
Class subArrayElementJavaType = javaArgType.getJavaClass().getComponentType();
return (subArrayElementJavaType.isArray() ||
- subArrayElementJavaType == java.lang.String.class);
+ subArrayElementJavaType == java.lang.String.class ||
+ isNIOBufferClass(subArrayElementJavaType));
}
return false;
}
+
+ protected static boolean isNIOBufferClass(Class c) {
+ return java.nio.Buffer.class.isAssignableFrom(c);
+ }
}