Project

General

Profile

« Previous | Next » 

Revision b7074bc6

Added by Leszek Koltunski about 4 years ago

Lower requirements - now only OpenGL ES 3.0 is required; if running on such platform, OIT part of the API ( which is the only one which actually requires 3.1) is switched off.

View differences:

src/main/java/org/distorted/library/main/DistortedLibrary.java
23 23
import android.content.Context;
24 24
import android.content.pm.ConfigurationInfo;
25 25
import android.content.res.Resources;
26
import android.opengl.GLES30;
26 27
import android.opengl.GLES31;
27 28
import android.util.Log;
28 29

  
......
37 38
import org.distorted.library.mesh.MeshBase;
38 39
import org.distorted.library.message.EffectMessageSender;
39 40
import org.distorted.library.program.DistortedProgram;
41
import org.distorted.library.program.VertexCompilationException;
40 42

  
41 43
import java.io.InputStream;
42 44
import java.nio.ByteBuffer;
......
50 52
 */
51 53
public class DistortedLibrary
52 54
  {
53
  public static final int GLSL = 310;
54
  public static final String GLSL_VERSION= "#version 310 es\n";
55
  private static int mGLSL;
56
  private static String mGLSL_VERSION;
57
  private static boolean mOITCompilationSuccessful;
55 58
  /**
56 59
   * When creating an instance of a DistortedTexture from another instance, clone the Bitmap that's
57 60
   * backing up our DistortedTexture.
......
207 210
    int numF = FragmentEffect.getNumEnabled();
208 211
    int numV = VertexEffect.getNumEnabled();
209 212

  
210
    String mainVertHeader= DistortedLibrary.GLSL_VERSION + ("#define NUM_VERTEX "   + ( numV>0 ? getMax(EffectType.VERTEX  ) : 0 ) + "\n");
211
    String mainFragHeader= DistortedLibrary.GLSL_VERSION + ("#define NUM_FRAGMENT " + ( numF>0 ? getMax(EffectType.FRAGMENT) : 0 ) + "\n");
213
    String mainVertHeader= mGLSL_VERSION + ("#define NUM_VERTEX "   + ( numV>0 ? getMax(EffectType.VERTEX  ) : 0 ) + "\n");
214
    String mainFragHeader= mGLSL_VERSION + ("#define NUM_FRAGMENT " + ( numF>0 ? getMax(EffectType.FRAGMENT) : 0 ) + "\n");
212 215
    String enabledEffectV= VertexEffect.getGLSL();
213 216
    String enabledEffectF= FragmentEffect.getGLSL();
214 217

  
......
217 220
    try
218 221
      {
219 222
      mMainProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader,
220
                                          enabledEffectV, enabledEffectF, DistortedLibrary.GLSL, feedback);
223
                                          enabledEffectV, enabledEffectF, mGLSL, feedback);
221 224
      }
222 225
    catch(Exception e)
223 226
      {
......
227 230

  
228 231
    int mainProgramH = mMainProgram.getProgramHandle();
229 232
    EffectQueue.getUniforms(mainProgramH,0);
230
    mMainTextureH= GLES31.glGetUniformLocation( mainProgramH, "u_Texture");
233
    mMainTextureH= GLES30.glGetUniformLocation( mainProgramH, "u_Texture");
231 234

  
232 235
    // BLIT PROGRAM ////////////////////////////////////
233 236
    final InputStream blitVertStream = resources.openRawResource(R.raw.blit_vertex_shader);
......
235 238

  
236 239
    try
237 240
      {
238
      mBlitProgram = new DistortedProgram(blitVertStream,blitFragStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
241
      mBlitProgram = new DistortedProgram(blitVertStream,blitFragStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
239 242
      }
240 243
    catch(Exception e)
241 244
      {
......
244 247
      }
245 248

  
246 249
    int blitProgramH = mBlitProgram.getProgramHandle();
247
    mBlitTextureH  = GLES31.glGetUniformLocation( blitProgramH, "u_Texture");
248
    mBlitDepthH    = GLES31.glGetUniformLocation( blitProgramH, "u_Depth");
250
    mBlitTextureH  = GLES30.glGetUniformLocation( blitProgramH, "u_Texture");
251
    mBlitDepthH    = GLES30.glGetUniformLocation( blitProgramH, "u_Depth");
249 252

  
250 253
    // BLIT DEPTH PROGRAM ////////////////////////////////////
251 254
    final InputStream blitDepthVertStream = resources.openRawResource(R.raw.blit_depth_vertex_shader);
......
253 256

  
254 257
    try
255 258
      {
256
      mBlitDepthProgram = new DistortedProgram(blitDepthVertStream,blitDepthFragStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
259
      mBlitDepthProgram = new DistortedProgram(blitDepthVertStream,blitDepthFragStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
257 260
      }
258 261
    catch(Exception e)
259 262
      {
......
262 265
      }
263 266

  
264 267
    int blitDepthProgramH   = mBlitDepthProgram.getProgramHandle();
265
    mBlitDepthTextureH      = GLES31.glGetUniformLocation( blitDepthProgramH, "u_Texture");
266
    mBlitDepthDepthTextureH = GLES31.glGetUniformLocation( blitDepthProgramH, "u_DepthTexture");
267
    mBlitDepthDepthH        = GLES31.glGetUniformLocation( blitDepthProgramH, "u_Depth");
268
    mBlitDepthTexCorrH      = GLES31.glGetUniformLocation( blitDepthProgramH, "u_TexCorr");
268
    mBlitDepthTextureH      = GLES30.glGetUniformLocation( blitDepthProgramH, "u_Texture");
269
    mBlitDepthDepthTextureH = GLES30.glGetUniformLocation( blitDepthProgramH, "u_DepthTexture");
270
    mBlitDepthDepthH        = GLES30.glGetUniformLocation( blitDepthProgramH, "u_Depth");
271
    mBlitDepthTexCorrH      = GLES30.glGetUniformLocation( blitDepthProgramH, "u_TexCorr");
269 272

  
270 273
    // NORMAL PROGRAM //////////////////////////////////////
271 274
    final InputStream normalVertexStream   = resources.openRawResource(R.raw.normal_vertex_shader);
......
273 276

  
274 277
    try
275 278
      {
276
      mNormalProgram = new DistortedProgram(normalVertexStream,normalFragmentStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
279
      mNormalProgram = new DistortedProgram(normalVertexStream,normalFragmentStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
277 280
      }
278 281
    catch(Exception e)
279 282
      {
......
282 285
      }
283 286

  
284 287
    int normalProgramH = mNormalProgram.getProgramHandle();
285
    mNormalMVPMatrixH  = GLES31.glGetUniformLocation( normalProgramH, "u_MVPMatrix");
288
    mNormalMVPMatrixH  = GLES30.glGetUniformLocation( normalProgramH, "u_MVPMatrix");
286 289
    }
287 290

  
288 291
///////////////////////////////////////////////////////////////////////////////////////////////////
......
296 299
    int numF = FragmentEffect.getNumEnabled();
297 300
    int numV = VertexEffect.getNumEnabled();
298 301

  
299
    String mainVertHeader= DistortedLibrary.GLSL_VERSION +
300
                           ("#define NUM_VERTEX "   + ( numV>0 ? getMax(EffectType.VERTEX  ) : 0 ) + "\n") +
301
                           ("#define OIT\n");
302
    String mainFragHeader= DistortedLibrary.GLSL_VERSION +
303
                           ("#define NUM_FRAGMENT " + ( numF>0 ? getMax(EffectType.FRAGMENT) : 0 ) + "\n") +
304
                           ("#define OIT\n");
302
    String mainVertHeader= mGLSL_VERSION + ("#define NUM_VERTEX "   + ( numV>0 ? getMax(EffectType.VERTEX  ) : 0 ) + "\n") + ("#define OIT\n");
303
    String mainFragHeader= mGLSL_VERSION + ("#define NUM_FRAGMENT " + ( numF>0 ? getMax(EffectType.FRAGMENT) : 0 ) + "\n") + ("#define OIT\n");
305 304

  
306 305
    String enabledEffectV= VertexEffect.getGLSL();
307 306
    String enabledEffectF= FragmentEffect.getGLSL();
......
309 308
    try
310 309
      {
311 310
      mMainOITProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader,
312
                                             enabledEffectV, enabledEffectF, DistortedLibrary.GLSL, null);
311
                                             enabledEffectV, enabledEffectF, mGLSL, null);
313 312
      }
314 313
    catch(Exception e)
315 314
      {
......
319 318

  
320 319
    int mainOITProgramH = mMainOITProgram.getProgramHandle();
321 320
    EffectQueue.getUniforms(mainOITProgramH,1);
322
    mMainOITTextureH    = GLES31.glGetUniformLocation( mainOITProgramH, "u_Texture");
323
    mMainOITSizeH       = GLES31.glGetUniformLocation( mainOITProgramH, "u_Size");
324
    mMainOITNumRecordsH = GLES31.glGetUniformLocation( mainOITProgramH, "u_numRecords");
321
    mMainOITTextureH    = GLES30.glGetUniformLocation( mainOITProgramH, "u_Texture");
322
    mMainOITSizeH       = GLES30.glGetUniformLocation( mainOITProgramH, "u_Size");
323
    mMainOITNumRecordsH = GLES30.glGetUniformLocation( mainOITProgramH, "u_numRecords");
325 324

  
326 325
    // OIT CLEAR PROGRAM ////////////////////////////////////
327 326
    final InputStream oitClearVertStream = resources.openRawResource(R.raw.oit_vertex_shader);
......
329 328

  
330 329
    try
331 330
      {
332
      mOITClearProgram = new DistortedProgram(oitClearVertStream,oitClearFragStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
331
      mOITClearProgram = new DistortedProgram(oitClearVertStream,oitClearFragStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
333 332
      }
334 333
    catch(Exception e)
335 334
      {
......
338 337
      }
339 338

  
340 339
    int oitClearProgramH   = mOITClearProgram.getProgramHandle();
341
    mOITClearDepthH        = GLES31.glGetUniformLocation( oitClearProgramH, "u_Depth");
342
    mOITClearTexCorrH      = GLES31.glGetUniformLocation( oitClearProgramH, "u_TexCorr");
343
    mOITClearSizeH         = GLES31.glGetUniformLocation( oitClearProgramH, "u_Size");
340
    mOITClearDepthH        = GLES30.glGetUniformLocation( oitClearProgramH, "u_Depth");
341
    mOITClearTexCorrH      = GLES30.glGetUniformLocation( oitClearProgramH, "u_TexCorr");
342
    mOITClearSizeH         = GLES30.glGetUniformLocation( oitClearProgramH, "u_Size");
344 343

  
345 344
    // OIT BUILD PROGRAM ////////////////////////////////////
346 345
    final InputStream oitBuildVertStream = resources.openRawResource(R.raw.oit_vertex_shader);
......
348 347

  
349 348
    try
350 349
      {
351
      mOITBuildProgram = new DistortedProgram(oitBuildVertStream,oitBuildFragStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
350
      mOITBuildProgram = new DistortedProgram(oitBuildVertStream,oitBuildFragStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
352 351
      }
353 352
    catch(Exception e)
354 353
      {
......
357 356
      }
358 357

  
359 358
    int oitBuildProgramH   = mOITBuildProgram.getProgramHandle();
360
    mOITBuildTextureH      = GLES31.glGetUniformLocation( oitBuildProgramH, "u_Texture");
361
    mOITBuildDepthTextureH = GLES31.glGetUniformLocation( oitBuildProgramH, "u_DepthTexture");
362
    mOITBuildDepthH        = GLES31.glGetUniformLocation( oitBuildProgramH, "u_Depth");
363
    mOITBuildTexCorrH      = GLES31.glGetUniformLocation( oitBuildProgramH, "u_TexCorr");
364
    mOITBuildSizeH         = GLES31.glGetUniformLocation( oitBuildProgramH, "u_Size");
365
    mOITBuildNumRecordsH   = GLES31.glGetUniformLocation( oitBuildProgramH, "u_numRecords");
359
    mOITBuildTextureH      = GLES30.glGetUniformLocation( oitBuildProgramH, "u_Texture");
360
    mOITBuildDepthTextureH = GLES30.glGetUniformLocation( oitBuildProgramH, "u_DepthTexture");
361
    mOITBuildDepthH        = GLES30.glGetUniformLocation( oitBuildProgramH, "u_Depth");
362
    mOITBuildTexCorrH      = GLES30.glGetUniformLocation( oitBuildProgramH, "u_TexCorr");
363
    mOITBuildSizeH         = GLES30.glGetUniformLocation( oitBuildProgramH, "u_Size");
364
    mOITBuildNumRecordsH   = GLES30.glGetUniformLocation( oitBuildProgramH, "u_numRecords");
366 365

  
367 366
    // OIT COLLAPSE PROGRAM ///////////////////////////
368 367
    final InputStream oitCollapseVertStream = resources.openRawResource(R.raw.oit_vertex_shader);
......
370 369

  
371 370
    try
372 371
      {
373
      mOITCollapseProgram = new DistortedProgram(oitCollapseVertStream,oitCollapseFragStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
372
      mOITCollapseProgram = new DistortedProgram(oitCollapseVertStream,oitCollapseFragStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
374 373
      }
375 374
    catch(Exception e)
376 375
      {
......
379 378
      }
380 379

  
381 380
    int oitCollapseProgramH   = mOITCollapseProgram.getProgramHandle();
382
    mOITCollapseDepthTextureH = GLES31.glGetUniformLocation( oitCollapseProgramH, "u_DepthTexture");
383
    mOITCollapseDepthH        = GLES31.glGetUniformLocation( oitCollapseProgramH, "u_Depth");
384
    mOITCollapseTexCorrH      = GLES31.glGetUniformLocation( oitCollapseProgramH, "u_TexCorr");
385
    mOITCollapseSizeH         = GLES31.glGetUniformLocation( oitCollapseProgramH, "u_Size");
381
    mOITCollapseDepthTextureH = GLES30.glGetUniformLocation( oitCollapseProgramH, "u_DepthTexture");
382
    mOITCollapseDepthH        = GLES30.glGetUniformLocation( oitCollapseProgramH, "u_Depth");
383
    mOITCollapseTexCorrH      = GLES30.glGetUniformLocation( oitCollapseProgramH, "u_TexCorr");
384
    mOITCollapseSizeH         = GLES30.glGetUniformLocation( oitCollapseProgramH, "u_Size");
386 385

  
387 386
    // OIT RENDER PROGRAM ///////////////////////////
388 387
    final InputStream oitRenderVertStream = resources.openRawResource(R.raw.oit_vertex_shader);
......
390 389

  
391 390
    try
392 391
      {
393
      mOITRenderProgram = new DistortedProgram(oitRenderVertStream,oitRenderFragStream, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL_VERSION, DistortedLibrary.GLSL);
392
      mOITRenderProgram = new DistortedProgram(oitRenderVertStream,oitRenderFragStream, mGLSL_VERSION, mGLSL_VERSION, mGLSL);
394 393
      }
395 394
    catch(Exception e)
396 395
      {
......
399 398
      }
400 399

  
401 400
    int oitRenderProgramH   = mOITRenderProgram.getProgramHandle();
402
    mOITRenderDepthH        = GLES31.glGetUniformLocation( oitRenderProgramH, "u_Depth");
403
    mOITRenderTexCorrH      = GLES31.glGetUniformLocation( oitRenderProgramH, "u_TexCorr");
404
    mOITRenderSizeH         = GLES31.glGetUniformLocation( oitRenderProgramH, "u_Size");
401
    mOITRenderDepthH        = GLES30.glGetUniformLocation( oitRenderProgramH, "u_Depth");
402
    mOITRenderTexCorrH      = GLES30.glGetUniformLocation( oitRenderProgramH, "u_TexCorr");
403
    mOITRenderSizeH         = GLES30.glGetUniformLocation( oitRenderProgramH, "u_Size");
405 404
    }
406 405

  
407 406
///////////////////////////////////////////////////////////////////////////////////////////////////
......
411 410
    int num = mesh.getNumVertices();
412 411
    int tfo = mesh.getTFO();
413 412

  
414
    GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
415
    GLES31.glBeginTransformFeedback( GLES31.GL_POINTS);
413
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
414
    GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
416 415
    InternalRenderState.switchOffDrawing();
417
    GLES31.glDrawArrays( GLES31.GL_POINTS, 0, num );
416
    GLES30.glDrawArrays( GLES30.GL_POINTS, 0, num );
418 417
    InternalRenderState.restoreDrawing();
419
    GLES31.glEndTransformFeedback();
420
    GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
418
    GLES30.glEndTransformFeedback();
419
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
421 420

  
422 421
    DistortedLibrary.mNormalProgram.useProgram();
423
    GLES31.glUniformMatrix4fv(DistortedLibrary.mNormalMVPMatrixH, 1, false, EffectQueue.getMVP(queues) , 0);
422
    GLES30.glUniformMatrix4fv(DistortedLibrary.mNormalMVPMatrixH, 1, false, EffectQueue.getMVP(queues) , 0);
424 423
    mesh.bindTransformAttribs(DistortedLibrary.mNormalProgram);
425
    GLES31.glLineWidth(8.0f);
426
    GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*num);
424
    GLES30.glLineWidth(8.0f);
425
    GLES30.glDrawArrays(GLES30.GL_LINES, 0, 2*num);
427 426
    }
428 427

  
429 428
///////////////////////////////////////////////////////////////////////////////////////////////////
......
433 432
    EffectQueue[] queues = effects.getQueues();
434 433

  
435 434
    EffectQueue.compute(queues, currTime);
436
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
435
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
437 436

  
438 437
    DistortedLibrary.mMainOITProgram.useProgram();
439
    GLES31.glUniform1i(DistortedLibrary.mMainOITTextureH, 0);
440
    GLES31.glUniform2ui(DistortedLibrary.mMainOITSizeH, surface.mWidth, surface.mHeight);
441
    GLES31.glUniform1ui(DistortedLibrary.mMainOITNumRecordsH, (int)(DistortedLibrary.mBufferSize*surface.mWidth*surface.mHeight) );
438
    GLES30.glUniform1i(DistortedLibrary.mMainOITTextureH, 0);
439
    GLES30.glUniform2ui(DistortedLibrary.mMainOITSizeH, surface.mWidth, surface.mHeight);
440
    GLES30.glUniform1ui(DistortedLibrary.mMainOITNumRecordsH, (int)(DistortedLibrary.mBufferSize*surface.mWidth*surface.mHeight) );
442 441
    mesh.bindVertexAttribs(DistortedLibrary.mMainOITProgram);
443 442

  
444 443
    float inflate     = mesh.getInflate();
......
447 446
    float[] projection= surface.mProjectionMatrix;
448 447

  
449 448
    EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 1 );
450
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
449
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
451 450

  
452 451
    if( mesh.getShowNormals() )
453 452
      {
......
464 463
    EffectQueue[] queues = effects.getQueues();
465 464

  
466 465
    EffectQueue.compute(queues, currTime);
467
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
466
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
468 467

  
469 468
    DistortedLibrary.mMainProgram.useProgram();
470
    GLES31.glUniform1i(DistortedLibrary.mMainTextureH, 0);
469
    GLES30.glUniform1i(DistortedLibrary.mMainTextureH, 0);
471 470
    mesh.bindVertexAttribs(DistortedLibrary.mMainProgram);
472 471

  
473 472
    float inflate     = mesh.getInflate();
......
476 475
    float[] projection= surface.mProjectionMatrix;
477 476

  
478 477
    EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 0 );
479
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
478
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
480 479

  
481 480
    if( mesh.getShowNormals() ) displayNormals(queues,mesh);
482 481
    }
......
487 486
    {
488 487
    mBlitProgram.useProgram();
489 488

  
490
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
491
    GLES31.glUniform1i(mBlitTextureH, 0);
492
    GLES31.glUniform1f( mBlitDepthH , 1.0f-surface.mNear);
493
    GLES31.glVertexAttribPointer(mBlitProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
494
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
489
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
490
    GLES30.glUniform1i(mBlitTextureH, 0);
491
    GLES30.glUniform1f( mBlitDepthH , 1.0f-surface.mNear);
492
    GLES30.glVertexAttribPointer(mBlitProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
493
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
495 494
    }
496 495

  
497 496
///////////////////////////////////////////////////////////////////////////////////////////////////
......
500 499
    {
501 500
    mBlitDepthProgram.useProgram();
502 501

  
503
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
504
    GLES31.glUniform1i(mBlitDepthTextureH, 0);
505
    GLES31.glUniform1i(mBlitDepthDepthTextureH, 1);
506
    GLES31.glUniform2f(mBlitDepthTexCorrH, corrW, corrH );
507
    GLES31.glUniform1f( mBlitDepthDepthH , 1.0f-surface.mNear);
508
    GLES31.glVertexAttribPointer(mBlitDepthProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
509
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
502
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
503
    GLES30.glUniform1i(mBlitDepthTextureH, 0);
504
    GLES30.glUniform1i(mBlitDepthDepthTextureH, 1);
505
    GLES30.glUniform2f(mBlitDepthTexCorrH, corrW, corrH );
506
    GLES30.glUniform1f( mBlitDepthDepthH , 1.0f-surface.mNear);
507
    GLES30.glVertexAttribPointer(mBlitDepthProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
508
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
510 509
    }
511 510

  
512 511
///////////////////////////////////////////////////////////////////////////////////////////////////
512
// yes it is safe to be mixing 3.0 and 3.1 like that, senior members of the OpenGL discussions forum assert
513 513

  
514 514
  private static int printPreviousBuffer()
515 515
    {
516 516
    int counter = 0;
517 517

  
518
    ByteBuffer atomicBuf = (ByteBuffer)GLES31.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
519
                                                                GLES31.GL_MAP_READ_BIT);
518
    ByteBuffer atomicBuf = (ByteBuffer)GLES30.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
519
                                                                GLES30.GL_MAP_READ_BIT);
520 520
    if( atomicBuf!=null )
521 521
      {
522 522
      IntBuffer atomicIntBuf = atomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
......
524 524
      }
525 525
    else
526 526
      {
527
      android.util.Log.e("effects", "print: failed to map atomic buffer");
527
      Log.e("effects", "print: failed to map atomic buffer");
528 528
      }
529 529

  
530
    GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER);
530
    GLES30.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER);
531 531

  
532 532
    return counter;
533 533
    }
......
536 536

  
537 537
  private static void zeroBuffer()
538 538
    {
539
    ByteBuffer atomicBuf = (ByteBuffer)GLES31.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
540
        GLES31.GL_MAP_WRITE_BIT|GLES31.GL_MAP_INVALIDATE_BUFFER_BIT);
539
    ByteBuffer atomicBuf = (ByteBuffer)GLES30.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
540
        GLES30.GL_MAP_WRITE_BIT|GLES30.GL_MAP_INVALIDATE_BUFFER_BIT);
541 541
    if( atomicBuf!=null )
542 542
      {
543 543
      IntBuffer atomicIntBuf = atomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
......
545 545
      }
546 546
    else
547 547
      {
548
      android.util.Log.e("effects", "zero: failed to map atomic buffer");
548
      Log.e("effects", "zero: failed to map atomic buffer");
549 549
      }
550 550

  
551
    GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER);
551
    GLES30.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER);
552 552
    }
553 553

  
554 554
///////////////////////////////////////////////////////////////////////////////////////////////////
......
560 560

  
561 561
    if( mAtomicCounter[0]<0 )
562 562
      {
563
      GLES31.glGenBuffers(DistortedLibrary.FBO_QUEUE_SIZE,mAtomicCounter,0);
563
      GLES30.glGenBuffers(DistortedLibrary.FBO_QUEUE_SIZE,mAtomicCounter,0);
564 564

  
565 565
      for(int i = 0; i< DistortedLibrary.FBO_QUEUE_SIZE; i++)
566 566
        {
567
        GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[i]);
568
        GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES31.GL_DYNAMIC_DRAW);
567
        GLES30.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[i]);
568
        GLES30.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES30.GL_DYNAMIC_DRAW);
569 569
        zeroBuffer();
570 570
        }
571 571
      }
......
574 574
    // dialog_about 3%; doing it only once every 5 frames affects speed by less than 1%.
575 575
    if( mCurrBuffer==0 )
576 576
      {
577
      GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[mCurrBuffer]);
577
      GLES30.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[mCurrBuffer]);
578 578
      counter = printPreviousBuffer();
579 579
      }
580 580

  
581 581
    if( ++mCurrBuffer>= DistortedLibrary.FBO_QUEUE_SIZE ) mCurrBuffer = 0;
582 582

  
583
    GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[mCurrBuffer]);
583
    GLES30.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[mCurrBuffer]);
584 584
    zeroBuffer();
585 585

  
586 586
    return counter;
......
593 593
    {
594 594
    if( mLinkedListSSBO[0]<0 )
595 595
      {
596
      GLES31.glGenBuffers(1,mLinkedListSSBO,0);
596
      GLES30.glGenBuffers(1,mLinkedListSSBO,0);
597 597

  
598 598
      int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
599
      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
600
      GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);
601
      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
599
      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
600
      GLES30.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES30.GL_DYNAMIC_READ|GLES30.GL_DYNAMIC_DRAW);
601
      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
602 602

  
603
      GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
603
      GLES30.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
604 604
      }
605 605

  
606 606
    // See if we have overflown the SSBO in one of the previous frames.
......
614 614

  
615 615
      mBufferSize *= (int)(overflow+1.0f);
616 616
      int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);
617
      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
618
      GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);
619
      GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
617
      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
618
      GLES30.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES30.GL_DYNAMIC_READ|GLES30.GL_DYNAMIC_DRAW);
619
      GLES30.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
620 620
      }
621 621

  
622 622
    mOITClearProgram.useProgram();
623 623

  
624
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
625
    GLES31.glUniform2f(mOITClearTexCorrH, 1.0f, 1.0f );   // corrections do not really matter here - only present because of common vertex shader.
626
    GLES31.glUniform1f( mOITClearDepthH , 1.0f);          // likewise depth
627
    GLES31.glUniform2ui(mOITClearSizeH, surface.mWidth, surface.mHeight);
628
    GLES31.glVertexAttribPointer(mOITClearProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
629
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
624
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
625
    GLES30.glUniform2f(mOITClearTexCorrH, 1.0f, 1.0f );   // corrections do not really matter here - only present because of common vertex shader.
626
    GLES30.glUniform1f( mOITClearDepthH , 1.0f);          // likewise depth
627
    GLES30.glUniform2ui(mOITClearSizeH, surface.mWidth, surface.mHeight);
628
    GLES30.glVertexAttribPointer(mOITClearProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
629
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
630 630
    }
631 631

  
632 632
///////////////////////////////////////////////////////////////////////////////////////////////////
......
636 636
    {
637 637
    mOITBuildProgram.useProgram();
638 638

  
639
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
640
    GLES31.glUniform1i(mOITBuildTextureH, 0);
641
    GLES31.glUniform1i(mOITBuildDepthTextureH, 1);
642
    GLES31.glUniform2f(mOITBuildTexCorrH, corrW, corrH );
643
    GLES31.glUniform2ui(mOITBuildSizeH, surface.mWidth, surface.mHeight);
644
    GLES31.glUniform1ui(mOITBuildNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
645
    GLES31.glUniform1f(mOITBuildDepthH , 1.0f-surface.mNear);
646
    GLES31.glVertexAttribPointer(mOITBuildProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
647
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
639
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
640
    GLES30.glUniform1i(mOITBuildTextureH, 0);
641
    GLES30.glUniform1i(mOITBuildDepthTextureH, 1);
642
    GLES30.glUniform2f(mOITBuildTexCorrH, corrW, corrH );
643
    GLES30.glUniform2ui(mOITBuildSizeH, surface.mWidth, surface.mHeight);
644
    GLES30.glUniform1ui(mOITBuildNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
645
    GLES30.glUniform1f(mOITBuildDepthH , 1.0f-surface.mNear);
646
    GLES30.glVertexAttribPointer(mOITBuildProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
647
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
648 648
    }
649 649

  
650 650
///////////////////////////////////////////////////////////////////////////////////////////////////
......
654 654
    {
655 655
    mOITCollapseProgram.useProgram();
656 656

  
657
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
658
    GLES31.glUniform1i(mOITCollapseDepthTextureH, 1);
659
    GLES31.glUniform2f(mOITCollapseTexCorrH, corrW, corrH );
660
    GLES31.glUniform2ui(mOITCollapseSizeH, surface.mWidth, surface.mHeight);
661
    GLES31.glUniform1f( mOITCollapseDepthH , 1.0f-surface.mNear);
662
    GLES31.glVertexAttribPointer(mOITCollapseProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
663
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
657
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
658
    GLES30.glUniform1i(mOITCollapseDepthTextureH, 1);
659
    GLES30.glUniform2f(mOITCollapseTexCorrH, corrW, corrH );
660
    GLES30.glUniform2ui(mOITCollapseSizeH, surface.mWidth, surface.mHeight);
661
    GLES30.glUniform1f( mOITCollapseDepthH , 1.0f-surface.mNear);
662
    GLES30.glVertexAttribPointer(mOITCollapseProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
663
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
664 664
    }
665 665

  
666 666
///////////////////////////////////////////////////////////////////////////////////////////////////
......
670 670
    {
671 671
    mOITRenderProgram.useProgram();
672 672

  
673
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
674
    GLES31.glUniform2f(mOITRenderTexCorrH, corrW, corrH );
675
    GLES31.glUniform2ui(mOITRenderSizeH, surface.mWidth, surface.mHeight);
676
    GLES31.glUniform1f( mOITRenderDepthH , 1.0f-surface.mNear);
677
    GLES31.glVertexAttribPointer(mOITRenderProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);
678
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
673
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
674
    GLES30.glUniform2f(mOITRenderTexCorrH, corrW, corrH );
675
    GLES30.glUniform2ui(mOITRenderSizeH, surface.mWidth, surface.mHeight);
676
    GLES30.glUniform1f( mOITRenderDepthH , 1.0f-surface.mNear);
677
    GLES30.glVertexAttribPointer(mOITRenderProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
678
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
679 679
    }
680 680

  
681 681
///////////////////////////////////////////////////////////////////////////////////////////////////
......
687 687

  
688 688
///////////////////////////////////////////////////////////////////////////////////////////////////
689 689
// ARM Mali driver r12 has problems when we keep swapping many FBOs (fixed in r22)
690
// PowerVR GE8100 compiler fails to compile OIT programs.
690
// PowerVR GE8100 / GE8300 compiler fails to compile OIT programs.
691 691

  
692 692
  private static void detectBuggyDrivers()
693 693
    {
694
    String vendor  = GLES31.glGetString(GLES31.GL_VENDOR);
695
    String version = GLES31.glGetString(GLES31.GL_VERSION);
696
    String renderer= GLES31.glGetString(GLES31.GL_RENDERER);
694
    String vendor  = GLES30.glGetString(GLES30.GL_VENDOR);
695
    String version = GLES30.glGetString(GLES30.GL_VERSION);
696
    String renderer= GLES30.glGetString(GLES30.GL_RENDERER);
697 697

  
698 698
    /*
699
    android.util.Log.e("DISTORTED", "GLSL Version "+GLES31.glGetString(GLES31.GL_SHADING_LANGUAGE_VERSION));
700
    android.util.Log.e("DISTORTED", "GL Version "  +GLES31.glGetString(GLES31.GL_VERSION));
701
    android.util.Log.e("DISTORTED", "GL Vendor "   +GLES31.glGetString(GLES31.GL_VENDOR));
702
    android.util.Log.e("DISTORTED", "GL Renderer " +GLES31.glGetString(GLES31.GL_RENDERER));
699
    android.util.Log.e("DISTORTED", "GLSL Version "+GLES30.glGetString(GLES31.GL_SHADING_LANGUAGE_VERSION));
700
    android.util.Log.e("DISTORTED", "GL Version "  +GLES30.glGetString(GLES31.GL_VERSION));
701
    android.util.Log.e("DISTORTED", "GL Vendor "   +GLES30.glGetString(GLES31.GL_VENDOR));
702
    android.util.Log.e("DISTORTED", "GL Renderer " +GLES30.glGetString(GLES31.GL_RENDERER));
703 703
    */
704 704

  
705 705
    if( vendor.contains("ARM") )
706 706
      {
707 707
      if( version.contains("r12") )
708 708
        {
709
        android.util.Log.e("DISTORTED", "You are running this on a ARM Mali driver r12.\nThis is a buggy driver, please update to r22. Problems with flashing expected.");
709
        Log.e("DISTORTED", "You are running this on a ARM Mali driver r12.\nThis is a buggy driver, please update to r22. Problems with flashing expected.");
710 710
        }
711 711
      }
712 712
    else if( vendor.contains("Imagination") )
713 713
      {
714 714
      if( renderer.contains("GE8") )
715 715
        {
716
        android.util.Log.e("DISTORTED", "You are running this on a PowerVR GE8XXX.\nDue to a buggy compiler OIT rendering will not work");
716
        Log.e("DISTORTED", "You are running this on a PowerVR GE8XXX.\nDue to a buggy compiler OIT rendering will not work");
717 717
        }
718 718
      }
719 719
    }
