Revision b7074bc6
Added by Leszek Koltunski about 4 years ago
src/main/java/org/distorted/library/program/DistortedProgram.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.library.program; |
21 | 21 |
|
22 |
import android.opengl.GLES31;
|
|
22 |
import android.opengl.GLES30;
|
|
23 | 23 |
|
24 | 24 |
import java.io.BufferedReader; |
25 | 25 |
import java.io.IOException; |
... | ... | |
54 | 54 |
private int createAndLinkProgram(final int vertexShaderHandle, final int fragmentShaderHandle, final String[] attributes, final String[] feedbackVaryings) |
55 | 55 |
throws LinkingException |
56 | 56 |
{ |
57 |
int programHandle = GLES31.glCreateProgram();
|
|
57 |
int programHandle = GLES30.glCreateProgram();
|
|
58 | 58 |
|
59 | 59 |
if (programHandle != 0) |
60 | 60 |
{ |
61 |
GLES31.glAttachShader(programHandle, vertexShaderHandle);
|
|
62 |
GLES31.glAttachShader(programHandle, fragmentShaderHandle);
|
|
61 |
GLES30.glAttachShader(programHandle, vertexShaderHandle);
|
|
62 |
GLES30.glAttachShader(programHandle, fragmentShaderHandle);
|
|
63 | 63 |
|
64 | 64 |
if( feedbackVaryings!=null ) |
65 | 65 |
{ |
66 |
GLES31.glTransformFeedbackVaryings(programHandle, feedbackVaryings, GLES31.GL_INTERLEAVED_ATTRIBS);
|
|
66 |
GLES30.glTransformFeedbackVaryings(programHandle, feedbackVaryings, GLES30.GL_INTERLEAVED_ATTRIBS);
|
|
67 | 67 |
} |
68 | 68 |
|
69 | 69 |
if (attributes != null) |
... | ... | |
72 | 72 |
|
73 | 73 |
for (int i = 0; i < size; i++) |
74 | 74 |
{ |
75 |
GLES31.glBindAttribLocation(programHandle, i, attributes[i]);
|
|
75 |
GLES30.glBindAttribLocation(programHandle, i, attributes[i]);
|
|
76 | 76 |
} |
77 | 77 |
} |
78 | 78 |
|
79 |
GLES31.glLinkProgram(programHandle);
|
|
79 |
GLES30.glLinkProgram(programHandle);
|
|
80 | 80 |
|
81 | 81 |
final int[] linkStatus = new int[1]; |
82 |
GLES31.glGetProgramiv(programHandle, GLES31.GL_LINK_STATUS, linkStatus, 0);
|
|
82 |
GLES30.glGetProgramiv(programHandle, GLES30.GL_LINK_STATUS, linkStatus, 0);
|
|
83 | 83 |
|
84 |
if (linkStatus[0] != GLES31.GL_TRUE )
|
|
84 |
if (linkStatus[0] != GLES30.GL_TRUE )
|
|
85 | 85 |
{ |
86 |
String error = GLES31.glGetProgramInfoLog(programHandle);
|
|
87 |
GLES31.glDeleteProgram(programHandle);
|
|
86 |
String error = GLES30.glGetProgramInfoLog(programHandle);
|
|
87 |
GLES30.glDeleteProgram(programHandle);
|
|
88 | 88 |
throw new LinkingException(error); |
89 | 89 |
} |
90 | 90 |
|
91 | 91 |
final int[] numberOfUniforms = new int[1]; |
92 |
GLES31.glGetProgramiv(programHandle, GLES31.GL_ACTIVE_UNIFORMS, numberOfUniforms, 0);
|
|
92 |
GLES30.glGetProgramiv(programHandle, GLES30.GL_ACTIVE_UNIFORMS, numberOfUniforms, 0);
|
|
93 | 93 |
|
94 | 94 |
//android.util.Log.d("program", "number of active uniforms="+numberOfUniforms[0]); |
95 | 95 |
} |
... | ... | |
283 | 283 |
private static int compileShader(final int shaderType, final String shaderSource) |
284 | 284 |
throws FragmentCompilationException,VertexCompilationException |
285 | 285 |
{ |
286 |
int shaderHandle = GLES31.glCreateShader(shaderType);
|
|
286 |
int shaderHandle = GLES30.glCreateShader(shaderType);
|
|
287 | 287 |
|
288 | 288 |
if (shaderHandle != 0) |
289 | 289 |
{ |
290 |
GLES31.glShaderSource(shaderHandle, shaderSource);
|
|
291 |
GLES31.glCompileShader(shaderHandle);
|
|
290 |
GLES30.glShaderSource(shaderHandle, shaderSource);
|
|
291 |
GLES30.glCompileShader(shaderHandle);
|
|
292 | 292 |
final int[] compileStatus = new int[1]; |
293 |
GLES31.glGetShaderiv(shaderHandle, GLES31.GL_COMPILE_STATUS, compileStatus, 0);
|
|
293 |
GLES30.glGetShaderiv(shaderHandle, GLES30.GL_COMPILE_STATUS, compileStatus, 0);
|
|
294 | 294 |
|
295 |
if (compileStatus[0] != GLES31.GL_TRUE)
|
|
295 |
if (compileStatus[0] != GLES30.GL_TRUE)
|
|
296 | 296 |
{ |
297 |
String error = GLES31.glGetShaderInfoLog(shaderHandle);
|
|
297 |
String error = GLES30.glGetShaderInfoLog(shaderHandle);
|
|
298 | 298 |
|
299 |
//android.util.Log.e("Program", "error compiling :" + error); |
|
300 |
|
|
301 |
GLES31.glDeleteShader(shaderHandle); |
|
299 |
GLES30.glDeleteShader(shaderHandle); |
|
302 | 300 |
|
303 | 301 |
switch (shaderType) |
304 | 302 |
{ |
305 |
case GLES31.GL_VERTEX_SHADER: throw new VertexCompilationException(error);
|
|
306 |
case GLES31.GL_FRAGMENT_SHADER: throw new FragmentCompilationException(error);
|
|
303 |
case GLES30.GL_VERTEX_SHADER: throw new VertexCompilationException(error);
|
|
304 |
case GLES30.GL_FRAGMENT_SHADER: throw new FragmentCompilationException(error);
|
|
307 | 305 |
default: throw new RuntimeException(error); |
308 | 306 |
} |
309 | 307 |
} |
... | ... | |
357 | 355 |
final String vertShader = readTextFileFromRawResource(vert, true ); |
358 | 356 |
final String fragShader = readTextFileFromRawResource(frag, false); |
359 | 357 |
|
360 |
final int vertShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertHeader + vertShader);
|
|
361 |
final int fragShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragHeader + fragShader);
|
|
358 |
final int vertShaderHandle = compileShader(GLES30.GL_VERTEX_SHADER , vertHeader + vertShader);
|
|
359 |
final int fragShaderHandle = compileShader(GLES30.GL_FRAGMENT_SHADER, fragHeader + fragShader);
|
|
362 | 360 |
|
363 | 361 |
mProgramHandle = createAndLinkProgram(vertShaderHandle, fragShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null ); |
364 | 362 |
|
... | ... | |
366 | 364 |
|
367 | 365 |
for(int i=0; i<mNumAttributes; i++) |
368 | 366 |
{ |
369 |
mAttribute[i] = GLES31.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
367 |
mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
370 | 368 |
} |
371 | 369 |
|
372 | 370 |
if( mNumUniforms>0 ) |
... | ... | |
376 | 374 |
|
377 | 375 |
for(int i=0; i<mNumUniforms; i++) |
378 | 376 |
{ |
379 |
mUniform[i] = GLES31.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
377 |
mUniform[i] = GLES30.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
380 | 378 |
} |
381 | 379 |
} |
382 | 380 |
else mUniform = null; |
... | ... | |
400 | 398 |
if( enabledVert!=null ) vertShader = insertEnabledEffects(vertShader,enabledVert); |
401 | 399 |
if( enabledFrag!=null ) fragShader = insertEnabledEffects(fragShader,enabledFrag); |
402 | 400 |
|
403 |
final int vertShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertHeader + vertShader);
|
|
404 |
final int fragShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragHeader + fragShader);
|
|
401 |
final int vertShaderHandle = compileShader(GLES30.GL_VERTEX_SHADER , vertHeader + vertShader);
|
|
402 |
final int fragShaderHandle = compileShader(GLES30.GL_FRAGMENT_SHADER, fragHeader + fragShader);
|
|
405 | 403 |
|
406 | 404 |
mProgramHandle = createAndLinkProgram(vertShaderHandle, fragShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null ); |
407 | 405 |
|
... | ... | |
409 | 407 |
|
410 | 408 |
for(int i=0; i<mNumAttributes; i++) |
411 | 409 |
{ |
412 |
mAttribute[i] = GLES31.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
410 |
mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
413 | 411 |
} |
414 | 412 |
|
415 | 413 |
if( mNumUniforms>0 ) |
... | ... | |
419 | 417 |
|
420 | 418 |
for(int i=0; i<mNumUniforms; i++) |
421 | 419 |
{ |
422 |
mUniform[i] = GLES31.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
420 |
mUniform[i] = GLES30.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
423 | 421 |
} |
424 | 422 |
} |
425 | 423 |
else mUniform = null; |
... | ... | |
461 | 459 |
doAttributes(vertex , true ); |
462 | 460 |
doAttributes(fragment, false); |
463 | 461 |
|
464 |
final int vertexShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertex );
|
|
465 |
final int fragmentShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragment);
|
|
462 |
final int vertexShaderHandle = compileShader(GLES30.GL_VERTEX_SHADER , vertex );
|
|
463 |
final int fragmentShaderHandle = compileShader(GLES30.GL_FRAGMENT_SHADER, fragment);
|
|
466 | 464 |
|
467 | 465 |
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, mAttributeName, null ); |
468 | 466 |
|
... | ... | |
470 | 468 |
|
471 | 469 |
for(int i=0; i<mNumAttributes; i++) |
472 | 470 |
{ |
473 |
mAttribute[i] = GLES31.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
471 |
mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
474 | 472 |
} |
475 | 473 |
|
476 | 474 |
if( mNumUniforms>0 ) |
... | ... | |
480 | 478 |
|
481 | 479 |
for(int i=0; i<mNumUniforms; i++) |
482 | 480 |
{ |
483 |
mUniform[i] = GLES31.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
481 |
mUniform[i] = GLES30.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
484 | 482 |
} |
485 | 483 |
} |
486 | 484 |
else mUniform = null; |
... | ... | |
503 | 501 |
*/ |
504 | 502 |
public void useProgram() |
505 | 503 |
{ |
506 |
GLES31.glUseProgram(mProgramHandle);
|
|
504 |
GLES30.glUseProgram(mProgramHandle);
|
|
507 | 505 |
|
508 | 506 |
for(int i=0; i<mNumAttributes; i++) |
509 |
GLES31.glEnableVertexAttribArray(mAttribute[i]);
|
|
507 |
GLES30.glEnableVertexAttribArray(mAttribute[i]);
|
|
510 | 508 |
} |
511 | 509 |
} |
512 | 510 |
|
Also available in: Unified diff
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.