Revision e6519ac8
Added by Leszek Koltunski about 6 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.GLES30;
|
|
22 |
import android.opengl.GLES31;
|
|
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 = GLES30.glCreateProgram();
|
|
57 |
int programHandle = GLES31.glCreateProgram();
|
|
58 | 58 |
|
59 | 59 |
if (programHandle != 0) |
60 | 60 |
{ |
61 |
GLES30.glAttachShader(programHandle, vertexShaderHandle);
|
|
62 |
GLES30.glAttachShader(programHandle, fragmentShaderHandle);
|
|
61 |
GLES31.glAttachShader(programHandle, vertexShaderHandle);
|
|
62 |
GLES31.glAttachShader(programHandle, fragmentShaderHandle);
|
|
63 | 63 |
|
64 | 64 |
if( feedbackVaryings!=null ) |
65 | 65 |
{ |
66 |
GLES30.glTransformFeedbackVaryings(programHandle, feedbackVaryings, GLES30.GL_INTERLEAVED_ATTRIBS);
|
|
66 |
GLES31.glTransformFeedbackVaryings(programHandle, feedbackVaryings, GLES31.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 |
GLES30.glBindAttribLocation(programHandle, i, attributes[i]);
|
|
75 |
GLES31.glBindAttribLocation(programHandle, i, attributes[i]);
|
|
76 | 76 |
} |
77 | 77 |
} |
78 | 78 |
|
79 |
GLES30.glLinkProgram(programHandle);
|
|
79 |
GLES31.glLinkProgram(programHandle);
|
|
80 | 80 |
|
81 | 81 |
final int[] linkStatus = new int[1]; |
82 |
GLES30.glGetProgramiv(programHandle, GLES30.GL_LINK_STATUS, linkStatus, 0);
|
|
82 |
GLES31.glGetProgramiv(programHandle, GLES31.GL_LINK_STATUS, linkStatus, 0);
|
|
83 | 83 |
|
84 |
if (linkStatus[0] != GLES30.GL_TRUE )
|
|
84 |
if (linkStatus[0] != GLES31.GL_TRUE )
|
|
85 | 85 |
{ |
86 |
String error = GLES30.glGetProgramInfoLog(programHandle);
|
|
87 |
GLES30.glDeleteProgram(programHandle);
|
|
86 |
String error = GLES31.glGetProgramInfoLog(programHandle);
|
|
87 |
GLES31.glDeleteProgram(programHandle);
|
|
88 | 88 |
throw new LinkingException(error); |
89 | 89 |
} |
90 | 90 |
|
91 | 91 |
final int[] numberOfUniforms = new int[1]; |
92 |
GLES30.glGetProgramiv(programHandle, GLES30.GL_ACTIVE_UNIFORMS, numberOfUniforms, 0);
|
|
92 |
GLES31.glGetProgramiv(programHandle, GLES31.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 = GLES30.glCreateShader(shaderType);
|
|
286 |
int shaderHandle = GLES31.glCreateShader(shaderType);
|
|
287 | 287 |
|
288 | 288 |
if (shaderHandle != 0) |
289 | 289 |
{ |
290 |
GLES30.glShaderSource(shaderHandle, shaderSource);
|
|
291 |
GLES30.glCompileShader(shaderHandle);
|
|
290 |
GLES31.glShaderSource(shaderHandle, shaderSource);
|
|
291 |
GLES31.glCompileShader(shaderHandle);
|
|
292 | 292 |
final int[] compileStatus = new int[1]; |
293 |
GLES30.glGetShaderiv(shaderHandle, GLES30.GL_COMPILE_STATUS, compileStatus, 0);
|
|
293 |
GLES31.glGetShaderiv(shaderHandle, GLES31.GL_COMPILE_STATUS, compileStatus, 0);
|
|
294 | 294 |
|
295 |
if (compileStatus[0] != GLES30.GL_TRUE )
|
|
295 |
if (compileStatus[0] != GLES31.GL_TRUE )
|
|
296 | 296 |
{ |
297 |
GLES30.glDeleteShader(shaderHandle);
|
|
297 |
GLES31.glDeleteShader(shaderHandle);
|
|
298 | 298 |
shaderHandle = 0; |
299 | 299 |
} |
300 | 300 |
} |
301 | 301 |
|
302 | 302 |
if (shaderHandle == 0) |
303 | 303 |
{ |
304 |
String error = GLES30.glGetShaderInfoLog(shaderHandle);
|
|
304 |
String error = GLES31.glGetShaderInfoLog(shaderHandle);
|
|
305 | 305 |
|
306 | 306 |
//android.util.Log.e("Program", "error compiling :"+error); |
307 | 307 |
|
308 | 308 |
switch(shaderType) |
309 | 309 |
{ |
310 |
case GLES30.GL_VERTEX_SHADER : throw new VertexCompilationException(error);
|
|
311 |
case GLES30.GL_FRAGMENT_SHADER: throw new FragmentCompilationException(error);
|
|
310 |
case GLES31.GL_VERTEX_SHADER : throw new VertexCompilationException(error);
|
|
311 |
case GLES31.GL_FRAGMENT_SHADER: throw new FragmentCompilationException(error);
|
|
312 | 312 |
default : throw new RuntimeException(error); |
313 | 313 |
} |
314 | 314 |
} |
... | ... | |
360 | 360 |
final String vertexShader = readTextFileFromRawResource(vertex , true ); |
361 | 361 |
final String fragmentShader = readTextFileFromRawResource(fragment, false); |
362 | 362 |
|
363 |
final int vertexShaderHandle = compileShader(GLES30.GL_VERTEX_SHADER , vertexHeader + vertexShader );
|
|
364 |
final int fragmentShaderHandle = compileShader(GLES30.GL_FRAGMENT_SHADER, fragmentHeader + fragmentShader);
|
|
363 |
final int vertexShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertexHeader + vertexShader );
|
|
364 |
final int fragmentShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragmentHeader + fragmentShader);
|
|
365 | 365 |
|
366 | 366 |
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null ); |
367 | 367 |
|
... | ... | |
369 | 369 |
|
370 | 370 |
for(int i=0; i<mNumAttributes; i++) |
371 | 371 |
{ |
372 |
mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
372 |
mAttribute[i] = GLES31.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
373 | 373 |
} |
374 | 374 |
|
375 | 375 |
if( mNumUniforms>0 ) |
... | ... | |
379 | 379 |
|
380 | 380 |
for(int i=0; i<mNumUniforms; i++) |
381 | 381 |
{ |
382 |
mUniform[i] = GLES30.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
382 |
mUniform[i] = GLES31.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
383 | 383 |
} |
384 | 384 |
} |
385 | 385 |
else mUniform = null; |
... | ... | |
403 | 403 |
vertexShader = insertEnabledEffects(vertexShader ,enabledVertex ); |
404 | 404 |
fragmentShader = insertEnabledEffects(fragmentShader,enabledFragment); |
405 | 405 |
|
406 |
final int vertexShaderHandle = compileShader(GLES30.GL_VERTEX_SHADER , vertexHeader + vertexShader );
|
|
407 |
final int fragmentShaderHandle = compileShader(GLES30.GL_FRAGMENT_SHADER, fragmentHeader + fragmentShader);
|
|
406 |
final int vertexShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertexHeader + vertexShader );
|
|
407 |
final int fragmentShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragmentHeader + fragmentShader);
|
|
408 | 408 |
|
409 | 409 |
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null ); |
410 | 410 |
|
... | ... | |
412 | 412 |
|
413 | 413 |
for(int i=0; i<mNumAttributes; i++) |
414 | 414 |
{ |
415 |
mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
415 |
mAttribute[i] = GLES31.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
416 | 416 |
} |
417 | 417 |
|
418 | 418 |
if( mNumUniforms>0 ) |
... | ... | |
422 | 422 |
|
423 | 423 |
for(int i=0; i<mNumUniforms; i++) |
424 | 424 |
{ |
425 |
mUniform[i] = GLES30.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
425 |
mUniform[i] = GLES31.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
426 | 426 |
} |
427 | 427 |
} |
428 | 428 |
else mUniform = null; |
... | ... | |
465 | 465 |
doAttributes(vertex , true ); |
466 | 466 |
doAttributes(fragment, false); |
467 | 467 |
|
468 |
final int vertexShaderHandle = compileShader(GLES30.GL_VERTEX_SHADER , vertex );
|
|
469 |
final int fragmentShaderHandle = compileShader(GLES30.GL_FRAGMENT_SHADER, fragment);
|
|
468 |
final int vertexShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertex );
|
|
469 |
final int fragmentShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragment);
|
|
470 | 470 |
|
471 | 471 |
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, mAttributeName, null ); |
472 | 472 |
|
... | ... | |
474 | 474 |
|
475 | 475 |
for(int i=0; i<mNumAttributes; i++) |
476 | 476 |
{ |
477 |
mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
477 |
mAttribute[i] = GLES31.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
|
|
478 | 478 |
} |
479 | 479 |
|
480 | 480 |
if( mNumUniforms>0 ) |
... | ... | |
484 | 484 |
|
485 | 485 |
for(int i=0; i<mNumUniforms; i++) |
486 | 486 |
{ |
487 |
mUniform[i] = GLES30.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
487 |
mUniform[i] = GLES31.glGetUniformLocation( mProgramHandle, mUniformName[i]);
|
|
488 | 488 |
} |
489 | 489 |
} |
490 | 490 |
else mUniform = null; |
... | ... | |
507 | 507 |
*/ |
508 | 508 |
public void useProgram() |
509 | 509 |
{ |
510 |
GLES30.glUseProgram(mProgramHandle);
|
|
510 |
GLES31.glUseProgram(mProgramHandle);
|
|
511 | 511 |
|
512 | 512 |
for(int i=0; i<mNumAttributes; i++) |
513 |
GLES30.glEnableVertexAttribArray(mAttribute[i]);
|
|
513 |
GLES31.glEnableVertexAttribArray(mAttribute[i]);
|
|
514 | 514 |
} |
515 | 515 |
} |
516 | 516 |
|
Also available in: Unified diff
Up library requirements to OpenGL ES 3.1 (needed for the upcoming GL_SHADER_STORAGE_BUFFER)