aboutsummaryrefslogtreecommitdiffstats
path: root/make
diff options
context:
space:
mode:
Diffstat (limited to 'make')
-rw-r--r--make/gl-common.cfg1
-rw-r--r--make/gl-impl-CustomCCode.c9
-rw-r--r--make/gl-impl-CustomJavaCode.java33
3 files changed, 33 insertions, 10 deletions
diff --git a/make/gl-common.cfg b/make/gl-common.cfg
index 9f2acf1c2..283ae1cc7 100644
--- a/make/gl-common.cfg
+++ b/make/gl-common.cfg
@@ -6,6 +6,7 @@ RuntimeExceptionType GLException
# Imports needed by all glue code
Import java.nio.*
+Import java.util.*
Import net.java.games.jogl.*
Import net.java.games.jogl.impl.*
diff --git a/make/gl-impl-CustomCCode.c b/make/gl-impl-CustomCCode.c
index 1616353d9..0f02f2d48 100644
--- a/make/gl-impl-CustomCCode.c
+++ b/make/gl-impl-CustomCCode.c
@@ -1,15 +1,14 @@
/* Java->C glue code:
* Java package: net.java.games.jogl.impl.windows.WindowsGLImpl
- * Java method: java.nio.ByteBuffer dispatch_glMapBufferARB(int target, int access)
+ * Java method: long dispatch_glMapBufferARB(int target, int access)
* C function: LPVOID glMapBufferARB(GLenum target, GLenum access);
*/
-JNIEXPORT jobject JNICALL
-Java_net_java_games_jogl_impl_windows_WindowsGLImpl_dispatch_1glMapBufferARB(JNIEnv *env, jobject _unused, jint target, jint access, jint size, jlong glProcAddress) {
+JNIEXPORT jlong JNICALL
+Java_net_java_games_jogl_impl_windows_WindowsGLImpl_dispatch_1glMapBufferARB(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
PFNGLMAPBUFFERARBPROC ptr_glMapBufferARB;
LPVOID _res;
ptr_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) (intptr_t) glProcAddress;
assert(ptr_glMapBufferARB != NULL);
_res = (* ptr_glMapBufferARB) ((GLenum) target, (GLenum) access);
- if (_res == NULL) return NULL;
- return (*env)->NewDirectByteBuffer(env, _res, size);
+ return (jlong) (intptr_t) _res;
}
diff --git a/make/gl-impl-CustomJavaCode.java b/make/gl-impl-CustomJavaCode.java
index 86fac5b5c..bd2be71f6 100644
--- a/make/gl-impl-CustomJavaCode.java
+++ b/make/gl-impl-CustomJavaCode.java
@@ -1,3 +1,17 @@
+// Attempt to return the same ByteBuffer object from glMapBufferARB if
+// the vertex buffer object's base address and size haven't changed
+private static class ARBVBOKey {
+ private long addr;
+ private int capacity;
+
+ ARBVBOKey(long addr, int capacity) {
+ this.addr = addr;
+ this.capacity = capacity;
+ }
+}
+
+private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
+
/** Entry point to C language function: <br> <code> LPVOID glMapBufferARB(GLenum target, GLenum access); </code> */
public java.nio.ByteBuffer glMapBufferARB(int target, int access) {
final long __addr_ = _context.getGLProcAddressTable()._addressof_glMapBufferARB;
@@ -6,11 +20,20 @@ public java.nio.ByteBuffer glMapBufferARB(int target, int access) {
}
int[] sz = new int[1];
glGetBufferParameterivARB(target, GL_BUFFER_SIZE_ARB, sz);
- ByteBuffer _res;
- _res = dispatch_glMapBufferARB(target, access, sz[0], __addr_);
- if (_res == null) return null;
- return _res.order(ByteOrder.nativeOrder());
+ long addr;
+ addr = dispatch_glMapBufferARB(target, access, __addr_);
+ if (addr == 0 || sz[0] == 0) {
+ return null;
+ }
+ ARBVBOKey key = new ARBVBOKey(addr, sz[0]);
+ ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
+ if (_res == null) {
+ _res = InternalBufferUtils.newDirectByteBuffer(addr, sz[0]);
+ _res.order(ByteOrder.nativeOrder());
+ arbVBOCache.put(key, _res);
+ }
+ return _res;
}
/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBufferARB(GLenum target, GLenum access); </code> */
-native private java.nio.ByteBuffer dispatch_glMapBufferARB(int target, int access, int size, long glProcAddress);
+native private long dispatch_glMapBufferARB(int target, int access, long glProcAddress);