Project

General

Profile

« Previous | Next » 

Revision 0f011027

Added by Leszek Koltunski almost 7 years ago

Major speedup, BLUR fully optimized now.

Multiblur app, worst case (all 8 cubes blurred with max radius, HIGHEST quality: Nexus5X: 46.7 FPS, Nexus 4: 29.7 FPS.

View differences:

src/main/java/org/distorted/library/DistortedFramebuffer.java
50 50
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST);
51 51
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
52 52
        GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA, mWidth, mHeight, 0, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, null);
53
        GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0+i, GLES30.GL_TEXTURE_2D, mColorH[i], 0);
54 53
        }
55

  
54
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, mColorH[0], 0);
56 55
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0);
57 56
      GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, 0);
58 57

  
src/main/java/org/distorted/library/DistortedNode.java
266 266
    if( input.setAsInput() )
267 267
      {
268 268
      int quality = effects.getQuality();
269
      DistortedFramebuffer buffer1 = surface.mBuffer1[quality];
270
      DistortedFramebuffer buffer2 = surface.mBuffer2[quality];
269
      DistortedFramebuffer buffer = surface.mBuffer[quality];
271 270
      float w = mSurface.getWidth() /2.0f;
272 271
      float h = mSurface.getHeight()/2.0f;
272
      buffer.setAsOutput();
273 273

  
274 274
      // Draw the color buffer of the object.
275
      buffer1.setAsOutput();
276 275
      mState.apply();
277
      mEffects.drawPriv(w, h, mMesh, buffer1, currTime, 0);
276
      mEffects.drawPriv(w, h, mMesh, buffer, currTime, 0);
278 277

  
279 278
      // Draw stencil + depth buffers of the object enlarged by HALO pixels around.
280
      buffer2.setAsOutput();
281 279
      DistortedRenderState.setUpStencilMark();
282
      mEffects.drawPriv(w, h, mMesh, buffer2, currTime, effects.getHalo()*buffer2.mMipmap);
280
      mEffects.drawPriv(w, h, mMesh, buffer, currTime, effects.getHalo()*buffer.mMipmap);
283 281
      DistortedRenderState.unsetUpStencilMark();
284 282

  
285 283
      return 1;
src/main/java/org/distorted/library/DistortedOutputSurface.java
64 64

  
65 65
  private ArrayList<Job> mJobs = new ArrayList<>();
66 66

  
67
  DistortedFramebuffer[] mBuffer1, mBuffer2;
67
  DistortedFramebuffer[] mBuffer;
68 68

  
69 69
  private long mTime;
70 70
  private float mFOV;
......
110 110
    mClearStencil = 0;
111 111
    mClear = GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT;
112 112

  
113
    mBuffer1 = new DistortedFramebuffer[EffectQuality.LENGTH];
114
    mBuffer2 = new DistortedFramebuffer[EffectQuality.LENGTH];
113
    mBuffer = new DistortedFramebuffer[EffectQuality.LENGTH];
115 114

  
116 115
    mMipmap = 1.0f;
117 116

  
......
164 163

  
165 164
    for(int j=0; j<EffectQuality.LENGTH; j++)
166 165
      {
167
      mBuffer1[j] = new DistortedFramebuffer(1,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
168
      mBuffer2[j] = new DistortedFramebuffer(1,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
169
      mBuffer1[j].mMipmap = mipmap;
170
      mBuffer2[j].mMipmap = mipmap;
166
      mBuffer[j] = new DistortedFramebuffer(2,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
167
      mBuffer[j].mMipmap = mipmap;
171 168
      mipmap *= EffectQuality.MULTIPLIER;
172 169
      }
173 170

  
......
182 179

  
183 180
    for(int j=0; j<EffectQuality.LENGTH; j++)
184 181
      {
185
      mBuffer1[j].setAsOutput();
186
      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
187
      mBuffer2[j].setAsOutput();
182
      mBuffer[j].setAsOutput();
183
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, mBuffer[j].mColorH[1], 0);
188 184
      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
185
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, mBuffer[j].mColorH[0], 0);
186
      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
189 187
      }
190 188
    }
191 189

  
......
212 210
      if( currB==0 ) numRenders += child.draw(time,this);
213 211
      else
214 212
        {
215
        if( mBuffer1[0]==null ) createBuffers();
213
        if( mBuffer[0]==null ) createBuffers();
216 214
        numRenders += child.markStencilAndDraw(time,this,currP);
217 215
        if( i==num-1 ) numRenders += currP.postprocess(time,this);
218 216
        }
src/main/java/org/distorted/library/EffectQueuePostprocess.java
271 271
      {
272 272
      compute(time);
273 273

  
274
      DistortedFramebuffer buffer1 = surface.mBuffer1[mQualityLevel];
275
      DistortedFramebuffer buffer2 = surface.mBuffer2[mQualityLevel];
274
      DistortedFramebuffer buffer = surface.mBuffer[mQualityLevel];
275
      GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, buffer.mFBOH[0]);
276 276

  
277
      float w1 = buffer1.mWidth;
278
      float h1 = buffer1.mHeight;
277
      float w1 = buffer.mWidth;
278
      float h1 = buffer.mHeight;
279 279
      float w2 = surface.mWidth;
280 280
      float h2 = surface.mHeight;
281 281

  
......
289 289
      // horizontal blur
290 290
      GLES30.glViewport(0, 0, (int)w1, (int)h1);
291 291
      mBlur1Program.useProgram();
292
      buffer1.setAsInput();
293
      buffer2.setAsOutput();
292
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, buffer.mColorH[1], 0);
293
      GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
