Revision 2b7d2abb
Added by Leszek Koltunski almost 5 years ago
| src/main/java/org/distorted/library/effect/EffectType.java | ||
|---|---|---|
| 75 | 75 |
// EffectQueueMatrix at any given time. This can be changed with a call |
| 76 | 76 |
// to EffectQueueMatrix.setMax(int) |
| 77 | 77 |
maxtable[1] =100; // Max 100 VERTEX Effects |
| 78 |
maxtable[2] =100; // Max 100 FRAGMENT Effects
|
|
| 78 |
maxtable[2] = 5; // Max 5 FRAGMENT Effects
|
|
| 79 | 79 |
maxtable[3] = 3; // Max 3 POSTPROCESSING Effects |
| 80 | 80 |
} |
| 81 | 81 |
|
| src/main/java/org/distorted/library/effectqueue/EffectQueue.java | ||
|---|---|---|
| 43 | 43 |
|
| 44 | 44 |
static final int VERT_INT_UBO_BINDING = 5; |
| 45 | 45 |
static final int VERT_FLO_UBO_BINDING = 6; |
| 46 |
static final int FRAG_INT_UBO_BINDING = 7; |
|
| 47 |
static final int FRAG_FLO_UBO_BINDING = 8; |
|
| 48 | 46 |
|
| 49 | 47 |
private static final int CREATE = 0; |
| 50 | 48 |
private static final int ATTACH = 1; |
| ... | ... | |
| 67 | 65 |
{
|
| 68 | 66 |
int type; |
| 69 | 67 |
int num1, num2; |
| 70 |
boolean notify;
|
|
| 68 |
boolean bool;
|
|
| 71 | 69 |
Effect effect; |
| 72 | 70 |
|
| 73 | 71 |
Job(int t, int m1, int m2, boolean n, Effect e) |
| ... | ... | |
| 75 | 73 |
type = t; |
| 76 | 74 |
num1 = m1; |
| 77 | 75 |
num2 = m2; |
| 78 |
notify= n;
|
|
| 76 |
bool = n;
|
|
| 79 | 77 |
effect= e; |
| 80 | 78 |
} |
| 81 | 79 |
} |
| ... | ... | |
| 84 | 82 |
|
| 85 | 83 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 86 | 84 |
|
| 87 |
EffectQueue(int numFloatUniforms, int numIntUniforms, int index) |
|
| 85 |
EffectQueue(int numFloatUniforms, int numIntUniforms, boolean useUBO, int index)
|
|
| 88 | 86 |
{
|
| 89 | 87 |
mCreated = false; |
| 90 | 88 |
mTime = 0; |
| ... | ... | |
| 95 | 93 |
|
| 96 | 94 |
mJobs = new ArrayList<>(); |
| 97 | 95 |
|
| 98 |
mJobs.add(new Job(CREATE,numFloatUniforms,numIntUniforms, false,null)); // create the stuff that depends on max number
|
|
| 96 |
mJobs.add(new Job(CREATE,numFloatUniforms,numIntUniforms,useUBO,null)); // create the stuff that depends on max number
|
|
| 99 | 97 |
InternalMaster.newSlave(this); // of uniforms later, on first render. |
| 100 | 98 |
} |
| 101 | 99 |
|
| ... | ... | |
| 442 | 440 |
if( max>0 ) |
| 443 | 441 |
{
|
| 444 | 442 |
mEffects= new Effect[max]; |
| 445 |
mUBF = new UniformBlockFloatUniforms(job.num1, max); |
|
| 446 |
mUBI = new UniformBlockIntUniforms (job.num2, max); |
|
| 443 |
mUBF = new UniformBlockFloatUniforms(job.num1, max, job.bool);
|
|
| 444 |
mUBI = new UniformBlockIntUniforms (job.num2, max, job.bool);
|
|
| 447 | 445 |
} |
| 448 | 446 |
mCreated = true; |
| 449 | 447 |
|
| ... | ... | |
| 488 | 486 |
mEffects[j] = null; |
| 489 | 487 |
} |
| 490 | 488 |
|
| 489 |
// TODO: notify listeners? |
|
| 490 |
/* if( job.bool ) |
|
| 491 |
{
|
|
| 492 |
// ... |
|
| 493 |
} |
|
| 494 |
*/ |
|
| 495 |
|
|
| 491 | 496 |
mNumEffects= 0; |
| 492 | 497 |
break; |
| 493 | 498 |
} |
| src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java | ||
|---|---|---|
| 31 | 31 |
{
|
| 32 | 32 |
private static final int NUM_FLOAT_UNIFORMS = FragmentEffect.NUM_FLOAT_UNIFORMS; |
| 33 | 33 |
private static final int NUM_INT_UNIFORMS = FragmentEffect.NUM_INT_UNIFORMS; |
| 34 |
|
|
| 34 |
private static final boolean USE_UBO = false; |
|
| 35 | 35 |
private static final int INDEX = EffectType.FRAGMENT.ordinal(); |
| 36 | 36 |
|
| 37 | 37 |
private final static int[] mNumEffectsH = new int[MAIN_VARIANTS]; |
| 38 |
private final static int[] mIntBlockIndex= new int[MAIN_VARIANTS];
|
|
| 39 |
private final static int[] mFloBlockIndex= new int[MAIN_VARIANTS];
|
|
| 38 |
private final static int[] mIntUniformsH = new int[MAIN_VARIANTS];
|
|
| 39 |
private final static int[] mFloUniformsH = new int[MAIN_VARIANTS];
|
|
| 40 | 40 |
|
| 41 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 42 | 42 |
|
| 43 | 43 |
EffectQueueFragment() |
| 44 | 44 |
{
|
| 45 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX); |
|
| 45 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, USE_UBO, INDEX);
|
|
| 46 | 46 |
} |
| 47 | 47 |
|
| 48 | 48 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 57 | 57 |
static void uniforms(int mProgramH, int variant) |
| 58 | 58 |
{
|
| 59 | 59 |
mNumEffectsH[variant] = GLES30.glGetUniformLocation ( mProgramH, "fNumEffects"); |
| 60 |
mIntBlockIndex[variant] = GLES30.glGetUniformBlockIndex( mProgramH, "fUniformProperties");
|
|
| 61 |
mFloBlockIndex[variant] = GLES30.glGetUniformBlockIndex( mProgramH, "fUniformFloats");
|
|
| 60 |
mIntUniformsH[variant] = GLES30.glGetUniformLocation ( mProgramH, "fProperties");
|
|
| 61 |
mFloUniformsH[variant] = GLES30.glGetUniformLocation ( mProgramH, "fUniforms");
|
|
| 62 | 62 |
} |
| 63 | 63 |
|
| 64 | 64 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 80 | 80 |
EffectMessageSender.newMessage(mEffects[i]); |
| 81 | 81 |
} |
| 82 | 82 |
} |
| 83 |
|
|
| 84 |
mUBF.invalidate(); |
|
| 85 | 83 |
} |
| 86 | 84 |
|
| 87 | 85 |
mTime = currTime; |
| ... | ... | |
| 95 | 93 |
|
| 96 | 94 |
if( mNumEffects>0 ) |
| 97 | 95 |
{
|
| 98 |
GLES30.glBindBufferBase(GLES30.GL_UNIFORM_BUFFER, FRAG_INT_UBO_BINDING, mUBI.getIndex());
|
|
| 99 |
GLES30.glUniformBlockBinding(programH, mIntBlockIndex[variant], FRAG_INT_UBO_BINDING);
|
|
| 96 |
int[] arrayI = mUBI.getBackingArray();
|
|
| 97 |
float[] arrayF = mUBF.getBackingArray();
|
|
| 100 | 98 |
|
| 101 |
GLES30.glBindBufferBase(GLES30.GL_UNIFORM_BUFFER, FRAG_FLO_UBO_BINDING, mUBF.getIndex());
|
|
| 102 |
GLES30.glUniformBlockBinding(programH, mFloBlockIndex[variant], FRAG_FLO_UBO_BINDING);
|
|
| 99 |
GLES30.glUniform4iv( mIntUniformsH[variant], mNumEffects, arrayI, 0);
|
|
| 100 |
GLES30.glUniform4fv( mFloUniformsH[variant],(NUM_FLOAT_UNIFORMS/4)*mNumEffects, arrayF, 0);
|
|
| 103 | 101 |
} |
| 104 | 102 |
} |
| 105 | 103 |
} |
| src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java | ||
|---|---|---|
| 32 | 32 |
{
|
| 33 | 33 |
private static final int NUM_FLOAT_UNIFORMS = MatrixEffect.NUM_FLOAT_UNIFORMS; |
| 34 | 34 |
private static final int NUM_INT_UNIFORMS = MatrixEffect.NUM_INT_UNIFORMS; |
| 35 |
|
|
| 35 |
private static final boolean USE_UBO = false; |
|
| 36 | 36 |
private static final int INDEX = EffectType.MATRIX.ordinal(); |
| 37 | 37 |
|
| 38 | 38 |
private static final float[] mMVPMatrix = new float[16]; |
| ... | ... | |
| 47 | 47 |
|
| 48 | 48 |
EffectQueueMatrix() |
| 49 | 49 |
{
|
| 50 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX); |
|
| 50 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, USE_UBO, INDEX);
|
|
| 51 | 51 |
} |
| 52 | 52 |
|
| 53 | 53 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java | ||
|---|---|---|
| 49 | 49 |
{
|
| 50 | 50 |
private static final int NUM_FLOAT_UNIFORMS = PostprocessEffect.NUM_FLOAT_UNIFORMS; |
| 51 | 51 |
private static final int NUM_INT_UNIFORMS = PostprocessEffect.NUM_INT_UNIFORMS; |
| 52 |
|
|
| 52 |
private static final boolean USE_UBO = false; |
|
| 53 | 53 |
private static final int INDEX = EffectType.POSTPROCESS.ordinal(); |
| 54 | 54 |
|
| 55 | 55 |
private int mHalo; |
| ... | ... | |
| 64 | 64 |
|
| 65 | 65 |
EffectQueuePostprocess() |
| 66 | 66 |
{
|
| 67 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX ); |
|
| 67 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, USE_UBO, INDEX );
|
|
| 68 | 68 |
} |
| 69 | 69 |
|
| 70 | 70 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java | ||
|---|---|---|
| 35 | 35 |
{
|
| 36 | 36 |
private static final int NUM_FLOAT_UNIFORMS = VertexEffect.NUM_FLOAT_UNIFORMS; |
| 37 | 37 |
private static final int NUM_INT_UNIFORMS = VertexEffect.NUM_INT_UNIFORMS; |
| 38 |
private static final boolean USE_UBO = true; |
|
| 38 | 39 |
|
| 39 | 40 |
private static final int INDEX = EffectType.VERTEX.ordinal(); |
| 40 | 41 |
|
| ... | ... | |
| 47 | 48 |
|
| 48 | 49 |
public EffectQueueVertex() |
| 49 | 50 |
{
|
| 50 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX); |
|
| 51 |
super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, USE_UBO, INDEX);
|
|
| 51 | 52 |
} |
| 52 | 53 |
|
| 53 | 54 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/uniformblock/UniformBlockFloatUniforms.java | ||
|---|---|---|
| 32 | 32 |
*/ |
| 33 | 33 |
public class UniformBlockFloatUniforms |
| 34 | 34 |
{
|
| 35 |
private final InternalBuffer mUBO;
|
|
| 35 |
private InternalBuffer mUBO; |
|
| 36 | 36 |
private final float[] mArray; |
| 37 | 37 |
private final int mNumUniforms, mSize; |
| 38 |
private final boolean mReallyUseUBO; |
|
| 38 | 39 |
|
| 39 | 40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 40 | 41 |
|
| 41 |
public UniformBlockFloatUniforms(int numUniforms, int size) |
|
| 42 |
public UniformBlockFloatUniforms(int numUniforms, int size, boolean reallyUse)
|
|
| 42 | 43 |
{
|
| 43 | 44 |
mNumUniforms = numUniforms; |
| 44 | 45 |
mSize = size; |
| 45 | 46 |
mArray= new float[mNumUniforms*mSize]; |
| 46 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 47 |
mReallyUseUBO= reallyUse; |
|
| 48 |
|
|
| 49 |
if( mReallyUseUBO ) |
|
| 50 |
{
|
|
| 51 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 52 |
} |
|
| 47 | 53 |
} |
| 48 | 54 |
|
| 49 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 53 | 59 |
mNumUniforms = original.mNumUniforms; |
| 54 | 60 |
mSize = original.mSize; |
| 55 | 61 |
mArray= new float[mNumUniforms*mSize]; |
| 62 |
mReallyUseUBO= original.mReallyUseUBO; |
|
| 63 |
|
|
| 56 | 64 |
System.arraycopy(original.mArray, 0, mArray, 0, 3*mSize); |
| 57 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 65 |
|
|
| 66 |
if( mReallyUseUBO ) |
|
| 67 |
{
|
|
| 68 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 69 |
} |
|
| 58 | 70 |
} |
| 59 | 71 |
|
| 60 | 72 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 69 | 81 |
public void remove(int pos, int numEffects) |
| 70 | 82 |
{
|
| 71 | 83 |
System.arraycopy(mArray, mNumUniforms*(pos+1), mArray, mNumUniforms*pos, mNumUniforms*(numEffects-pos) ); |
| 72 |
mUBO.invalidate(); |
|
| 84 |
|
|
| 85 |
if( mReallyUseUBO ) |
|
| 86 |
{
|
|
| 87 |
mUBO.invalidate(); |
|
| 88 |
} |
|
| 73 | 89 |
} |
| 74 | 90 |
|
| 75 | 91 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 76 | 92 |
|
| 77 | 93 |
public void markForDeletion() |
| 78 | 94 |
{
|
| 79 |
mUBO.markForDeletion(); |
|
| 95 |
if( mReallyUseUBO ) |
|
| 96 |
{
|
|
| 97 |
mUBO.markForDeletion(); |
|
| 98 |
} |
|
| 80 | 99 |
} |
| 81 | 100 |
|
| 82 | 101 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 83 | 102 |
|
| 84 | 103 |
public void invalidate() |
| 85 | 104 |
{
|
| 86 |
mUBO.invalidate(); |
|
| 105 |
if( mReallyUseUBO ) |
|
| 106 |
{
|
|
| 107 |
mUBO.invalidate(); |
|
| 108 |
} |
|
| 87 | 109 |
} |
| 88 | 110 |
|
| 89 | 111 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 99 | 121 |
{
|
| 100 | 122 |
StringBuilder builder = new StringBuilder(); |
| 101 | 123 |
|
| 102 |
builder.append(mUBO.getID());
|
|
| 124 |
builder.append( mReallyUseUBO ? mUBO.getID() : "NOT USED");
|
|
| 103 | 125 |
builder.append(':');
|
| 104 | 126 |
|
| 105 | 127 |
for(int i=0; i<6; i++) |
| src/main/java/org/distorted/library/uniformblock/UniformBlockIntUniforms.java | ||
|---|---|---|
| 32 | 32 |
*/ |
| 33 | 33 |
public class UniformBlockIntUniforms |
| 34 | 34 |
{
|
| 35 |
private final InternalBuffer mUBO;
|
|
| 35 |
private InternalBuffer mUBO; |
|
| 36 | 36 |
private final int[] mArray; |
| 37 | 37 |
private final int mNumUniforms, mSize; |
| 38 |
private final boolean mReallyUseUBO; |
|
| 38 | 39 |
|
| 39 | 40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 40 | 41 |
|
| 41 |
public UniformBlockIntUniforms(int numUniforms, int size) |
|
| 42 |
public UniformBlockIntUniforms(int numUniforms, int size, boolean reallyUse)
|
|
| 42 | 43 |
{
|
| 43 | 44 |
mNumUniforms = numUniforms; |
| 44 | 45 |
mSize = size; |
| 45 | 46 |
mArray= new int[mNumUniforms*mSize]; |
| 46 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 47 |
mReallyUseUBO= reallyUse; |
|
| 48 |
|
|
| 49 |
if( mReallyUseUBO ) |
|
| 50 |
{
|
|
| 51 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 52 |
} |
|
| 47 | 53 |
} |
| 48 | 54 |
|
| 49 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 53 | 59 |
mNumUniforms = original.mNumUniforms; |
| 54 | 60 |
mSize = original.mSize; |
| 55 | 61 |
mArray= new int[mNumUniforms*mSize]; |
| 62 |
mReallyUseUBO= original.mReallyUseUBO; |
|
| 63 |
|
|
| 56 | 64 |
System.arraycopy(original.mArray, 0, mArray, 0, mSize); |
| 57 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 65 |
|
|
| 66 |
if( mReallyUseUBO ) |
|
| 67 |
{
|
|
| 68 |
mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_READ); |
|
| 69 |
} |
|
| 58 | 70 |
} |
| 59 | 71 |
|
| 60 | 72 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 69 | 81 |
public void remove(int pos, int numEffects) |
| 70 | 82 |
{
|
| 71 | 83 |
System.arraycopy(mArray, mNumUniforms*(pos+1), mArray, mNumUniforms*pos, mNumUniforms*(numEffects-pos) ); |
| 72 |
mUBO.invalidate(); |
|
| 84 |
|
|
| 85 |
if( mReallyUseUBO ) |
|
| 86 |
{
|
|
| 87 |
mUBO.invalidate(); |
|
| 88 |
} |
|
| 73 | 89 |
} |
| 74 | 90 |
|
| 75 | 91 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 77 | 93 |
public void makeHole(int pos, int numEffects) |
| 78 | 94 |
{
|
| 79 | 95 |
System.arraycopy(mArray, mNumUniforms*pos, mArray, mNumUniforms*(pos+1), mNumUniforms*(numEffects-pos) ); |
| 80 |
mUBO.invalidate(); |
|
| 96 |
|
|
| 97 |
if( mReallyUseUBO ) |
|
| 98 |
{
|
|
| 99 |
mUBO.invalidate(); |
|
| 100 |
} |
|
| 81 | 101 |
} |
| 82 | 102 |
|
| 83 | 103 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 85 | 105 |
public void addOrdinal(int pos, int ordinal) |
| 86 | 106 |
{
|
| 87 | 107 |
mArray[mNumUniforms*pos] = ordinal; |
| 88 |
mUBO.invalidate(); |
|
| 108 |
|
|
| 109 |
if( mReallyUseUBO ) |
|
| 110 |
{
|
|
| 111 |
mUBO.invalidate(); |
|
| 112 |
} |
|
| 89 | 113 |
} |
| 90 | 114 |
|
| 91 | 115 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 93 | 117 |
public void addAssociations(int pos, Effect effect) |
| 94 | 118 |
{
|
| 95 | 119 |
effect.writeAssociations(mArray, mNumUniforms*pos+1, mNumUniforms*pos+3); |
| 96 |
mUBO.invalidate(); |
|
| 120 |
|
|
| 121 |
if( mReallyUseUBO ) |
|
| 122 |
{
|
|
| 123 |
mUBO.invalidate(); |
|
| 124 |
} |
|
| 97 | 125 |
} |
| 98 | 126 |
|
| 99 | 127 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 100 | 128 |
|
| 101 | 129 |
public void markForDeletion() |
| 102 | 130 |
{
|
| 103 |
mUBO.markForDeletion(); |
|
| 131 |
if( mReallyUseUBO ) |
|
| 132 |
{
|
|
| 133 |
mUBO.markForDeletion(); |
|
| 134 |
} |
|
| 135 |
} |
|
| 136 |
|
|
| 137 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 138 |
|
|
| 139 |
public int[] getBackingArray() |
|
| 140 |
{
|
|
| 141 |
return mArray; |
|
| 104 | 142 |
} |
| 105 | 143 |
|
| 106 | 144 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 109 | 147 |
{
|
| 110 | 148 |
StringBuilder builder = new StringBuilder(); |
| 111 | 149 |
|
| 112 |
builder.append(mUBO.getID());
|
|
| 150 |
builder.append( mReallyUseUBO ? mUBO.getID() : "NOT USED");
|
|
| 113 | 151 |
builder.append(':');
|
| 114 | 152 |
|
| 115 | 153 |
for(int i=0; i<6; i++) |
| src/main/res/raw/main_fragment_shader.glsl | ||
|---|---|---|
| 47 | 47 |
#if NUM_FRAGMENT>0 |
| 48 | 48 |
uniform int fNumEffects; // total number of fragment effects |
| 49 | 49 |
|
| 50 |
layout (std140) uniform fUniformProperties |
|
| 51 |
{
|
|
| 52 |
ivec4 fProperties[NUM_FRAGMENT]; // their properties, 4 ints: |
|
| 50 |
uniform ivec4 fProperties[NUM_FRAGMENT]; // their properties, 4 ints: |
|
| 53 | 51 |
// name of the effect, unused, unused, unused |
| 54 |
}; |
|
| 55 | 52 |
|
| 56 |
layout (std140) uniform fUniformFloats |
|
| 57 |
{
|
|
| 58 |
vec4 fUniforms[3*NUM_FRAGMENT]; // i-th effect is 3 consecutive vec4's: [3*i], [3*i+1], [3*i+2]. |
|
| 53 |
uniform vec4 fUniforms[3*NUM_FRAGMENT]; // i-th effect is 3 consecutive vec4's: [3*i], [3*i+1], [3*i+2]. |
|
| 59 | 54 |
// The first vec4 is the Interpolated values, |
| 60 | 55 |
// second vec4: first float - cache, next 3: Center, the third - the Region. |
| 61 |
}; |
|
| 62 | 56 |
|
| 63 | 57 |
#endif // NUM_FRAGMENT>0 |
| 64 | 58 |
|
Also available in: Unified diff
Remove UBO from the fragment shader and come back to the default of only 5 concurrent fragment effects. All because UBOs in fragment shader crash on Adreno 510 and Adreno 506.