From 50f9c9e113b09ab54ba40abba6b2face27c9a139 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Fri, 27 Dec 2019 03:50:32 +0100 Subject: Bug 1287 - Complete Immutable glNamedBufferStorage support in GLBufferObjectTracker As of the time of implementation, named immutable buffers were not fully supported within GL 4.4. This has changed, i.e. GL 4.5 supports glNamedBufferStorage. This patch adds support for the immutable named buffer storage case. jogl commit 09fc7aa5539731bb0fba835caee61f6eb837ecff, added GLBufferObjectTracker allowing to keep required references to NIO object. This tracker complements the NIO buffer lifecycle with the GL semantics. --- .../classes/jogamp/opengl/GLBufferObjectTracker.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java') diff --git a/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java b/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java index 717ee2cab..fb8b14697 100644 --- a/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java +++ b/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java @@ -167,7 +167,8 @@ public class GLBufferObjectTracker { final boolean invalidSize = ( mutableBuffer && 0 > size ) // glBufferData, glNamedBufferData || ( !mutableBuffer && 0 >= size ); // glBufferStorage if( invalidSize ) { - throw new GLException(String.format("%s: Invalid size %d for buffer %d on target 0x%X", GL_INVALID_VALUE, size, bufferName, target)); + throw new GLException(String.format("%s: Invalid size %d for %s buffer %d on target 0x%X", + GL_INVALID_VALUE, size, mutableBuffer ? "mutable" : "immutable", bufferName, target)); } dispatch.create(target, size, data, mutableBuffer ? mutableUsage : immutableFlags); @@ -211,18 +212,18 @@ public class GLBufferObjectTracker { if (DEBUG && GL.GL_NO_ERROR != glerrPre) { System.err.printf("%s.%s glerr-pre 0x%X%n", msgClazzName, msgCreateNamed, glerrPre); } - if ( 0 > size ) { // glBufferData, glNamedBufferData - throw new GLException(String.format("%s: Invalid size %d for buffer %d", GL_INVALID_VALUE, size, bufferName)); - } final boolean mutableBuffer = 0 != mutableUsage; - if( !mutableBuffer ) { - throw new InternalError("Immutable glNamedBufferStorage not supported yet"); + final boolean invalidSize = ( mutableBuffer && 0 > size ) // glBufferData, glNamedBufferData + || ( !mutableBuffer && 0 >= size ); // glBufferStorage + if( invalidSize ) { + throw new GLException(String.format("%s: Invalid size %d for %s buffer %d", + GL_INVALID_VALUE, size, mutableBuffer ? "mutable" : "immutable", bufferName)); } - dispatch.create(bufferName, size, data, mutableUsage); + dispatch.create(bufferName, size, data, mutableBuffer ? mutableUsage : immutableFlags); final int glerrPost = caller.glGetError(); // be safe, catch failure! if(GL.GL_NO_ERROR != glerrPost) { throw new GLException(String.format("GL-Error 0x%X while creating %s storage for buffer %d of size %d with data %s", - glerrPost, "mutable", bufferName, size, data)); + glerrPost, mutableBuffer ? "mutable" : "immutable", bufferName, size, data)); } final GLBufferStorageImpl objOld = (GLBufferStorageImpl) bufferName2StorageMap.get(bufferName); if( null != objOld ) { -- cgit v1.2.3