294
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, buffer.mColorH[0]);
294 295

  
295 296
      GLES30.glUniform1fv( mWeights1H, radius+1, weightsCache,offset);
296 297
      GLES30.glUniform1i( mRadius1H, radius);
......
304 305
      DistortedRenderState.useStencilMark();
305 306
      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
306 307
      DistortedRenderState.unuseStencilMark();
308
      GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
309
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0);
307 310

  
308 311
      // vertical blur
309 312
      mBlur2Program.useProgram();
310
      buffer2.setAsInput();
311
      buffer1.setAsOutput();
313
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, buffer.mColorH[0], 0);
314
      GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
315
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, buffer.mColorH[1]);
312 316

  
313 317
      GLES30.glColorMask(true,true,true,true);
314 318
      GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f);
......
323 327
      GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
324 328
      GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
325 329

  
326
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_DEPTH_STENCIL_ATTACHMENT, GLES30.GL_TEXTURE_2D, buffer2.mDepthStencilH[0], 0);
327 330
      DistortedRenderState.useStencilMark();
328 331
      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
329 332
      DistortedRenderState.unuseStencilMark();
330
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_DEPTH_STENCIL_ATTACHMENT, GLES30.GL_TEXTURE_2D, buffer1.mDepthStencilH[0], 0);
333
      GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
334
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0);
331 335

  
332 336
      // blit the results with DEPTH to surface.
333 337
      GLES30.glViewport(0, 0, (int)w2, (int)h2);
334
      buffer1.setAsInput();
335
      buffer2.setAsDepth();
336 338
      surface.setAsOutput(time);
339
      GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
340
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, buffer.mColorH[0]);
341
      GLES30.glActiveTexture(GLES30.GL_TEXTURE1);
342
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, buffer.mDepthStencilH[0]);
343

  
344
      GLES30.glDisable(GLES30.GL_STENCIL_TEST);
345
      GLES30.glStencilMask(0x00);
346

  
337 347
      DistortedEffects.blitDepthPriv(surface);
348
      GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
349
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0);
350
      GLES30.glActiveTexture(GLES30.GL_TEXTURE1);
351
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0);
338 352

  
339 353
      // after each postprocess, clear buffers
340 354
      GLES30.glStencilMask(0xff);
......
343 357
      GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f);
344 358
      GLES30.glClearDepthf(1.0f);
345 359
      GLES30.glClearStencil(0);
346
      buffer1.setAsOutput();
347
      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
348
      buffer2.setAsOutput();
360

  
361
      buffer.setAsOutput();
362
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, buffer.mColorH[1], 0);
349 363
      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
364
      GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, buffer.mColorH[0], 0);
365
      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
350 366
      }
351 367

  
352 368
    return mNumEffects;

Also available in: Unified diff