diff options
author | Kenneth Russel <[email protected]> | 2003-08-07 19:53:38 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2003-08-07 19:53:38 +0000 |
commit | db0bdc71eec40d7fcd22ddcea87178c8805d4312 (patch) | |
tree | d04e66f83bcf5eeeaa5283f17a86f9093d678e1c /make | |
parent | dd16a976876a779dc0ee6da9ebf5ada29f5781c7 (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 '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); |