commit c731c612d96fa861947e9288dfab25c89363bfee
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue May 1 22:07:53 2018 +0100

    Fix the 'OIT' artefacts.

diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 32d7e5f..ed71714 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -85,8 +85,8 @@ public class DistortedEffects
 
   private static IntBuffer mIntBuffer;
 
-private static ByteBuffer mBuf;
-private static IntBuffer mIntBuf;
+private static ByteBuffer mBuf, mAtomicBuf;
+private static IntBuffer mIntBuf, mAtomicIntBuf;
 
   /// BLIT DEPTH RENDER PROGRAM ///
   private static DistortedProgram mBlitDepthRenderProgram;
@@ -192,18 +192,16 @@ private static IntBuffer mIntBuf;
     if( mLinkedListSSBO[0]<0 )
       {
       GLES31.glGenBuffers(1,mLinkedListSSBO,0);
+      GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
       GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
       GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);
-
-      mBuf = (ByteBuffer)GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, mBufferSize*4, GLES31.GL_MAP_READ_BIT);
-      mIntBuf = mBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
-
-      GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
+      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
       }
 
     if( mAtomicCounter[0]<0 )
       {
       GLES31.glGenBuffers(1,mAtomicCounter,0);
+      GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[0]);
       GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );
       GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, mIntBuffer, GLES31.GL_DYNAMIC_DRAW);
       GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);
@@ -408,53 +406,66 @@ private static IntBuffer mIntBuf;
 
     // reset atomic counter to 0
     GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );
-    GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, mIntBuffer, GLES31.GL_DYNAMIC_DRAW);
+
+    mAtomicBuf = (ByteBuffer)GLES31.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
+                                                      GLES31.GL_MAP_READ_BIT|GLES31.GL_MAP_WRITE_BIT);
+    if( mAtomicBuf!=null )
+      {
+      mAtomicIntBuf = mAtomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
+
+      int counter = mAtomicIntBuf.get(0);
+      mAtomicIntBuf.put(0, 0);
+      //android.util.Log.e("counter", "now = "+counter+" w="+surface.mWidth+" h="+surface.mHeight
+      //                             +" diff="+(counter-surface.mWidth*surface.mHeight));
+      }
+    else
+      {
+      android.util.Log.e("counter", "failed to map buffer");
+      }
+
+    GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER);
     GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-
   private static void analyzeBuffer(int w, int h)
     {
-    int ptr;
-    final int GREEN = 1;
-    final int RED   = 2;
+    int ptr, index;
+    int errors = 0;
 
-    int left1=0, left2=0;
-    int right1=0, right2=0;
-    int overflow = 0;
+    GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
+    mBuf = (ByteBuffer)GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, mBufferSize*4, GLES31.GL_MAP_READ_BIT);
+    mIntBuf = mBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
 
-    for(int row=0; row<h; row++)
-      for(int col=0; col<w; col++)
+    for(int col=0; col<w; col++)
+      for(int row=0; row<h; row++)
         {
-        ptr = mIntBuf.get( col+row*w );
+        index = col+row*w;
+        ptr = mIntBuf.get(index);
 
         if( ptr!=0 )
           {
           if( ptr>0 && ptr<mBufferSize )
             {
             ptr = mIntBuf.get(ptr);
-
-            if ((2*col>w) && ptr != RED)
-              {
-              if (ptr==GREEN) right1++;
-              else            right2++;
-              }
-            if ((2*col<=w) && ptr != GREEN)
+            if( ptr != index )
               {
-              if (ptr==RED) left1++;
-              else          left2++;
+              android.util.Log.d("surface", "col="+col+" row="+row+" val="+ptr+" expected: "+index);
+              errors++;
               }
             }
           else
             {
-            overflow++;
+            android.util.Log.d("surface", "overflow!");
             }
           }
         }
 
-    android.util.Log.e("surface", " left1: "+left1+" left2: "+left2+" right1: "+right1+" right2: "+right2+" overflow: "+overflow);
+    GLES31.glUnmapBuffer(GLES31.GL_SHADER_STORAGE_BUFFER);
+    GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
+
+    if( errors>0 ) android.util.Log.e("surface", "errors: "+errors);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index 73742f6..71d7d30 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -386,9 +386,10 @@ public static final int DEBUG_FPS = 1;
           numRenders += currQueue.postprocess(mBuffer);
           numRenders += blitWithDepth(time, mBuffer[quality]);
           GLES31.glMemoryBarrier(GLES31.GL_ALL_BARRIER_BITS);
-          //GLES31.glFlush();
+          //GLES31.glFinish();
           numRenders += blitWithDepthRender(time,mBuffer[quality]);  // merge the OIT linked list
           clearBuffer(mBuffer[quality]);
+          //GLES31.glFinish();
           }
         }
 
diff --git a/src/main/res/raw/blit_depth_fragment_shader.glsl b/src/main/res/raw/blit_depth_fragment_shader.glsl
index 4ea3289..7654ad6 100644
--- a/src/main/res/raw/blit_depth_fragment_shader.glsl
+++ b/src/main/res/raw/blit_depth_fragment_shader.glsl
@@ -38,10 +38,10 @@ void main()
   {
   uint pixelX = uint(v_TexCoordinate.x * u_Size.x);
   uint pixelY = uint(v_TexCoordinate.y * u_Size.y);
-  uint index = pixelX + pixelY * uint(u_Size.x);
+  uint index  = pixelX + pixelY * uint(u_Size.x);
 
-  uint ptr = atomicCounterIncrement(u_Counter) + uint(u_Size.x*u_Size.y);
-  u_Records[ptr  ] = (v_TexCoordinate.x>0.5?2u:1u);
+  uint ptr = uint(u_Size.x*u_Size.y) + atomicCounterIncrement(u_Counter);
+  u_Records[ptr  ] = index;
   u_Records[index] = ptr;
   discard;
   }
\ No newline at end of file
diff --git a/src/main/res/raw/blit_depth_render_fragment_shader.glsl b/src/main/res/raw/blit_depth_render_fragment_shader.glsl
index 5b9a7ca..bfcb0d0 100644
--- a/src/main/res/raw/blit_depth_render_fragment_shader.glsl
+++ b/src/main/res/raw/blit_depth_render_fragment_shader.glsl
@@ -39,8 +39,9 @@ void main()
   uint index  = pixelX + pixelY * uint(u_Size.x);
 
   uint ptr = u_Records[index];
+  uint color = u_Records[ptr];
+  //u_Records[ptr] = 0u;
 
-       if( u_Records[ptr]==2u ) fragColor = vec4(1.0,0.0,0.0,1.0);
-  else if( u_Records[ptr]==1u ) fragColor = vec4(0.0,1.0,0.0,1.0);
-  else                          fragColor = vec4(0.0,0.0,1.0,1.0);
+  if( color==index ) fragColor = vec4(0.0,1.0,0.0,1.0);
+  else               fragColor = vec4(1.0,0.0,0.0,1.0);
   }
\ No newline at end of file
