aboutsummaryrefslogtreecommitdiffstats
path: root/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/net')
-rw-r--r--src/net/java/games/gluegen/CMethodBindingEmitter.java14
-rw-r--r--src/net/java/games/gluegen/CodeGenUtils.java1
-rw-r--r--src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java10
-rw-r--r--src/net/java/games/gluegen/MethodBinding.java4
-rw-r--r--src/net/java/games/gluegen/runtime/BufferFactory.java25
-rw-r--r--src/net/java/games/jogl/impl/InternalBufferUtils.java55
6 files changed, 92 insertions, 17 deletions
diff --git a/src/net/java/games/gluegen/CMethodBindingEmitter.java b/src/net/java/games/gluegen/CMethodBindingEmitter.java
index 763fe6695..27df36cea 100644
--- a/src/net/java/games/gluegen/CMethodBindingEmitter.java
+++ b/src/net/java/games/gluegen/CMethodBindingEmitter.java
@@ -1205,20 +1205,6 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.print(incomingArgumentName);
writer.println(");");
- writer.print(" if (");
- writer.print(cVariableName);
- writer.println(" == NULL) {");
- writer.println(" (*env)->ThrowNew(env, (*env)->FindClass(env, \"java/lang/RuntimeException\"),");
- writer.print (" \"Argument \\\"");
- writer.print(incomingArgumentName);
- writer.println("\\\" was not a direct buffer\");");
- writer.print (" return");
- if (!binding.getJavaReturnType().isVoid()) {
- writer.print(" 0");
- }
- writer.println(";");
- writer.println(" }");
-
if (EMIT_NULL_CHECKS) {
writer.println(" }");
}
diff --git a/src/net/java/games/gluegen/CodeGenUtils.java b/src/net/java/games/gluegen/CodeGenUtils.java
index 313896d13..d982f2390 100644
--- a/src/net/java/games/gluegen/CodeGenUtils.java
+++ b/src/net/java/games/gluegen/CodeGenUtils.java
@@ -94,6 +94,7 @@ public class CodeGenUtils
w.print(imports[i]);
w.println(';');
}
+ w.println("import net.java.games.gluegen.runtime.*;");
w.println();
diff --git a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
index 2ec2723bd..78a4a6ced 100644
--- a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
+++ b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
@@ -89,10 +89,10 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
}
protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- emitArrayLengthChecks(binding, writer);
+ emitArrayLengthAndNIOBufferChecks(binding, writer);
}
- protected void emitArrayLengthChecks(MethodBinding binding, PrintWriter writer) {
+ protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) {
// Check lengths of any incoming arrays if necessary
for (int i = 0; i < binding.getNumArguments(); i++) {
Type type = binding.getCArgumentType(i);
@@ -101,6 +101,12 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
writer.println(" if (" + binding.getArgumentName(i) + ".length < " + arrayType.getLength() + ")");
writer.println(" throw new " + getRuntimeExceptionType() + "(\"Length of array \\\"" + binding.getArgumentName(i) +
"\\\" was less than the required " + arrayType.getLength() + "\");");
+ } else {
+ if (binding.getJavaArgumentType(i).isNIOBuffer()) {
+ writer.println(" if (!BufferFactory.isDirect(" + binding.getArgumentName(i) + "))");
+ writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" +
+ binding.getArgumentName(i) + "\\\" was not a direct buffer\");");
+ }
}
}
}
diff --git a/src/net/java/games/gluegen/MethodBinding.java b/src/net/java/games/gluegen/MethodBinding.java
index b8f0eefdf..af86f0b66 100644
--- a/src/net/java/games/gluegen/MethodBinding.java
+++ b/src/net/java/games/gluegen/MethodBinding.java
@@ -184,8 +184,10 @@ public class MethodBinding {
JavaType javaArgType = getJavaArgumentType(i);
Type cArgType = getCArgumentType(i);
if (javaArgType.isCompoundTypeWrapper() ||
+ javaArgType.isNIOBuffer() ||
cArgType.isArray()) {
- // Needs unwrapping of accessors or checking of array lengths
+ // Needs unwrapping of accessors, checking of array
+ // lengths, or checking of direct buffer property
needsBody = true;
break;
}
diff --git a/src/net/java/games/gluegen/runtime/BufferFactory.java b/src/net/java/games/gluegen/runtime/BufferFactory.java
index 2efb78ca6..67ffea1d8 100644
--- a/src/net/java/games/gluegen/runtime/BufferFactory.java
+++ b/src/net/java/games/gluegen/runtime/BufferFactory.java
@@ -47,4 +47,29 @@ public class BufferFactory {
buf.order(ByteOrder.nativeOrder());
return buf;
}
+
+ /** Helper routine to tell whether a buffer is direct or not. Null
+ pointers are considered direct. isDirect() should really be
+ public in Buffer and not replicated in all subclasses. */
+ public static boolean isDirect(Buffer buf) {
+ if (buf == null) {
+ return true;
+ }
+ if (buf instanceof ByteBuffer) {
+ return ((ByteBuffer) buf).isDirect();
+ } else if (buf instanceof FloatBuffer) {
+ return ((FloatBuffer) buf).isDirect();
+ } else if (buf instanceof DoubleBuffer) {
+ return ((DoubleBuffer) buf).isDirect();
+ } else if (buf instanceof CharBuffer) {
+ return ((CharBuffer) buf).isDirect();
+ } else if (buf instanceof ShortBuffer) {
+ return ((ShortBuffer) buf).isDirect();
+ } else if (buf instanceof IntBuffer) {
+ return ((IntBuffer) buf).isDirect();
+ } else if (buf instanceof LongBuffer) {
+ return ((LongBuffer) buf).isDirect();
+ }
+ throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
+ }
}
diff --git a/src/net/java/games/jogl/impl/InternalBufferUtils.java b/src/net/java/games/jogl/impl/InternalBufferUtils.java
new file mode 100644
index 000000000..707ebbe93
--- /dev/null
+++ b/src/net/java/games/jogl/impl/InternalBufferUtils.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package net.java.games.jogl.impl;
+
+import java.nio.*;
+
+/** Utility routines available only to the JOGL implementation. */
+
+public class InternalBufferUtils {
+ /** Allocates a new direct byte buffer at the given address with the
+ given capacity. This is exposed only because of glMapBufferARB
+ and its semantics; it is undesirable to allocate a new buffer
+ every frame because (a) ByteBuffers are finalizable and (b) the
+ application would typically need to re-slice the buffer every
+ frame. Instead we cache these ByteBuffer objects up in Java and
+ look them up in a HashMap by base address and capacity. */
+ public static native ByteBuffer newDirectByteBuffer(long address, int capacity);
+}