commit 86c352e019e4d87a16ef594f9ee2c9290be0e949
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jul 2 16:02:09 2018 +0100

    Some progress with not-postprocessed OIT.

diff --git a/src/main/java/org/distorted/library/main/Distorted.java b/src/main/java/org/distorted/library/main/Distorted.java
index e469b24..b4cfdef 100644
--- a/src/main/java/org/distorted/library/main/Distorted.java
+++ b/src/main/java/org/distorted/library/main/Distorted.java
@@ -88,6 +88,10 @@ 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 = 4;
+  /**
+   * Number of Main program variants (ATM 2: main and main OIT)
+   */
+  public static final int MAIN_VARIANTS = 2;
 
   private static boolean mInitialized=false;
 
diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 8f3e95a..7783595 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -169,9 +169,9 @@ public class DistortedEffects
       }
 
     int mainProgramH = mMainProgram.getProgramHandle();
-    EffectQueueFragment.getUniforms(mainProgramH);
-    EffectQueueVertex.getUniforms(mainProgramH);
-    EffectQueueMatrix.getUniforms(mainProgramH);
+    EffectQueueFragment.getUniforms(mainProgramH,0);
+    EffectQueueVertex.getUniforms(mainProgramH,0);
+    EffectQueueMatrix.getUniforms(mainProgramH,0);
     mMainTextureH= GLES31.glGetUniformLocation( mainProgramH, "u_Texture");
 
     // BLIT PROGRAM ////////////////////////////////////
@@ -254,7 +254,7 @@ public class DistortedEffects
     try
       {
       mMainOITProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader,
-          enabledEffectV, enabledEffectF, Distorted.GLSL, null);
+                                             enabledEffectV, enabledEffectF, Distorted.GLSL, null);
       }
     catch(Exception e)
       {
@@ -263,9 +263,9 @@ public class DistortedEffects
       }
 
     int mainOITProgramH = mMainOITProgram.getProgramHandle();
-    EffectQueueFragment.getUniformsOIT(mainOITProgramH);
-    EffectQueueVertex.getUniformsOIT(mainOITProgramH);
-    EffectQueueMatrix.getUniformsOIT(mainOITProgramH);
+    EffectQueueFragment.getUniforms(mainOITProgramH,1);
+    EffectQueueVertex.getUniforms(mainOITProgramH,1);
+    EffectQueueMatrix.getUniforms(mainOITProgramH,1);
     mMainOITTextureH    = GLES31.glGetUniformLocation( mainOITProgramH, "u_Texture");
     mMainOITSizeH       = GLES31.glGetUniformLocation( mainOITProgramH, "u_Size");
     mMainOITNumRecordsH = GLES31.glGetUniformLocation( mainOITProgramH, "u_numRecords");
@@ -480,9 +480,9 @@ public class DistortedEffects
     GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
 
-    mM.sendOIT(surface,halfW,halfH,halfZ,marginInPixels);
-    mV.sendOIT();
-    mF.sendOIT();
+    mM.send(surface,halfW,halfH,halfZ,marginInPixels,1);
+    mV.send(1);
+    mF.send(1);
 
     GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.numVertices);
 
@@ -511,9 +511,9 @@ public class DistortedEffects
     GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
 
-    mM.send(surface,halfW,halfH,halfZ,marginInPixels);
-    mV.send();
-    mF.send();
+    mM.send(surface,halfW,halfH,halfZ,marginInPixels,0);
+    mV.send(0);
+    mF.send(0);
 
     GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.numVertices);
 
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index fd05bab..fd70e3b 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -388,6 +388,19 @@ public abstract class DistortedOutputSurface extends DistortedSurface implements
 // Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing
 // to a whole buffer (lastQueue.postprocess) and merge it (this.oitBuild).
 
