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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
@Override
public GLProfile getGLProfile() {
return this.glProfile;
}
private final GLProfile glProfile;
@Override
public final int glGetBoundBuffer(int target) {
return bufferStateTracker.getBoundBufferObject(target, this);
}
@Override
public final long glGetBufferSize(int buffer) {
synchronized(bufferSizeTracker) {
return bufferSizeTracker.getDirectStateBufferSize(buffer, this);
}
}
@Override
public final boolean glIsVBOArrayBound() {
return checkArrayVBOBound(false);
}
@Override
public final boolean glIsVBOElementArrayBound() {
return checkElementVBOBound(false);
}
@Override
public final GL getDownstreamGL() throws GLException {
return null;
}
@Override
public final GL getRootGL() throws GLException {
return this;
}
@Override
public final boolean isGL() {
return true;
}
@Override
public final GL getGL() throws GLException {
return this;
}
@Override
public final boolean isFunctionAvailable(String glFunctionName) {
return _context.isFunctionAvailable(glFunctionName);
}
@Override
public final boolean isExtensionAvailable(String glExtensionName) {
return _context.isExtensionAvailable(glExtensionName);
}
@Override
public final Object getExtension(String extensionName) {
// At this point we don't expose any extensions using this mechanism
return null;
}
@Override
public final boolean hasBasicFBOSupport() {
return _context.hasBasicFBOSupport();
}
@Override
public final boolean hasFullFBOSupport() {
return _context.hasFullFBOSupport();
}
@Override
public final int getMaxRenderbufferSamples() {
return _context.getMaxRenderbufferSamples();
}
@Override
public final boolean isTextureFormatBGRA8888Available() {
return _context.isTextureFormatBGRA8888Available();
}
@Override
public final GLContext getContext() {
return _context;
}
private final GLContextImpl _context;
/**
* @see javax.media.opengl.GLContext#setSwapInterval(int)
*/
@Override
public final void setSwapInterval(int interval) {
_context.setSwapInterval(interval);
}
/**
* @see javax.media.opengl.GLContext#getSwapInterval()
*/
@Override
public final int getSwapInterval() {
return _context.getSwapInterval();
}
@Override
public final Object getPlatformGLExtensions() {
return _context.getPlatformGLExtensions();
}
@Override
public final int getBoundFramebuffer(int target) {
return _context.getBoundFramebuffer(target);
}
@Override
public final int getDefaultDrawFramebuffer() {
return _context.getDefaultDrawFramebuffer();
}
@Override
public final int getDefaultReadFramebuffer() {
return _context.getDefaultReadFramebuffer();
}
@Override
public final int getDefaultReadBuffer() {
return _context.getDefaultReadBuffer();
}
private final HashMap<MemoryObject, MemoryObject> arbMemCache = new HashMap<MemoryObject, MemoryObject>();
/** Entry point to C language function: <code> void * {@native glMapBuffer}(GLenum target, GLenum access); </code> <br>Part of <code>GL_VERSION_1_5</code>; <code>GL_OES_mapbuffer</code> */
private final java.nio.ByteBuffer glMapBufferImpl(int target, boolean useRange, long offset, long length, int access, long glProcAddress) {
if (glProcAddress == 0) {
throw new GLException("Method \""+(useRange?"glMapBufferRange":"glMapBuffer")+"\" not available");
}
final long addr, sz;
synchronized(bufferSizeTracker) {
sz = bufferSizeTracker.getBufferSize(bufferStateTracker, target, this);
if (0 == sz) {
return null;
}
if( !useRange ) {
length = sz;
offset = 0;
} else {
if( length + offset > sz ) {
throw new GLException("Out of range: offset "+offset+" + length "+length+" > size "+sz);
}
if( 0 > length || 0 > offset ) {
throw new GLException("Invalid values: offset "+offset+", length "+length);
}
if( 0 == length ) {
return null;
}
}
addr = useRange ? dispatch_glMapBufferRange(target, offset, length, access, glProcAddress) :
dispatch_glMapBuffer(target, access, glProcAddress);
}
if (0 == addr) {
return null;
}
final ByteBuffer buffer;
final MemoryObject memObj0 = new MemoryObject(addr, length); // object and key
final MemoryObject memObj1 = MemoryObject.getOrAddSafe(arbMemCache, memObj0);
if(memObj0 == memObj1) {
// just added ..
if(null != memObj0.getBuffer()) {
throw new InternalError();
}
buffer = newDirectByteBuffer(addr, length);
Buffers.nativeOrder(buffer);
memObj0.setBuffer(buffer);
} else {
// already mapped
buffer = memObj1.getBuffer();
if(null == buffer) {
throw new InternalError();
}
}
buffer.position(0);
return buffer;
}
private native long dispatch_glMapBuffer(int target, int access, long glProcAddress);
private native long dispatch_glMapBufferRange(int target, long offset, long length, int access, long procAddress);
/** Entry point to C language function: <code> GLvoid * {@native glMapNamedBufferEXT}(GLuint buffer, GLenum access); </code> <br>Part of <code>GL_EXT_direct_state_access</code> */
private final java.nio.ByteBuffer glMapNamedBufferImpl(int bufferName, int access, long glProcAddress) {
if (glProcAddress == 0) {
throw new GLException("Method \"glMapNamedBufferEXT\" not available");
}
final long addr, sz;
synchronized(bufferSizeTracker) {
sz = bufferSizeTracker.getDirectStateBufferSize(bufferName, this);
if (0 == sz) {
return null;
}
addr = dispatch_glMapNamedBufferEXT(bufferName, access, glProcAddress);
}
if (0 == addr) {
return null;
}
final ByteBuffer buffer;
final MemoryObject memObj0 = new MemoryObject(addr, sz); // object and key
final MemoryObject memObj1 = MemoryObject.getOrAddSafe(arbMemCache, memObj0);
if(memObj0 == memObj1) {
// just added ..
if(null != memObj0.getBuffer()) {
throw new InternalError();
}
buffer = newDirectByteBuffer(addr, sz);
Buffers.nativeOrder(buffer);
memObj0.setBuffer(buffer);
} else {
// already mapped
buffer = memObj1.getBuffer();
if(null == buffer) {
throw new InternalError();
}
}
buffer.position(0);
return buffer;
}
private native long dispatch_glMapNamedBufferEXT(int buffer, int access, long procAddress);
private native ByteBuffer newDirectByteBuffer(long addr, long capacity);
|