commit 9b94626c9a29f4e26c11f87608f0636f9f85bc43
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Jun 29 00:54:00 2018 +0100

    Port some obvious stuff from OIT branch.

diff --git a/src/main/java/org/distorted/library/main/Distorted.java b/src/main/java/org/distorted/library/main/Distorted.java
index 0135f0e..0c20b22 100644
--- a/src/main/java/org/distorted/library/main/Distorted.java
+++ b/src/main/java/org/distorted/library/main/Distorted.java
@@ -86,7 +86,7 @@ public class Distorted
    *
    * https://community.arm.com/graphics/f/discussions/10285/opengl-es-3-1-on-mali-t880-flashes
    */
-  public static final int FBO_QUEUE_SIZE = 3;
+  public static final int FBO_QUEUE_SIZE = 4;
 
   private static boolean mInitialized=false;
 
@@ -142,8 +142,7 @@ public class Distorted
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
- * Call this so that the Library can mark OpenGL objects that would need to be recreated when we
- * get resumed.
+ * Call this so that the Library can release the OpenGL related data that needs to be recreated.
  * Must be called from Activity.onPause().
  */
   public static void onPause()
@@ -172,4 +171,13 @@ public class Distorted
 
     mInitialized = false;
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Return 2 or 3 depending if we have OpenGL Es 2.0 or 3.x context created.
+ */
+  public static int getGlVersion()
+    {
+    return GLSL == 300 ? 3:2;
+    }
   }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 3154b63..05edc63 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -334,13 +334,13 @@ public class DistortedEffects
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
+
   private void releasePriv()
     {
-    if( !matrixCloned   )   mM.abortAll(false);
-    if( !vertexCloned   )   mV.abortAll(false);
-    if( !fragmentCloned )   mF.abortAll(false);
-    if( !postprocessCloned) mP.abortAll(false);
+    if( !matrixCloned      ) mM.abortAll(false);
+    if( !vertexCloned      ) mV.abortAll(false);
+    if( !fragmentCloned    ) mF.abortAll(false);
+    if( !postprocessCloned ) mP.abortAll(false);
 
     mM = null;
     mV = null;
@@ -352,7 +352,7 @@ public class DistortedEffects
 
   static void onDestroy()
     {
-    mNextID = 0;
+    mNextID =  0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index 9ab09de..1959a4e 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -70,7 +70,7 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
   private ArrayList<Job> mJobs = new ArrayList<>();
 
   // Global buffers used for postprocessing.
-  private static DistortedOutputSurface[] mBuffer = null;
+  private static DistortedOutputSurface[] mBuffer = new DistortedOutputSurface[EffectQuality.LENGTH];
 
   private float mFOV;
   float mDistance, mNear;
@@ -175,15 +175,14 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
 
   private static void createPostprocessingBuffers(int width, int height, float near)
     {
-    mBuffer = new DistortedOutputSurface[EffectQuality.LENGTH];
     float mipmap=1.0f;
 
-    for(int j=0; j<EffectQuality.LENGTH; j++)
+    for (int j=0; j<EffectQuality.LENGTH; j++)
       {
       mBuffer[j] = new DistortedFramebuffer(Distorted.FBO_QUEUE_SIZE,2,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(width*mipmap), (int)(height*mipmap) );
       mBuffer[j].mMipmap = mipmap;
-      mBuffer[j].mNear   = near;  // copy mNear as well (for blitting- see PostprocessEffect.apply() )
-      mBuffer[j].glClearColor(1.0f,1.0f,1.0f,0.0f);
+      mBuffer[j].mNear = near;  // copy mNear as well (for blitting- see PostprocessEffect.apply() )
+      mBuffer[j].glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
 
       mipmap *= EffectQuality.MULTIPLIER;
       }
@@ -192,12 +191,12 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
 
     GLES31.glStencilMask(0xff);
     GLES31.glDepthMask(true);
-    GLES31.glColorMask(true,true,true,true);
-    GLES31.glClearColor(1.0f,1.0f,1.0f,0.0f);
+    GLES31.glColorMask(true, true, true, true);
+    GLES31.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
     GLES31.glClearDepthf(1.0f);
     GLES31.glClearStencil(0);
 
-    for(int j=0; j<EffectQuality.LENGTH; j++)
+    for (int j=0; j<EffectQuality.LENGTH; j++)
       {
       for(int k=0; k<Distorted.FBO_QUEUE_SIZE; k++)
         {
@@ -216,14 +215,9 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
 
   static synchronized void onDestroy()
     {
-    if( mBuffer!=null )
+    for(int j=0; j<EffectQuality.LENGTH; j++)
       {
-      for (int i=0; i<EffectQuality.LENGTH; i++)
-        {
-        mBuffer[i] = null;
-        }
-
-      mBuffer = null;
+      mBuffer[j] = null;
       }
     }
 
@@ -341,7 +335,7 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
         }
       else
         {
-        if( mBuffer==null ) createPostprocessingBuffers(mWidth,mHeight,mNear);
+        if( mBuffer[0]==null ) createPostprocessingBuffers(mWidth,mHeight,mNear);
 
         if( lastBucket!=currBucket )
           {
@@ -360,8 +354,7 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
 
             numRenders += lastQueue.postprocess(mBuffer,fbo);
             numRenders += blitWithDepth(time, mBuffer[quality],fbo);
-
-            mBuffer[quality].setAsOutputAndClear(time,fbo);
+            mBuffer[quality].clearBuffer(time,fbo);
             }
 
           internalQuality = currQueue.getInternalQuality();
@@ -384,7 +377,7 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
           numRenders += currQueue.postprocess(mBuffer,fbo);
           numRenders += blitWithDepth(time, mBuffer[quality],fbo);
           }
-        } // end postprocessed child case
+        } // end else (postprocessed child)
 
       lastQueue = currQueue;
       lastBucket= currBucket;
@@ -423,13 +416,8 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Bind this Surface as a Framebuffer we can render to; always clear it's color bit.
- *
- * Useful for drawing to the postprocessing buffer, which must sometimes be cleared multiple times
- * per frame.
- */
-  private void setAsOutputAndClear(long time,int fbo)
+
+  private void clearBuffer(long time,int fbo)
     {
     GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[fbo]);
 
@@ -578,7 +566,6 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
  * <p>
  * This version does not attempt to clear anything.
  */
-
   public void setAsOutput()
     {
     GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]);
diff --git a/src/main/java/org/distorted/library/main/DistortedScreen.java b/src/main/java/org/distorted/library/main/DistortedScreen.java
index 57556ea..f128afd 100644
--- a/src/main/java/org/distorted/library/main/DistortedScreen.java
+++ b/src/main/java/org/distorted/library/main/DistortedScreen.java
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2018 Leszek Koltunski                                                               //
+// Copyright 2016 Leszek Koltunski                                                               //
 //                                                                                               //
 // This file is part of Distorted.                                                               //
 //                                                                                               //
@@ -55,7 +55,9 @@ public class DistortedScreen extends DistortedFramebuffer
   private static MatrixEffectMove mMoveEffect = new MatrixEffectMove( new Static3D(5,5,0) );
   ///// END DEBUGGING //////////////////////////
 
-  private int mCurrFBO, mLastFBO;
+  private int mCurRenderedFBO;    // During the first FBO_QUEUE_SIZE frames, we blit the very first
+  private int mToBeBlittedFBO;    // FBO one we have rendered. Then, we keep blitting the one we
+  private boolean mFirstCircle;   // rendered FBO_QUEUE_SIZE ago.
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
@@ -69,8 +71,9 @@ public class DistortedScreen extends DistortedFramebuffer
     {
     super(Distorted.FBO_QUEUE_SIZE,1,BOTH_DEPTH_STENCIL, TYPE_SYST, 1,1);
     mShowFPS = false;
-    mCurrFBO = 0;
-    mLastFBO = 1;
+    mCurRenderedFBO = 0;
+    mToBeBlittedFBO = 0;
+    mFirstCircle = true;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -84,9 +87,6 @@ public class DistortedScreen extends DistortedFramebuffer
  */
   public int render(long time)
     {
-    if( ++mCurrFBO>=Distorted.FBO_QUEUE_SIZE ) mCurrFBO=0;
-    if( ++mLastFBO>=Distorted.FBO_QUEUE_SIZE ) mLastFBO=0;
-
     if( mShowFPS )
       {
       if( lastTime==0 ) lastTime = time;
@@ -107,7 +107,7 @@ public class DistortedScreen extends DistortedFramebuffer
       lastTime = time;
       }
 
-    int numrender = super.render(time,mCurrFBO);
+    int numrender = super.render(time,mCurRenderedFBO);
 
     GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
 
@@ -116,7 +116,7 @@ public class DistortedScreen extends DistortedFramebuffer
     // make it equal to 3.
     // This of course introduces a delay and uses more memory, but it does not appear to have any effect
     // on speed. Maybe a slight positive effect if any!
-    setAsInput(mLastFBO,0);
+    setAsInput(mToBeBlittedFBO,0);
 
     GLES31.glColorMask(true,true,true,true);
     GLES31.glDepthMask(false);
@@ -131,6 +131,16 @@ public class DistortedScreen extends DistortedFramebuffer
       fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time, 0);
       }
 
+    if( ++mCurRenderedFBO>=Distorted.FBO_QUEUE_SIZE )
+      {
+      mCurRenderedFBO = 0;
+      if (mFirstCircle) mFirstCircle = false;
+      }
+    if( !mFirstCircle && ++mToBeBlittedFBO>=Distorted.FBO_QUEUE_SIZE )
+      {
+      mToBeBlittedFBO=0;
+      }
+
     return numrender+1;
     }
 
@@ -169,4 +179,4 @@ public class DistortedScreen extends DistortedFramebuffer
       durations[NUM_FRAMES] = NUM_FRAMES * 16;              // close to 1000/16 ~ 60
       }
     }
-  }
\ No newline at end of file
+  }