+/*
+int renderChildren1(long time, int numChildren, ArrayList<DistortedNode> children, int fbo, boolean oit)
+  {
+  oitClear(this);
+  setAsOutputFBO(time,fbo);
+  mChildren.get(0).drawOIT(time, this);
+  GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
+  oitRender(time, fbo);
+
+  return 0;
+  }
+*/
+
   int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo, boolean oit)
     {
     int quality=0, internalQuality = 0, numRenders = 0, bucketChange = 0;
diff --git a/src/main/java/org/distorted/library/main/EffectQueueFragment.java b/src/main/java/org/distorted/library/main/EffectQueueFragment.java
index ca0d7fa..20fb5d8 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueFragment.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueFragment.java
@@ -32,13 +32,9 @@ class EffectQueueFragment extends EffectQueue
   private static final int NUM_UNIFORMS = FragmentEffect.NUM_UNIFORMS;
   private static final int INDEX = EffectType.FRAGMENT.ordinal();
 
-  private static int mNumEffectsH;
-  private static int mNameH;
-  private static int mUniformsH;
-
-  private static int mNumEffectsOITH;
-  private static int mNameOITH;
-  private static int mUniformsOITH;
+  private static int[] mNumEffectsH = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mNameH       = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mUniformsH   = new int[Distorted.MAIN_VARIANTS];
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
@@ -49,20 +45,11 @@ class EffectQueueFragment extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void getUniforms(int mProgramH)
-    {
-    mNumEffectsH= GLES31.glGetUniformLocation( mProgramH, "fNumEffects");
-    mNameH      = GLES31.glGetUniformLocation( mProgramH, "fName");
-    mUniformsH  = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static void getUniformsOIT(int mProgramH)
+  static void getUniforms(int mProgramH, int variant)
     {
-    mNumEffectsOITH= GLES31.glGetUniformLocation( mProgramH, "fNumEffects");
-    mNameOITH      = GLES31.glGetUniformLocation( mProgramH, "fName");
-    mUniformsOITH  = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
+    mNumEffectsH[variant]= GLES31.glGetUniformLocation( mProgramH, "fNumEffects");
+    mNameH[variant]      = GLES31.glGetUniformLocation( mProgramH, "fName");
+    mUniformsH[variant]  = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -99,27 +86,14 @@ class EffectQueueFragment extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
   
-  void send()
+  void send(int variant)
     {
-    GLES31.glUniform1i( mNumEffectsH, mNumEffects);
+    GLES31.glUniform1i( mNumEffectsH[variant], mNumEffects);
 
     if( mNumEffects>0 )
       {
-      GLES31.glUniform1iv( mNameH    ,                 mNumEffects, mName    ,0);
-      GLES31.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
+      GLES31.glUniform1iv( mNameH[variant]    ,                 mNumEffects, mName    ,0);
+      GLES31.glUniform4fv( mUniformsH[variant],(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
       }  
     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void sendOIT()
-    {
-    GLES31.glUniform1i( mNumEffectsOITH, mNumEffects);
-
-    if( mNumEffects>0 )
-      {
-      GLES31.glUniform1iv( mNameOITH    ,                 mNumEffects, mName    ,0);
-      GLES31.glUniform4fv( mUniformsOITH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
-      }
-    }
   }
diff --git a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
index a4768e8..e48dfb6 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
@@ -43,13 +43,9 @@ class EffectQueueMatrix extends EffectQueue
   private static float mMiny;
   private static float mMaxy;
 
-  private static int mObjDH;         // This is a handle to half a Object dimensions
-  private static int mMVPMatrixH;    // the transformation matrix
-  private static int mMVMatrixH;     // the modelview matrix.
-
-  private static int mObjDOITH;      //
-  private static int mMVPMatrixOITH; // Same like above, but in main OIT program.
-  private static int mMVMatrixOITH;  //
+  private static int[] mObjDH      = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mMVPMatrixH = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mMVMatrixH  = new int[Distorted.MAIN_VARIANTS];
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
@@ -105,20 +101,11 @@ class EffectQueueMatrix extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void getUniforms(int mProgramH)
-    {
-    mObjDH     = GLES31.glGetUniformLocation(mProgramH, "u_objD");
-    mMVPMatrixH= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
-    mMVMatrixH = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static void getUniformsOIT(int mProgramH)
+  static void getUniforms(int mProgramH, int variant)
     {
-    mObjDOITH     = GLES31.glGetUniformLocation(mProgramH, "u_objD");
-    mMVPMatrixOITH= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
-    mMVMatrixOITH = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
+    mObjDH[variant]     = GLES31.glGetUniformLocation(mProgramH, "u_objD");
+    mMVPMatrixH[variant]= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
+    mMVMatrixH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -158,27 +145,7 @@ class EffectQueueMatrix extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
-    {
-    Matrix.setIdentityM(mViewMatrix, 0);
-    Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
-    float mipmap = projection.mMipmap;
-    if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap);
-
-    for(int i=0; i<mNumEffects; i++) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i);
-
-    Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ);
-    if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
-    Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
-
-    GLES31.glUniform3f( mObjDH , halfX, halfY, halfZ);
-    GLES31.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
-    GLES31.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void sendOIT(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
+  void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels, int variant)
     {
     Matrix.setIdentityM(mViewMatrix, 0);
     Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
@@ -191,8 +158,8 @@ class EffectQueueMatrix extends EffectQueue
     if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
     Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
 
-    GLES31.glUniform3f( mObjDOITH , halfX, halfY, halfZ);
-    GLES31.glUniformMatrix4fv(mMVMatrixOITH , 1, false, mViewMatrix, 0);
-    GLES31.glUniformMatrix4fv(mMVPMatrixOITH, 1, false, mMVPMatrix , 0);
+    GLES31.glUniform3f( mObjDH[variant] , halfX, halfY, halfZ);
+    GLES31.glUniformMatrix4fv(mMVMatrixH[variant] , 1, false, mViewMatrix, 0);
+    GLES31.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0);
     }
   }
diff --git a/src/main/java/org/distorted/library/main/EffectQueueVertex.java b/src/main/java/org/distorted/library/main/EffectQueueVertex.java
index 1b10c12..643ba59 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueVertex.java
@@ -32,13 +32,9 @@ class EffectQueueVertex extends EffectQueue
   private static final int NUM_UNIFORMS = VertexEffect.NUM_UNIFORMS;
   private static final int INDEX = EffectType.VERTEX.ordinal();
 
-  private static int mNumEffectsH;
-  private static int mNameH;
-  private static int mUniformsH;
-
-  private static int mNumEffectsOITH;
-  private static int mNameOITH;
-  private static int mUniformsOITH;
+  private static int[] mNumEffectsH = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mNameH       = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mUniformsH   = new int[Distorted.MAIN_VARIANTS];
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
@@ -49,20 +45,11 @@ class EffectQueueVertex extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void getUniforms(int mProgramH)
-    {
-    mNumEffectsH= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
-    mNameH      = GLES31.glGetUniformLocation( mProgramH, "vName");
-    mUniformsH  = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static void getUniformsOIT(int mProgramH)
+  static void getUniforms(int mProgramH, int variant)
     {
-    mNumEffectsOITH= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
-    mNameOITH      = GLES31.glGetUniformLocation( mProgramH, "vName");
-    mUniformsOITH  = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
+    mNumEffectsH[variant]= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
+    mNameH[variant]      = GLES31.glGetUniformLocation( mProgramH, "vName");
+    mUniformsH[variant]  = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -100,27 +87,14 @@ class EffectQueueVertex extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void send()
+  void send(int variant)
     {
-    GLES31.glUniform1i( mNumEffectsH, mNumEffects);
+    GLES31.glUniform1i( mNumEffectsH[variant], mNumEffects);
       
     if( mNumEffects>0 )
       {
-      GLES31.glUniform1iv( mNameH    ,                 mNumEffects, mName    ,0);
-      GLES31.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void sendOIT()
-    {
-    GLES31.glUniform1i( mNumEffectsOITH, mNumEffects);
-
-    if( mNumEffects>0 )
-      {
-      GLES31.glUniform1iv( mNameOITH    ,                 mNumEffects, mName    ,0);
-      GLES31.glUniform4fv( mUniformsOITH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
+      GLES31.glUniform1iv( mNameH[variant]    ,                 mNumEffects, mName    ,0);
+      GLES31.glUniform4fv( mUniformsH[variant],(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
       }
     }
   }
