From 7749f0567fb592ee4b3f698bd2424a5687b02f47 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sun, 21 Sep 2014 01:28:04 +0200
Subject: Bug 1066: Reduce glGetError() in FBObject / GLFBODrawableImpl

- GLFBODrawableImpl
  - cache getMaxRenderbufferSamples() result from initialize call,
    method checks glGetError()

- FBObject
  - init(..): Remove one redundant checkPreGLError()

  - Allow reset(..) / modify-attachment-operations w/o glGetError():
    - Only check error if DEBUG || GLContext.DEBUG_GL:
      - RenderAttachment.initialize()
      - TexureAttachment.initialize()
      - syncSamplingSink(gl)
---
 src/jogl/classes/com/jogamp/opengl/FBObject.java   | 61 +++++++++++++---------
 .../classes/jogamp/opengl/GLFBODrawableImpl.java   |  4 +-
 2 files changed, 39 insertions(+), 26 deletions(-)

(limited to 'src/jogl/classes')

diff --git a/src/jogl/classes/com/jogamp/opengl/FBObject.java b/src/jogl/classes/com/jogamp/opengl/FBObject.java
index d16bed276..03693a688 100644
--- a/src/jogl/classes/com/jogamp/opengl/FBObject.java
+++ b/src/jogl/classes/com/jogamp/opengl/FBObject.java
@@ -422,8 +422,10 @@ public class FBObject {
         public boolean initialize(final GL gl) throws GLException {
             final boolean init = 0 == getName();
             if( init ) {
-                checkPreGLError(gl);
-
+                final boolean checkError = DEBUG || GLContext.DEBUG_GL;
+                if( checkError ) {
+                    checkPreGLError(gl);
+                }
                 final int[] name = new int[] { -1 };
                 gl.glGenRenderbuffers(1, name, 0);
                 setName(name[0]);
@@ -434,11 +436,13 @@ public class FBObject {
                 } else {
                     gl.glRenderbufferStorage(GL.GL_RENDERBUFFER, format, getWidth(), getHeight());
                 }
-                final int glerr = gl.glGetError();
-                if(GL.GL_NO_ERROR != glerr) {
-                    gl.glDeleteRenderbuffers(1, name, 0);
-                    setName(0);
-                    throw new GLException("GL Error "+toHexString(glerr)+" while creating "+this);
+                if( checkError ) {
+                    final int glerr = gl.glGetError();
+                    if(GL.GL_NO_ERROR != glerr) {
+                        gl.glDeleteRenderbuffers(1, name, 0);
+                        setName(0);
+                        throw new GLException("GL Error "+toHexString(glerr)+" while creating "+this);
+                    }
                 }
                 if(DEBUG) {
                     System.err.println("Attachment.init.X: "+this);
@@ -528,8 +532,10 @@ public class FBObject {
         public boolean initialize(final GL gl) throws GLException {
             final boolean init = 0 == getName();
             if( init ) {
-                checkPreGLError(gl);
-
+                final boolean checkError = DEBUG || GLContext.DEBUG_GL;
+                if( checkError ) {
+                    checkPreGLError(gl);
+                }
                 final int[] name = new int[] { -1 };
                 gl.glGenTextures(1, name, 0);
                 if(0 == name[0]) {
@@ -550,17 +556,21 @@ public class FBObject {
                 if( 0 < wrapT ) {
                     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, wrapT);
                 }
-                boolean preTexImage2D = true;
-                int glerr = gl.glGetError();
-                if(GL.GL_NO_ERROR == glerr) {
-                    preTexImage2D = false;
+                if( checkError ) {
+                    boolean preTexImage2D = true;
+                    int glerr = gl.glGetError();
+                    if(GL.GL_NO_ERROR == glerr) {
+                        preTexImage2D = false;
+                        gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, format, getWidth(), getHeight(), 0, dataFormat, dataType, null);
+                        glerr = gl.glGetError();
+                    }
+                    if(GL.GL_NO_ERROR != glerr) {
+                        gl.glDeleteTextures(1, name, 0);
+                        setName(0);
+                        throw new GLException("GL Error "+toHexString(glerr)+" while creating (pre TexImage2D "+preTexImage2D+") "+this);
+                    }
+                } else {
                     gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, format, getWidth(), getHeight(), 0, dataFormat, dataType, null);
-                    glerr = gl.glGetError();
-                }
-                if(GL.GL_NO_ERROR != glerr) {
-                    gl.glDeleteTextures(1, name, 0);
-                    setName(0);
-                    throw new GLException("GL Error "+toHexString(glerr)+" while creating (pre TexImage2D "+preTexImage2D+") "+this);
                 }
                 if(DEBUG) {
                     System.err.println("Attachment.init.X: "+this);
@@ -1009,8 +1019,6 @@ public class FBObject {
         gl.glGetIntegerv(GL.GL_MAX_RENDERBUFFER_SIZE, val, 0);
         maxRenderbufferSize = val[0];
 
-        checkPreGLError(gl);
-
         this.width = 0 < newWidth ? newWidth : 1;
         this.height = 0 < newHeight ? newHeight : 1;
         this.samples = newSamples <= maxSamples ? newSamples : maxSamples;
@@ -1035,7 +1043,7 @@ public class FBObject {
             System.err.println(JoglVersion.getGLStrings(gl, null, false).toString());
         }
 
-        checkNoError(null, gl.glGetError(), "FBObject Init.pre"); // throws GLException if error
+        checkPreGLError(gl);
 
         if( width > maxRenderbufferSize || height > maxRenderbufferSize  ) {
             throw new GLException("Size "+width+"x"+height+" exceeds on of the maxima renderbuffer size "+maxRenderbufferSize+": \n\t"+this);
@@ -2584,12 +2592,17 @@ public class FBObject {
             if( isModified() ) {
                 resetSamplingSink(gl);
             }
-            checkPreGLError(gl);
+            final boolean checkError = DEBUG || GLContext.DEBUG_GL;
+            if( checkError ) {
+                checkPreGLError(gl);
+            }
             gl.glBindFramebuffer(GL2ES3.GL_READ_FRAMEBUFFER, fbName); // read from this MSAA fb
             gl.glBindFramebuffer(GL2ES3.GL_DRAW_FRAMEBUFFER, samplingSink.getWriteFramebuffer()); // write to sampling sink
             ((GL2ES3)gl).glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, // since MSAA is supported, casting to GL2ES3 is OK
                                            GL.GL_COLOR_BUFFER_BIT, GL.GL_NEAREST);
-            checkNoError(null, gl.glGetError(), "FBObject syncSampleSink"); // throws GLException if error
+            if( checkError ) {
+                checkNoError(null, gl.glGetError(), "FBObject syncSampleSink"); // throws GLException if error
+            }
         } else {
             modified = false;
         }
diff --git a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
index 72caabdd0..991a351e6 100644
--- a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
@@ -52,6 +52,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
     private GLCapabilitiesImmutable origParentChosenCaps;
 
     private boolean initialized;
+    private int maxSamples;
     private int fboModeBits;
     private int texUnit;
     private int samples;
@@ -180,7 +181,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
         if(realize) {
             final GLCapabilities chosenFBOCaps = (GLCapabilities) getChosenGLCapabilities(); // cloned at setRealized(true)
 
-            final int maxSamples = gl.getMaxRenderbufferSamples();
+            maxSamples = gl.getMaxRenderbufferSamples(); // if > 0 implies fullFBOSupport
             {
                 final int newSamples = samples <= maxSamples ? samples : maxSamples;
                 if(DEBUG) {
@@ -292,7 +293,6 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
         fboBound = false; // clear bound-flag immediatly, caused by contextMadeCurrent(..) - otherwise we would swap @ release
         fboSwapped = false;
         try {
-            final int maxSamples = gl.getMaxRenderbufferSamples();
             newSamples = newSamples <= maxSamples ? newSamples : maxSamples;
 
             if(0==samples && 0<newSamples || 0<samples && 0==newSamples) {
-- 
cgit v1.2.3