720 720

  
721
///////////////////////////////////////////////////////////////////////////////////////////////////
722
/**
723
 * Return OpenGL ES version supported by the hardware we are running on.
724
 * There are only two possibilities: 300 (OpenGL ES 3.0) or 310 (at least OpenGL ES 3.1)
725
 */
726
  static int getGLSL()
727
    {
728
    return mGLSL;
729
    }
730

  
731
///////////////////////////////////////////////////////////////////////////////////////////////////
732
/**
733
 * Have we successfully managed to compile the OIT programs?
734
 * Some hardware ( Imagination GE8100 / 8300, driver build 1.8@4490469 present in my HTC phone and,
735
 * sadly, Amazon Fire Stick 4K ) fails to compile the shaders. See relevant thread in Imagination's
736
 * support forum:
737
 *
738
 * https://forums.imgtec.com/t/ge8100-in-htc-desire-12-android-7-1-1-fragment-shader-fails-to-compile/2708
739
 */
740
  public static boolean OITCompilationSuccessful()
741
    {
742
    return mOITCompilationSuccessful;
743
    }
744

  
721 745
///////////////////////////////////////////////////////////////////////////////////////////////////
722 746
/**
723 747
 * Have we called onCreate yet, ie have we initialized the library?
......
741 765
    {
742 766
    final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
743 767
    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
744
    android.util.Log.e("DISTORTED", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
768

  
769
    int glESversion = configurationInfo.reqGlEsVersion;
770
    int major = glESversion >> 16;
771
    int minor = glESversion & 0xff;
772

  
773
    if( major< 3 )
774
      {
775
      mGLSL = 100*major + 10*minor;
776
      throw new VertexCompilationException("at least OpenGL ES 3.0 required, this device supports only "+major+"."+minor);
777
      }
778
    else
779
      {
780
      mGLSL = (major==3 && minor==0) ? 300 : 310;
781
      }
782

  
783
    android.util.Log.e("DISTORTED", "Using OpenGL ES "+major+"."+minor);
784
    mGLSL_VERSION = "#version "+mGLSL+" es\n";
745 785

  
746 786
    mInitialized = true;
787
    mOITCompilationSuccessful = false;
747 788

  
748 789
    detectBuggyDrivers();
749 790

  
......
762 803
      exception = ex;
763 804
      }
764 805

  
765
    try
806
    if( mGLSL>=310)
766 807
      {
767
      createProgramsOIT(resources);
768
      }
769
    catch(Exception ex)
770
      {
771
      exception = ex;
808
      try
809
        {
810
        createProgramsOIT(resources);
811
        mOITCompilationSuccessful = true;
812
        }
813
      catch(Exception ex)
814
        {
815
        exception = ex;
816
        }
772 817
      }
773 818

  
774 819
    try
775 820
      {
776
      EffectQueuePostprocess.createPrograms(resources);
821
      EffectQueuePostprocess.createPrograms(resources, mGLSL);
777 822
      }
778 823
    catch(Exception ex)
779 824
      {
......
782 827

  
783 828
    try
784 829
      {
785
      PostprocessEffect.createPrograms();
830
      PostprocessEffect.createPrograms(mGLSL);
786 831
      }
787 832
    catch(Exception ex)
788 833
      {

Also available in: Unified diff