Revision 86c352e0
Added by Leszek Koltunski over 7 years ago
| src/main/java/org/distorted/library/main/Distorted.java | ||
|---|---|---|
| 88 | 88 |
* https://community.arm.com/graphics/f/discussions/10285/opengl-es-3-1-on-mali-t880-flashes |
| 89 | 89 |
*/ |
| 90 | 90 |
public static final int FBO_QUEUE_SIZE = 4; |
| 91 |
/** |
|
| 92 |
* Number of Main program variants (ATM 2: main and main OIT) |
|
| 93 |
*/ |
|
| 94 |
public static final int MAIN_VARIANTS = 2; |
|
| 91 | 95 |
|
| 92 | 96 |
private static boolean mInitialized=false; |
| 93 | 97 |
|
| src/main/java/org/distorted/library/main/DistortedEffects.java | ||
|---|---|---|
| 169 | 169 |
} |
| 170 | 170 |
|
| 171 | 171 |
int mainProgramH = mMainProgram.getProgramHandle(); |
| 172 |
EffectQueueFragment.getUniforms(mainProgramH); |
|
| 173 |
EffectQueueVertex.getUniforms(mainProgramH); |
|
| 174 |
EffectQueueMatrix.getUniforms(mainProgramH); |
|
| 172 |
EffectQueueFragment.getUniforms(mainProgramH,0);
|
|
| 173 |
EffectQueueVertex.getUniforms(mainProgramH,0);
|
|
| 174 |
EffectQueueMatrix.getUniforms(mainProgramH,0);
|
|
| 175 | 175 |
mMainTextureH= GLES31.glGetUniformLocation( mainProgramH, "u_Texture"); |
| 176 | 176 |
|
| 177 | 177 |
// BLIT PROGRAM //////////////////////////////////// |
| ... | ... | |
| 254 | 254 |
try |
| 255 | 255 |
{
|
| 256 | 256 |
mMainOITProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader, |
| 257 |
enabledEffectV, enabledEffectF, Distorted.GLSL, null); |
|
| 257 |
enabledEffectV, enabledEffectF, Distorted.GLSL, null);
|
|
| 258 | 258 |
} |
| 259 | 259 |
catch(Exception e) |
| 260 | 260 |
{
|
| ... | ... | |
| 263 | 263 |
} |
| 264 | 264 |
|
| 265 | 265 |
int mainOITProgramH = mMainOITProgram.getProgramHandle(); |
| 266 |
EffectQueueFragment.getUniformsOIT(mainOITProgramH);
|
|
| 267 |
EffectQueueVertex.getUniformsOIT(mainOITProgramH);
|
|
| 268 |
EffectQueueMatrix.getUniformsOIT(mainOITProgramH);
|
|
| 266 |
EffectQueueFragment.getUniforms(mainOITProgramH,1);
|
|
| 267 |
EffectQueueVertex.getUniforms(mainOITProgramH,1);
|
|
| 268 |
EffectQueueMatrix.getUniforms(mainOITProgramH,1);
|
|
| 269 | 269 |
mMainOITTextureH = GLES31.glGetUniformLocation( mainOITProgramH, "u_Texture"); |
| 270 | 270 |
mMainOITSizeH = GLES31.glGetUniformLocation( mainOITProgramH, "u_Size"); |
| 271 | 271 |
mMainOITNumRecordsH = GLES31.glGetUniformLocation( mainOITProgramH, "u_numRecords"); |
| ... | ... | |
| 480 | 480 |
GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
| 481 | 481 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
| 482 | 482 |
|
| 483 |
mM.sendOIT(surface,halfW,halfH,halfZ,marginInPixels);
|
|
| 484 |
mV.sendOIT();
|
|
| 485 |
mF.sendOIT();
|
|
| 483 |
mM.send(surface,halfW,halfH,halfZ,marginInPixels,1);
|
|
| 484 |
mV.send(1);
|
|
| 485 |
mF.send(1);
|
|
| 486 | 486 |
|
| 487 | 487 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.numVertices); |
| 488 | 488 |
|
| ... | ... | |
| 511 | 511 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
| 512 | 512 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
| 513 | 513 |
|
| 514 |
mM.send(surface,halfW,halfH,halfZ,marginInPixels); |
|
| 515 |
mV.send(); |
|
| 516 |
mF.send(); |
|
| 514 |
mM.send(surface,halfW,halfH,halfZ,marginInPixels,0);
|
|
| 515 |
mV.send(0);
|
|
| 516 |
mF.send(0);
|
|
| 517 | 517 |
|
| 518 | 518 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.numVertices); |
| 519 | 519 |
|
| src/main/java/org/distorted/library/main/DistortedOutputSurface.java | ||
|---|---|---|
| 388 | 388 |
// Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing |
| 389 | 389 |
// to a whole buffer (lastQueue.postprocess) and merge it (this.oitBuild). |
| 390 | 390 |
|
| 391 |
/* |
|
| 392 |
int renderChildren1(long time, int numChildren, ArrayList<DistortedNode> children, int fbo, boolean oit) |
|
| 393 |
{
|
|
| 394 |
oitClear(this); |
|
| 395 |
setAsOutputFBO(time,fbo); |
|
| 396 |
mChildren.get(0).drawOIT(time, this); |
|
| 397 |
GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT); |
|
| 398 |
oitRender(time, fbo); |
|
| 399 |
|
|
| 400 |
return 0; |
|
| 401 |
} |
|
| 402 |
*/ |
|
| 403 |
|
|
| 391 | 404 |
int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo, boolean oit) |
| 392 | 405 |
{
|
| 393 | 406 |
int quality=0, internalQuality = 0, numRenders = 0, bucketChange = 0; |
| src/main/java/org/distorted/library/main/EffectQueueFragment.java | ||
|---|---|---|
| 32 | 32 |
private static final int NUM_UNIFORMS = FragmentEffect.NUM_UNIFORMS; |
| 33 | 33 |
private static final int INDEX = EffectType.FRAGMENT.ordinal(); |
| 34 | 34 |
|
| 35 |
private static int mNumEffectsH; |
|
| 36 |
private static int mNameH; |
|
| 37 |
private static int mUniformsH; |
|
| 38 |
|
|
| 39 |
private static int mNumEffectsOITH; |
|
| 40 |
private static int mNameOITH; |
|
| 41 |
private static int mUniformsOITH; |
|
| 35 |
private static int[] mNumEffectsH = new int[Distorted.MAIN_VARIANTS]; |
|
| 36 |
private static int[] mNameH = new int[Distorted.MAIN_VARIANTS]; |
|
| 37 |
private static int[] mUniformsH = new int[Distorted.MAIN_VARIANTS]; |
|
| 42 | 38 |
|
| 43 | 39 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 44 | 40 |
|
| ... | ... | |
| 49 | 45 |
|
| 50 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 51 | 47 |
|
| 52 |
static void getUniforms(int mProgramH) |
|
| 53 |
{
|
|
| 54 |
mNumEffectsH= GLES31.glGetUniformLocation( mProgramH, "fNumEffects"); |
|
| 55 |
mNameH = GLES31.glGetUniformLocation( mProgramH, "fName"); |
|
| 56 |
mUniformsH = GLES31.glGetUniformLocation( mProgramH, "fUniforms"); |
|
| 57 |
} |
|
| 58 |
|
|
| 59 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 60 |
|
|
| 61 |
static void getUniformsOIT(int mProgramH) |
|
| 48 |
static void getUniforms(int mProgramH, int variant) |
|
| 62 | 49 |
{
|
| 63 |
mNumEffectsOITH= GLES31.glGetUniformLocation( mProgramH, "fNumEffects");
|
|
| 64 |
mNameOITH = GLES31.glGetUniformLocation( mProgramH, "fName");
|
|
| 65 |
mUniformsOITH = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
|
|
| 50 |
mNumEffectsH[variant]= GLES31.glGetUniformLocation( mProgramH, "fNumEffects");
|
|
| 51 |
mNameH[variant] = GLES31.glGetUniformLocation( mProgramH, "fName");
|
|
| 52 |
mUniformsH[variant] = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
|
|
| 66 | 53 |
} |
| 67 | 54 |
|
| 68 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 99 | 86 |
|
| 100 | 87 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 101 | 88 |
|
| 102 |
void send() |
|
| 89 |
void send(int variant)
|
|
| 103 | 90 |
{
|
| 104 |
GLES31.glUniform1i( mNumEffectsH, mNumEffects); |
|
| 91 |
GLES31.glUniform1i( mNumEffectsH[variant], mNumEffects);
|
|
| 105 | 92 |
|
| 106 | 93 |
if( mNumEffects>0 ) |
| 107 | 94 |
{
|
| 108 |
GLES31.glUniform1iv( mNameH , mNumEffects, mName ,0); |
|
| 109 |
GLES31.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0); |
|
| 95 |
GLES31.glUniform1iv( mNameH[variant] , mNumEffects, mName ,0);
|
|
| 96 |
GLES31.glUniform4fv( mUniformsH[variant],(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
|
|
| 110 | 97 |
} |
| 111 | 98 |
} |
| 112 |
|
|
| 113 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 114 |
|
|
| 115 |
void sendOIT() |
|
| 116 |
{
|
|
| 117 |
GLES31.glUniform1i( mNumEffectsOITH, mNumEffects); |
|
| 118 |
|
|
| 119 |
if( mNumEffects>0 ) |
|
| 120 |
{
|
|
| 121 |
GLES31.glUniform1iv( mNameOITH , mNumEffects, mName ,0); |
|
| 122 |
GLES31.glUniform4fv( mUniformsOITH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0); |
|
| 123 |
} |
|
| 124 |
} |
|
| 125 | 99 |
} |
| src/main/java/org/distorted/library/main/EffectQueueMatrix.java | ||
|---|---|---|
| 43 | 43 |
private static float mMiny; |
| 44 | 44 |
private static float mMaxy; |
| 45 | 45 |
|
| 46 |
private static int mObjDH; // This is a handle to half a Object dimensions |
|
| 47 |
private static int mMVPMatrixH; // the transformation matrix |
|
| 48 |
private static int mMVMatrixH; // the modelview matrix. |
|
| 49 |
|
|
| 50 |
private static int mObjDOITH; // |
|
| 51 |
private static int mMVPMatrixOITH; // Same like above, but in main OIT program. |
|
| 52 |
private static int mMVMatrixOITH; // |
|
| 46 |
private static int[] mObjDH = new int[Distorted.MAIN_VARIANTS]; |
|
| 47 |
private static int[] mMVPMatrixH = new int[Distorted.MAIN_VARIANTS]; |
|
| 48 |
private static int[] mMVMatrixH = new int[Distorted.MAIN_VARIANTS]; |
|
| 53 | 49 |
|
| 54 | 50 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 55 | 51 |
|
| ... | ... | |
| 105 | 101 |
|
| 106 | 102 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 107 | 103 |
|
| 108 |
static void getUniforms(int mProgramH) |
|
| 109 |
{
|
|
| 110 |
mObjDH = GLES31.glGetUniformLocation(mProgramH, "u_objD"); |
|
| 111 |
mMVPMatrixH= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix"); |
|
| 112 |
mMVMatrixH = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix"); |
|
| 113 |
} |
|
| 114 |
|
|
| 115 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 116 |
|
|
| 117 |
static void getUniformsOIT(int mProgramH) |
|
| 104 |
static void getUniforms(int mProgramH, int variant) |
|
| 118 | 105 |
{
|
| 119 |
mObjDOITH = GLES31.glGetUniformLocation(mProgramH, "u_objD");
|
|
| 120 |
mMVPMatrixOITH= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
|
|
| 121 |
mMVMatrixOITH = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
|
|
| 106 |
mObjDH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_objD");
|
|
| 107 |
mMVPMatrixH[variant]= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
|
|
| 108 |
mMVMatrixH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
|
|
| 122 | 109 |
} |
| 123 | 110 |
|
| 124 | 111 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 158 | 145 |
|
| 159 | 146 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 160 | 147 |
|
| 161 |
void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels) |
|
| 162 |
{
|
|
| 163 |
Matrix.setIdentityM(mViewMatrix, 0); |
|
| 164 |
Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance); |
|
| 165 |
float mipmap = projection.mMipmap; |
|
| 166 |
if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap); |
|
| 167 |
|
|
| 168 |
for(int i=0; i<mNumEffects; i++) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i); |
|
| 169 |
|
|
| 170 |
Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ); |
|
| 171 |
if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels); |
|
| 172 |
Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0); |
|
| 173 |
|
|
| 174 |
GLES31.glUniform3f( mObjDH , halfX, halfY, halfZ); |
|
| 175 |
GLES31.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0); |
|
| 176 |
GLES31.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0); |
|
| 177 |
} |
|
| 178 |
|
|
| 179 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 180 |
|
|
| 181 |
void sendOIT(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels) |
|
| 148 |
void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels, int variant) |
|
| 182 | 149 |
{
|
| 183 | 150 |
Matrix.setIdentityM(mViewMatrix, 0); |
| 184 | 151 |
Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance); |
| ... | ... | |
| 191 | 158 |
if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels); |
| 192 | 159 |
Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0); |
| 193 | 160 |
|
| 194 |
GLES31.glUniform3f( mObjDOITH , halfX, halfY, halfZ);
|
|
| 195 |
GLES31.glUniformMatrix4fv(mMVMatrixOITH , 1, false, mViewMatrix, 0);
|
|
| 196 |
GLES31.glUniformMatrix4fv(mMVPMatrixOITH, 1, false, mMVPMatrix , 0);
|
|
| 161 |
GLES31.glUniform3f( mObjDH[variant] , halfX, halfY, halfZ);
|
|
| 162 |
GLES31.glUniformMatrix4fv(mMVMatrixH[variant] , 1, false, mViewMatrix, 0);
|
|
| 163 |
GLES31.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0);
|
|
| 197 | 164 |
} |
| 198 | 165 |
} |
| src/main/java/org/distorted/library/main/EffectQueueVertex.java | ||
|---|---|---|
| 32 | 32 |
private static final int NUM_UNIFORMS = VertexEffect.NUM_UNIFORMS; |
| 33 | 33 |
private static final int INDEX = EffectType.VERTEX.ordinal(); |
| 34 | 34 |
|
| 35 |
private static int mNumEffectsH; |
|
| 36 |
private static int mNameH; |
|
| 37 |
private static int mUniformsH; |
|
| 38 |
|
|
| 39 |
private static int mNumEffectsOITH; |
|
| 40 |
private static int mNameOITH; |
|
| 41 |
private static int mUniformsOITH; |
|
| 35 |
private static int[] mNumEffectsH = new int[Distorted.MAIN_VARIANTS]; |
|
| 36 |
private static int[] mNameH = new int[Distorted.MAIN_VARIANTS]; |
|
| 37 |
private static int[] mUniformsH = new int[Distorted.MAIN_VARIANTS]; |
|
| 42 | 38 |
|
| 43 | 39 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 44 | 40 |
|
| ... | ... | |
| 49 | 45 |
|
| 50 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 51 | 47 |
|
| 52 |
static void getUniforms(int mProgramH) |
|
| 53 |
{
|
|
| 54 |
mNumEffectsH= GLES31.glGetUniformLocation( mProgramH, "vNumEffects"); |
|
| 55 |
mNameH = GLES31.glGetUniformLocation( mProgramH, "vName"); |
|
| 56 |
mUniformsH = GLES31.glGetUniformLocation( mProgramH, "vUniforms"); |
|
| 57 |
} |
|
| 58 |
|
|
| 59 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 60 |
|
|
| 61 |
static void getUniformsOIT(int mProgramH) |
|
| 48 |
static void getUniforms(int mProgramH, int variant) |
|
| 62 | 49 |
{
|
| 63 |
mNumEffectsOITH= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
|
|
| 64 |
mNameOITH = GLES31.glGetUniformLocation( mProgramH, "vName");
|
|
| 65 |
mUniformsOITH = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
|
|
| 50 |
mNumEffectsH[variant]= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
|
|
| 51 |
mNameH[variant] = GLES31.glGetUniformLocation( mProgramH, "vName");
|
|
| 52 |
mUniformsH[variant] = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
|
|
| 66 | 53 |
} |
| 67 | 54 |
|
| 68 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 100 | 87 |
|
| 101 | 88 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 102 | 89 |
|
| 103 |
void send() |
|
| 90 |
void send(int variant)
|
|
| 104 | 91 |
{
|
| 105 |
GLES31.glUniform1i( mNumEffectsH, mNumEffects); |
|
| 92 |
GLES31.glUniform1i( mNumEffectsH[variant], mNumEffects);
|
|
| 106 | 93 |
|
| 107 | 94 |
if( mNumEffects>0 ) |
| 108 | 95 |
{
|
| 109 |
GLES31.glUniform1iv( mNameH , mNumEffects, mName ,0); |
|
| 110 |
GLES31.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0); |
|
| 111 |
} |
|
| 112 |
} |
|
| 113 |
|
|
| 114 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 115 |
|
|
| 116 |
void sendOIT() |
|
| 117 |
{
|
|
| 118 |
GLES31.glUniform1i( mNumEffectsOITH, mNumEffects); |
|
| 119 |
|
|
| 120 |
if( mNumEffects>0 ) |
|
| 121 |
{
|
|
| 122 |
GLES31.glUniform1iv( mNameOITH , mNumEffects, mName ,0); |
|
| 123 |
GLES31.glUniform4fv( mUniformsOITH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0); |
|
| 96 |
GLES31.glUniform1iv( mNameH[variant] , mNumEffects, mName ,0); |
|
| 97 |
GLES31.glUniform4fv( mUniformsH[variant],(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0); |
|
| 124 | 98 |
} |
| 125 | 99 |
} |
| 126 | 100 |
} |
Also available in: Unified diff
Some progress with not-postprocessed OIT.