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/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