1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
// 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;
}
public int hashCode() {
return (int) addr;
}
public boolean equals(Object o) {
if ((o == null) || (!(o instanceof ARBVBOKey))) {
return false;
}
ARBVBOKey other = (ARBVBOKey) o;
return ((addr == other.addr) && (capacity == other.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;
if (__addr_ == 0) {
throw new GLException("Method \"glMapBufferARB\" not available");
}
int[] sz = new int[1];
glGetBufferParameterivARB(target, GL_BUFFER_SIZE_ARB, sz);
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 long dispatch_glMapBufferARB(int target, int access, long glProcAddress);
|