commit 2faad6664c3d690f90350c96838eeb64ccfdf62e
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Apr 2 23:15:33 2018 +0100

    SSBO: now we have a more-or-less correct running average of the count of transparent fragments over the last few frames.

diff --git a/src/main/java/org/distorted/library/main/DistortedObject.java b/src/main/java/org/distorted/library/main/DistortedObject.java
index a9bc8b4..cf1d82b 100644
--- a/src/main/java/org/distorted/library/main/DistortedObject.java
+++ b/src/main/java/org/distorted/library/main/DistortedObject.java
@@ -66,7 +66,7 @@ abstract class DistortedObject
   private static long mNextSystemID = 0;
 
   private long mID;
-  private int mType;
+  protected int mType;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index 73c7617..77507c8 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -115,6 +115,12 @@ public static final int DEBUG_FPS = 1;
   private int mSurfaceID;
   private int mLastIndex;
   private int[] mLastValue = new int[FRAME_DELAY];
+  private int mLastDiff = -1;
+
+  private static final int RUNNING_AVERAGE = 10;
+  private int[] mRunningAvg = new int[RUNNING_AVERAGE];
+  private int mAvgIndex;
+  private int mAvgSum;
   // end section
   ////////////////////////////////////////////////////////////////////////////////
 
@@ -218,9 +224,12 @@ public static final int DEBUG_FPS = 1;
 
   void recreate()
     {
+    mSSBO[0]  = -1;
+    mLastDiff = -1;
+
     for(int i = 0; i< FRAME_DELAY; i++) mLastValue[i] = 0;
-    mSSBO[0]= -1;
     mSurfaceCounter.releaseAll();
+
     recreateSurface();
     }
 
@@ -516,17 +525,29 @@ public static final int DEBUG_FPS = 1;
       GLES31.glClear(mClear);
       DistortedRenderState.colorDepthStencilRestore();
 
-      if( ++mLastIndex >= FRAME_DELAY ) mLastIndex=0;
-
-      int index = (mLastIndex==0 ? FRAME_DELAY-1 : mLastIndex-1);
-      int value =  mIntBuffer.get(FRAME_DELAY *mSurfaceID+index);
-
-      if( value!=mLastValue[index] )
+      if( mSSBO[0]>=0 )
         {
         // yes, this DOES keep on working when 'value' overflows into negative territory.
-        android.util.Log.d("surface", "surface id: "+mSurfaceID+" last frame: "+(value-mLastValue[index]) );
-        mLastValue[index] = value;
+        int value = mIntBuffer.get(FRAME_DELAY*mSurfaceID+mLastIndex);
+
+        if( value-mLastValue[mLastIndex]!=mLastDiff )
+          {
+          android.util.Log.d("surface", "id " + mSurfaceID +
+              (mType == TYPE_USER ? " USER" : (mType == TYPE_SYST ? " SYST" : " TREE")) +
+              " (" + mWidth + "x" + mHeight + ") last frame: " + (value - mLastValue[mLastIndex])
+              + " avg: " + (mAvgSum/RUNNING_AVERAGE)
+          );
+          }
+
+        mLastDiff = value-mLastValue[mLastIndex];
+        mLastValue[mLastIndex] = value;
+
+        mAvgSum += (mLastDiff-mRunningAvg[mAvgIndex]);
+        mRunningAvg[mAvgIndex] = mLastDiff;
+        if( ++mAvgIndex>=RUNNING_AVERAGE ) mAvgIndex =0;
         }
+
+      if( ++mLastIndex >= FRAME_DELAY ) mLastIndex=0;
       }
     }
 
diff --git a/src/main/res/raw/main_fragment_shader.glsl b/src/main/res/raw/main_fragment_shader.glsl
index 8128574..8052bd4 100644
--- a/src/main/res/raw/main_fragment_shader.glsl
+++ b/src/main/res/raw/main_fragment_shader.glsl
@@ -78,7 +78,7 @@ void main()
     }
 #endif
 
-  if( color.a < 1.0 && color.a > 0.0 ) ssbocount[u_currentIndex]++;
+  if( color.a < 1.0 && color.a > 0.0 ) atomicAdd(ssbocount[u_currentIndex],1);
 
   FRAG_COLOR = vec4(color.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, color.a);
   }
\ No newline at end of file
