commit acb4409944f5c55f419dba110fc57e502cb87df1
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Jul 4 23:30:15 2018 +0100

    Make the OIT SSBO size independent of screen size.

diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 7783595..02fb9f3 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -85,9 +85,9 @@ public class DistortedEffects
     }
 
   ///////////////////////////////////////////////////////////////
-  // this has to be at least as big as the number of pixels in
-  // the screen, lest the oitClear() pass overwrite memory.
-  private static int mBufferSize=(0x1<<23);  // 8 million entries
+  // meaning: allocate 1.0 screenful of places for transparent
+  // fragments in the SSBO backing up the OIT render method.
+  private static float mBufferSize=1.0f;
 
   /// OIT CLEAR PROGRAM ///
   private static DistortedProgram mOITClearProgram;
@@ -311,24 +311,6 @@ public class DistortedEffects
     mOITBuildSizeH         = GLES31.glGetUniformLocation( oitBuildProgramH, "u_Size");
     mOITBuildNumRecordsH   = GLES31.glGetUniformLocation( oitBuildProgramH, "u_numRecords");
 
-    if( mLinkedListSSBO[0]<0 )
-      {
-      GLES31.glGenBuffers(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);
-      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, null, GLES31.GL_DYNAMIC_DRAW);
-      GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);
-      }
-
     // OIT COLLAPSE PROGRAM ///////////////////////////
     final InputStream oitCollapseVertStream = resources.openRawResource(R.raw.oit_vertex_shader);
     final InputStream oitCollapseFragStream = resources.openRawResource(R.raw.oit_collapse_fragment_shader);
@@ -472,7 +454,7 @@ public class DistortedEffects
     mMainOITProgram.useProgram();
     GLES31.glUniform1i(mMainOITTextureH, 0);
     GLES31.glUniform2ui(mMainOITSizeH, surface.mWidth, surface.mHeight);
-    GLES31.glUniform1ui(mMainOITNumRecordsH, (mBufferSize-surface.mWidth*surface.mHeight)/3 );  // see the fragment shader
+    GLES31.glUniform1ui(mMainOITNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
 
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.mAttVBO[0]);
     GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
@@ -557,6 +539,15 @@ public class DistortedEffects
 
   static void zeroOutAtomic()
     {
+    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, null, GLES31.GL_DYNAMIC_DRAW);
+      GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);
+      }
+
     GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );
 
     ByteBuffer atomicBuf = (ByteBuffer)GLES31.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
@@ -584,6 +575,17 @@ public class DistortedEffects
 
   static void oitClear(DistortedOutputSurface surface)
     {
+    if( mLinkedListSSBO[0]<0 )
+      {
+      int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
+
+      GLES31.glGenBuffers(1,mLinkedListSSBO,0);
+      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
+      GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);
+      GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
+      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
+      }
+
     mOITClearProgram.useProgram();
 
     GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
@@ -606,7 +608,7 @@ public class DistortedEffects
     GLES31.glUniform1i(mOITBuildDepthTextureH, 1);
     GLES31.glUniform2f(mOITBuildTexCorrH, corrW, corrH );
     GLES31.glUniform2ui(mOITBuildSizeH, surface.mWidth, surface.mHeight);
-    GLES31.glUniform1ui(mOITBuildNumRecordsH, (mBufferSize-surface.mWidth*surface.mHeight)/3 );  // see the fragment shader
+    GLES31.glUniform1ui(mOITBuildNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
     GLES31.glUniform1f(mOITBuildDepthH , 1.0f-surface.mNear);
     GLES31.glVertexAttribPointer(mOITBuildProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
     GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
