commit f482efa3598294cd88fdac2d3b186c3089821f0c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 24 19:25:31 2020 +0100

    Do not crash if we failed to compile some programs.

diff --git a/src/main/java/org/distorted/library/main/DistortedLibrary.java b/src/main/java/org/distorted/library/main/DistortedLibrary.java
index 8bd1f84..b5f134e 100644
--- a/src/main/java/org/distorted/library/main/DistortedLibrary.java
+++ b/src/main/java/org/distorted/library/main/DistortedLibrary.java
@@ -460,52 +460,61 @@ public class DistortedLibrary
 
   static void drawPriv(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime)
     {
-    EffectQueue[] queues = effects.getQueues();
+    if( mMainOITProgram!=null )
+      {
+      EffectQueue[] queues = effects.getQueues();
 
-    EffectQueue.compute(queues, currTime);
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      EffectQueue.compute(queues, currTime);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
 
-    DistortedLibrary.mMainProgram.useProgram();
-    GLES30.glUniform1i(DistortedLibrary.mMainTextureH, 0);
-    mesh.bindVertexAttribs(DistortedLibrary.mMainProgram);
+      mMainProgram.useProgram();
+      GLES30.glUniform1i(DistortedLibrary.mMainTextureH, 0);
+      mesh.bindVertexAttribs(DistortedLibrary.mMainProgram);
 
-    float inflate     = mesh.getInflate();
-    float distance    = surface.mDistance;
-    float mipmap      = surface.mMipmap;
-    float[] projection= surface.mProjectionMatrix;
+      float inflate     = mesh.getInflate();
+      float distance    = surface.mDistance;
+      float mipmap      = surface.mMipmap;
+      float[] projection= surface.mProjectionMatrix;
 
-    EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 0 );
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
+      EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 0 );
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
 
