summaryrefslogtreecommitdiffstats
path: root/src/net/java/games/gluegen
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2003-08-07 19:53:38 +0000
committerKenneth Russel <[email protected]>2003-08-07 19:53:38 +0000
commitdb0bdc71eec40d7fcd22ddcea87178c8805d4312 (patch)
treed04e66f83bcf5eeeaa5283f17a86f9093d678e1c /src/net/java/games/gluegen
parentdd16a976876a779dc0ee6da9ebf5ada29f5781c7 (diff)
Changed glMapBufferARB's implementation to return the same ByteBuffer
if the address and capacity of the underlying buffer object haven't changed. This saves applications the cost of re-slicing the returned buffer each frame and avoids allocation of one or more finalizable objects per frame. Moved GlueGen's checking of whether a passed buffer is direct up into Java from C to be able to handle buffers that wrap the NULL pointer (needed for the "buffer offsets" used by ARB_vertex_buffer_object). Ported the VertexArrayRange demo to VertexBufferObject. Currently slower than VertexArrayRange but needs to be updated to triangulate the geometry more efficiently (currently the triangle strips are only 48 vertices long) and to move the indices into fast RAM. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@47 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/net/java/games/gluegen')
-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
5 files changed, 37 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());
+ }
}