diff options
Diffstat (limited to 'make')
-rw-r--r-- | make/gl-common.cfg | 4 | ||||
-rw-r--r-- | make/gl-impl-CustomJavaCode.java | 94 |
2 files changed, 94 insertions, 4 deletions
diff --git a/make/gl-common.cfg b/make/gl-common.cfg index b06742518..984d0f45a 100644 --- a/make/gl-common.cfg +++ b/make/gl-common.cfg @@ -262,6 +262,10 @@ ArgumentIsString glGetAttribLocationARB 1 # JavaPrologue glBegin inBeginEndPair = true; JavaEpilogue glEnd inBeginEndPair = false; +JavaEpilogue glBindBuffer setBoundBufferObject({0}, {1}); +JavaEpilogue glBindBufferARB setBoundBufferObject({0}, {1}); +JavaEpilogue glPushClientAttrib clearBufferObjectState(); +JavaEpilogue glPopClientAttrib clearBufferObjectState(); BufferObjectKind UnpackPixel glBitmap BufferObjectKind UnpackPixel glColorTable BufferObjectKind UnpackPixel glColorSubTable diff --git a/make/gl-impl-CustomJavaCode.java b/make/gl-impl-CustomJavaCode.java index 4e761c3bf..ac2c1eab5 100644 --- a/make/gl-impl-CustomJavaCode.java +++ b/make/gl-impl-CustomJavaCode.java @@ -153,7 +153,10 @@ private boolean bufferObjectExtensionsInitialized = false; private boolean haveARBPixelBufferObject; private boolean haveEXTPixelBufferObject; private boolean haveGL15; +private boolean haveGL21; private boolean haveARBVertexBufferObject; +private boolean[] bufferBindingsKnown = new boolean[4]; +private int[] bufferBindings = new int[4]; private void initBufferObjectExtensionChecks() { if (bufferObjectExtensionsInitialized) @@ -162,30 +165,105 @@ private void initBufferObjectExtensionChecks() { haveARBPixelBufferObject = isExtensionAvailable("GL_ARB_pixel_buffer_object"); haveEXTPixelBufferObject = isExtensionAvailable("GL_EXT_pixel_buffer_object"); haveGL15 = isExtensionAvailable("GL_VERSION_1_5"); + haveGL21 = isExtensionAvailable("GL_VERSION_2_1"); haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object"); } +// Might want to call this from GLContext.makeCurrent() in the future +// to possibly increase the robustness of these caches +private void clearBufferObjectState() { + for (int i = 0; i < bufferBindingsKnown.length; i++) { + bufferBindingsKnown[i] = false; + } +} + +// Called by glBindBuffer +private void setBoundBufferObject(int state, int buffer) { + switch (state) { + case GL.GL_ARRAY_BUFFER: + bufferBindingsKnown[0] = true; + bufferBindings[0] = buffer; + break; + + case GL.GL_ELEMENT_ARRAY_BUFFER: + bufferBindingsKnown[1] = true; + bufferBindings[1] = buffer; + break; + + case GL.GL_PIXEL_PACK_BUFFER: + bufferBindingsKnown[2] = true; + bufferBindings[2] = buffer; + break; + + case GL.GL_PIXEL_UNPACK_BUFFER: + bufferBindingsKnown[3] = true; + bufferBindings[3] = buffer; + break; + + default: + // There are other enumerants now supported as arguments to + // glBindBuffer(); e.g., GL_TRANSFORM_FEEDBACK_BUFFER_NV. It is + // likely this code will need to be updated in the future, but + // for now it is believed that there are no other enumerants + // that need to be supported in order to support the buffer + // object checking necessary for class GL. + break; + } +} + +private int getBoundBufferObject(int state) { + // Compute the index we need + int index = -1; + switch (state) { + case GL.GL_ARRAY_BUFFER_BINDING: + index = 0; + break; + case GL.GL_ELEMENT_ARRAY_BUFFER_BINDING: + index = 1; + break; + case GL.GL_PIXEL_PACK_BUFFER_BINDING: + index = 2; + break; + case GL.GL_PIXEL_UNPACK_BUFFER_BINDING: + index = 3; + break; + default: + // No other currently supported enumerants; return early + break; + } + if (index < 0) + return 0; + if (!bufferBindingsKnown[index]) { + // Get the state and cache it + glGetIntegerv(state, bufTmp, 0); + bufferBindingsKnown[index] = true; + bufferBindings[index] = bufTmp[0]; + } + return bufferBindings[index]; +} + private void checkBufferObject(boolean extension1, boolean extension2, + boolean extension3, boolean enabled, int state, String kind) { if (inBeginEndPair) { throw new GLException("May not call this between glBegin and glEnd"); } - boolean avail = (extension1 || extension2); + boolean avail = (extension1 || extension2 || extension3); if (!avail) { if (!enabled) return; throw new GLException("Required extensions not available to call this function"); } - glGetIntegerv(state, bufTmp, 0); + int buffer = getBoundBufferObject(state); if (enabled) { - if (bufTmp[0] == 0) { + if (buffer == 0) { throw new GLException(kind + " must be enabled to call this method"); } } else { - if (bufTmp[0] != 0) { + if (buffer != 0) { throw new GLException(kind + " must be disabled to call this method"); } } @@ -195,6 +273,7 @@ private void checkUnpackPBODisabled() { initBufferObjectExtensionChecks(); checkBufferObject(haveARBPixelBufferObject, haveEXTPixelBufferObject, + haveGL21, false, GL.GL_PIXEL_UNPACK_BUFFER_BINDING_ARB, "unpack pixel_buffer_object"); @@ -204,6 +283,7 @@ private void checkUnpackPBOEnabled() { initBufferObjectExtensionChecks(); checkBufferObject(haveARBPixelBufferObject, haveEXTPixelBufferObject, + haveGL21, true, GL.GL_PIXEL_UNPACK_BUFFER_BINDING_ARB, "unpack pixel_buffer_object"); @@ -213,6 +293,7 @@ private void checkPackPBODisabled() { initBufferObjectExtensionChecks(); checkBufferObject(haveARBPixelBufferObject, haveEXTPixelBufferObject, + haveGL21, false, GL.GL_PIXEL_PACK_BUFFER_BINDING_ARB, "pack pixel_buffer_object"); @@ -222,6 +303,7 @@ private void checkPackPBOEnabled() { initBufferObjectExtensionChecks(); checkBufferObject(haveARBPixelBufferObject, haveEXTPixelBufferObject, + haveGL21, true, GL.GL_PIXEL_PACK_BUFFER_BINDING_ARB, "pack pixel_buffer_object"); @@ -233,6 +315,7 @@ private void checkArrayVBODisabled() { checkBufferObject(haveGL15, haveARBVertexBufferObject, false, + false, GL.GL_ARRAY_BUFFER_BINDING, "array vertex_buffer_object"); } @@ -241,6 +324,7 @@ private void checkArrayVBOEnabled() { initBufferObjectExtensionChecks(); checkBufferObject(haveGL15, haveARBVertexBufferObject, + false, true, GL.GL_ARRAY_BUFFER_BINDING, "array vertex_buffer_object"); @@ -251,6 +335,7 @@ private void checkElementVBODisabled() { checkBufferObject(haveGL15, haveARBVertexBufferObject, false, + false, GL.GL_ELEMENT_ARRAY_BUFFER_BINDING, "element vertex_buffer_object"); } @@ -259,6 +344,7 @@ private void checkElementVBOEnabled() { initBufferObjectExtensionChecks(); checkBufferObject(haveGL15, haveARBVertexBufferObject, + false, true, GL.GL_ELEMENT_ARRAY_BUFFER_BINDING, "element vertex_buffer_object"); |