-    if( mesh.getShowNormals() ) displayNormals(queues,mesh);
+      if( mesh.getShowNormals() ) displayNormals(queues,mesh);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static void blitPriv(InternalOutputSurface surface)
     {
-    mBlitProgram.useProgram();
+    if( mBlitProgram!=null )
+      {
+      mBlitProgram.useProgram();
 
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
-    GLES30.glUniform1i(mBlitTextureH, 0);
-    GLES30.glUniform1f( mBlitDepthH , 1.0f-surface.mNear);
-    GLES30.glVertexAttribPointer(mBlitProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      GLES30.glUniform1i(mBlitTextureH, 0);
+      GLES30.glUniform1f( mBlitDepthH , 1.0f-surface.mNear);
+      GLES30.glVertexAttribPointer(mBlitProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static void blitDepthPriv(InternalOutputSurface surface, float corrW, float corrH)
     {
-    mBlitDepthProgram.useProgram();
+    if( mBlitDepthProgram!=null )
+      {
+      mBlitDepthProgram.useProgram();
 
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
-    GLES30.glUniform1i(mBlitDepthTextureH, 0);
-    GLES30.glUniform1i(mBlitDepthDepthTextureH, 1);
-    GLES30.glUniform2f(mBlitDepthTexCorrH, corrW, corrH );
-    GLES30.glUniform1f( mBlitDepthDepthH , 1.0f-surface.mNear);
-    GLES30.glVertexAttribPointer(mBlitDepthProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      GLES30.glUniform1i(mBlitDepthTextureH, 0);
+      GLES30.glUniform1i(mBlitDepthDepthTextureH, 1);
+      GLES30.glUniform2f(mBlitDepthTexCorrH, corrW, corrH );
+      GLES30.glUniform1f( mBlitDepthDepthH , 1.0f-surface.mNear);
+      GLES30.glVertexAttribPointer(mBlitDepthProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -591,42 +600,45 @@ public class DistortedLibrary
 
   static void oitClear(InternalOutputSurface surface, int counter)
     {
-    if( mLinkedListSSBO[0]<0 )
+    if( mOITClearProgram!=null )
       {
-      GLES30.glGenBuffers(1,mLinkedListSSBO,0);
-
-      int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
-      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
-      GLES30.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES30.GL_DYNAMIC_READ|GLES30.GL_DYNAMIC_DRAW);
-      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
+      if( mLinkedListSSBO[0]<0 )
+        {
+        GLES30.glGenBuffers(1,mLinkedListSSBO,0);
 
-      GLES30.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
-      }
+        int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
+        GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
+        GLES30.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES30.GL_DYNAMIC_READ|GLES30.GL_DYNAMIC_DRAW);
+        GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
 
-    // See if we have overflown the SSBO in one of the previous frames.
-    // If yes, assume we need to make the SSBO larger.
-    float overflow = counter/(mBufferSize*surface.mWidth*surface.mHeight);
+        GLES30.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
+        }
 
-    if( overflow>1.0f )
-      {
-      //android.util.Log.e("effects", "previous frame rendered "+counter+
-      //                   " fragments, but there was only "+(mBufferSize*surface.mWidth*surface.mHeight)+" space");
+      // See if we have overflown the SSBO in one of the previous frames.
+      // If yes, assume we need to make the SSBO larger.
+      float overflow = counter/(mBufferSize*surface.mWidth*surface.mHeight);
 
-      mBufferSize *= (int)(overflow+1.0f);
-      int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
-      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
-      GLES30.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES30.GL_DYNAMIC_READ|GLES30.GL_DYNAMIC_DRAW);
-      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
-      }
+      if( overflow>1.0f )
+        {
+        //android.util.Log.e("effects", "previous frame rendered "+counter+
+        //                   " fragments, but there was only "+(mBufferSize*surface.mWidth*surface.mHeight)+" space");
+
+        mBufferSize *= (int)(overflow+1.0f);
+        int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
+        GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
+        GLES30.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES30.GL_DYNAMIC_READ|GLES30.GL_DYNAMIC_DRAW);
+        GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
+        }
 
-    mOITClearProgram.useProgram();
+      mOITClearProgram.useProgram();
 
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
-    GLES30.glUniform2f(mOITClearTexCorrH, 1.0f, 1.0f );   // corrections do not really matter here - only present because of common vertex shader.
-    GLES30.glUniform1f( mOITClearDepthH , 1.0f);          // likewise depth
-    GLES30.glUniform2ui(mOITClearSizeH, surface.mWidth, surface.mHeight);
-    GLES30.glVertexAttribPointer(mOITClearProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      GLES30.glUniform2f(mOITClearTexCorrH, 1.0f, 1.0f );   // corrections do not really matter here - only present because of common vertex shader.
+      GLES30.glUniform1f( mOITClearDepthH , 1.0f);          // likewise depth
+      GLES30.glUniform2ui(mOITClearSizeH, surface.mWidth, surface.mHeight);
+      GLES30.glVertexAttribPointer(mOITClearProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -634,17 +646,20 @@ public class DistortedLibrary
 
   static void oitBuild(InternalOutputSurface surface, float corrW, float corrH)
     {
-    mOITBuildProgram.useProgram();
+    if( mOITBuildProgram!=null )
+      {
+      mOITBuildProgram.useProgram();
 
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
-    GLES30.glUniform1i(mOITBuildTextureH, 0);
-    GLES30.glUniform1i(mOITBuildDepthTextureH, 1);
-    GLES30.glUniform2f(mOITBuildTexCorrH, corrW, corrH );
-    GLES30.glUniform2ui(mOITBuildSizeH, surface.mWidth, surface.mHeight);
-    GLES30.glUniform1ui(mOITBuildNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
-    GLES30.glUniform1f(mOITBuildDepthH , 1.0f-surface.mNear);
-    GLES30.glVertexAttribPointer(mOITBuildProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      GLES30.glUniform1i(mOITBuildTextureH, 0);
+      GLES30.glUniform1i(mOITBuildDepthTextureH, 1);
+      GLES30.glUniform2f(mOITBuildTexCorrH, corrW, corrH );
+      GLES30.glUniform2ui(mOITBuildSizeH, surface.mWidth, surface.mHeight);
+      GLES30.glUniform1ui(mOITBuildNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
+      GLES30.glUniform1f(mOITBuildDepthH , 1.0f-surface.mNear);
+      GLES30.glVertexAttribPointer(mOITBuildProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -652,15 +667,18 @@ public class DistortedLibrary
 
   static void oitCollapse(InternalOutputSurface surface, float corrW, float corrH)
     {
-    mOITCollapseProgram.useProgram();
+    if( mOITCollapseProgram!=null )
+      {
+      mOITCollapseProgram.useProgram();
 
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
-    GLES30.glUniform1i(mOITCollapseDepthTextureH, 1);
-    GLES30.glUniform2f(mOITCollapseTexCorrH, corrW, corrH );
-    GLES30.glUniform2ui(mOITCollapseSizeH, surface.mWidth, surface.mHeight);
-    GLES30.glUniform1f( mOITCollapseDepthH , 1.0f-surface.mNear);
-    GLES30.glVertexAttribPointer(mOITCollapseProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      GLES30.glUniform1i(mOITCollapseDepthTextureH, 1);
+      GLES30.glUniform2f(mOITCollapseTexCorrH, corrW, corrH );
+      GLES30.glUniform2ui(mOITCollapseSizeH, surface.mWidth, surface.mHeight);
+      GLES30.glUniform1f( mOITCollapseDepthH , 1.0f-surface.mNear);
+      GLES30.glVertexAttribPointer(mOITCollapseProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -668,14 +686,17 @@ public class DistortedLibrary
 
   static void oitRender(InternalOutputSurface surface, float corrW, float corrH)
     {
-    mOITRenderProgram.useProgram();
+    if( mOITRenderProgram!=null )
+      {
+      mOITRenderProgram.useProgram();
 
-    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
-    GLES30.glUniform2f(mOITRenderTexCorrH, corrW, corrH );
-    GLES30.glUniform2ui(mOITRenderSizeH, surface.mWidth, surface.mHeight);
-    GLES30.glUniform1f( mOITRenderDepthH , 1.0f-surface.mNear);
-    GLES30.glVertexAttribPointer(mOITRenderProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
+      GLES30.glUniform2f(mOITRenderTexCorrH, corrW, corrH );
+      GLES30.glUniform2ui(mOITRenderSizeH, surface.mWidth, surface.mHeight);
+      GLES30.glUniform1f( mOITRenderDepthH , 1.0f-surface.mNear);
+      GLES30.glVertexAttribPointer(mOITRenderProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
