diff options
Diffstat (limited to 'make')
-rw-r--r-- | make/gl-common.cfg | 1 | ||||
-rw-r--r-- | make/gl-impl-CustomCCode.c | 9 | ||||
-rw-r--r-- | make/gl-impl-CustomJavaCode.java | 33 |
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); |