commit 4b9fe2e9f05c2d4023e8b9cd00530f9ea085097b
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Jun 27 14:32:22 2017 +0100

    Introduce concepts of 'in' and 'out' postprocessing qualities.

diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffect.java b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
index 11e7370..3197870 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffect.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
@@ -139,7 +139,7 @@ public abstract class PostprocessEffect extends Effect implements DistortedMaste
  *
  * @y.exclude
  */
-  public abstract int apply(float[] uniforms, int index, DistortedFramebuffer[] buffers);
+  public abstract int apply(float[] uniforms, int index, int quality, DistortedFramebuffer[] buffers);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java b/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
index 97533dc..7580e4c 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
@@ -138,7 +138,7 @@ public class PostprocessEffectBlur extends PostprocessEffect
  *
  * @y.exclude
  */
-  public int apply(float[] uniforms, int index, DistortedFramebuffer[] buffers)
+  public int apply(float[] uniforms, int index, int quality, DistortedFramebuffer[] buffers)
     {
     if( mProgram1 ==null)
       {
@@ -146,7 +146,7 @@ public class PostprocessEffectBlur extends PostprocessEffect
       mProgram2 = mPrograms.get(mIndex2);
       }
 
-    DistortedFramebuffer buffer = buffers[mQualityLevel];
+    DistortedFramebuffer buffer = buffers[quality];
 
     buffer.setAsOutput();
 
@@ -198,7 +198,7 @@ public class PostprocessEffectBlur extends PostprocessEffect
     GLES30.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
 
-    return 2;
+    return quality;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java b/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
index 782fd30..8ddf4a3 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
@@ -141,7 +141,7 @@ public class PostprocessEffectGlow extends PostprocessEffect
  *
  * @y.exclude
  */
-  public int apply(float[] uniforms, int index, DistortedFramebuffer[] buffers)
+  public int apply(float[] uniforms, int index, int quality, DistortedFramebuffer[] buffers)
     {
     if( mProgram1 ==null)
       {
@@ -149,13 +149,16 @@ public class PostprocessEffectGlow extends PostprocessEffect
       mProgram2 = mPrograms.get(mIndex2);
       }
 
-    DistortedFramebuffer buffer = buffers[mQualityLevel];
+    int outQuality = (quality<mQualityLevel ? mQualityLevel:quality);
 
-    buffer.setAsOutput();
+    DistortedFramebuffer  inBuffer = buffers[quality];
+    DistortedFramebuffer outBuffer = buffers[outQuality];
 
-    float w1  = buffer.getWidth();
-    float h1  = buffer.getHeight();
-    float near= 1.0f - buffer.getNear();
+    outBuffer.setAsOutput();
+
+    float w1  = outBuffer.getWidth();
+    float h1  = outBuffer.getHeight();
+    float near= 1.0f - outBuffer.getNear();
 
     int radius = (int)(uniforms[index]*mQualityScale);
     if( radius>=MAX_HALO ) radius = MAX_HALO-1;
@@ -165,12 +168,12 @@ public class PostprocessEffectGlow extends PostprocessEffect
     radius = (radius+1)/2;
     GLES30.glViewport(0, 0, (int)w1, (int)h1);
 
-    // horizontal blur
+    // horizontal glow
     for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h1;
 
     mProgram1.useProgram();
-    buffer.bindForOutput(1);
-    buffer.setAsInput(0);
+    outBuffer.bindForOutput(1);
+    inBuffer.setAsInput(0);
 
     GLES30.glUniform1f ( mProgram1.mUniform[0] , near);
     GLES30.glUniform1i ( mProgram1.mUniform[1] , 0 );
@@ -181,12 +184,12 @@ public class PostprocessEffectGlow extends PostprocessEffect
     GLES30.glVertexAttribPointer(mProgram1.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
 
-    // vertical blur
+    // vertical glow
     for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w1;
 
     mProgram2.useProgram();
-    buffer.bindForOutput(0);
-    buffer.setAsInput(1);
+    outBuffer.bindForOutput(0);
+    outBuffer.setAsInput(1);
 
     GLES30.glColorMask(true,true,true,true);
     GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f);
@@ -201,7 +204,7 @@ public class PostprocessEffectGlow extends PostprocessEffect
     GLES30.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
 
-    return 2;
+    return outQuality;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 0a60dc6..9d450d1 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -231,9 +231,16 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  int postprocess(DistortedOutputSurface surface)
+  int postprocess(DistortedOutputSurface surface,int quality)
     {
-    return mP.postprocess(surface);
+    return mP.postprocess(surface,quality);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumRenders()
+    {
+    return mP.getNumRenders();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index bb2817d..f471ee7 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -250,7 +250,7 @@ private String sLast="", sCurr="";
 
   int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children)
     {
-    int quality=0, numRenders = 0, bucketChange = 0;
+    int inQuality=0, outQuality, numRenders = 0, bucketChange = 0;
     DistortedNode child1, child2;
     DistortedEffects lastEffects=null, currEffects;
     long lastBucket=0, currBucket;
@@ -277,29 +277,31 @@ sCurr += (" "+currBucket);
             for(int j=bucketChange; j<i; j++)
               {
               child2 = children.get(j);
-              numRenders += child2.markStencilAndDepth(time,mBuffer[quality],lastEffects);
+              numRenders += child2.markStencilAndDepth(time,mBuffer[inQuality],lastEffects);
               }
 
-            numRenders += lastEffects.postprocess(this);
-            numRenders += blitWithDepth(time, mBuffer[quality]);
+            outQuality  = lastEffects.postprocess(this,inQuality);
+            numRenders += lastEffects.getNumRenders();
+            numRenders += blitWithDepth(time, mBuffer[outQuality]);
             }
 
-          quality = currEffects.getQuality();
+          inQuality = currEffects.getQuality();
           bucketChange = i;
           }
 
-        numRenders += child1.draw(time,mBuffer[quality]);
+        numRenders += child1.draw(time,mBuffer[inQuality]);
 
         if( i==numChildren-1 )
           {
           for(int j=bucketChange; j<numChildren; j++)
             {
             child2 = children.get(j);
-            numRenders += child2.markStencilAndDepth(time,mBuffer[quality],currEffects);
+            numRenders += child2.markStencilAndDepth(time,mBuffer[inQuality],currEffects);
             }
 
-          numRenders += currEffects.postprocess(this);
-          numRenders += blitWithDepth(time,mBuffer[quality]);
+          outQuality  = currEffects.postprocess(this,inQuality);
+          numRenders += currEffects.getNumRenders();
+          numRenders += blitWithDepth(time, mBuffer[outQuality]);
           }
         }
 
diff --git a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
index e2f336f..3d97485 100644
--- a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
@@ -91,19 +91,27 @@ class EffectQueuePostprocess extends EffectQueue
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// TODO: for now, we assume each postprocessing effect issues 2 drawing calls (this is for statistical
+// purposes only anyway)
 
-  int postprocess(DistortedOutputSurface surface)
+  int getNumRenders()
     {
-    int numRenders = 0;
+    return 2*mNumEffects;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
+  int postprocess(DistortedOutputSurface surface, int quality)
+    {
     DistortedRenderState.useStencilMark();
 
     for(int i=0; i<mNumEffects; i++)
       {
-      numRenders += ((PostprocessEffect)mEffects[i]).apply(mUniforms,NUM_UNIFORMS*i, surface.mBuffer);
+      quality = ((PostprocessEffect)mEffects[i]).apply(mUniforms,NUM_UNIFORMS*i, quality, surface.mBuffer);
       }
+
     DistortedRenderState.unuseStencilMark();
 
-    return numRenders;
+    return quality;
     }
   }
