Project

General

Profile

« Previous | Next » 

Revision 8ebbc730

Added by Leszek Koltunski almost 6 years ago

Port a commit from the master branch.

Finally properly fix the flashing on ARM Mali T880 GPU.

The flashing is caused by a 'full pipeline flush' (see DarkPhoton, https://www.opengl.org/discussion_boards/showthread.php/200754-Flashes-on-ARM-Mali?p=1291679&viewfull=1#post1291679 ). In order to combat it, first introduce the possibility that a single DistortedOutputSurface is backed up by more than one FBO. Then make DistortedScreen be derived from DistortedFramebuffer (which itself is derived from DistortedOutputSurface) and make it contain 3 FBOs, render to them in a circular queue fashion, and blit from a given FBO to the system FBO. The 'more than 1 intermediate FBO' queue prevents the pipeline flush.

Still some TODOs in DistortedFramebuffer remain (properly check for Framebuffer completness!)

View differences:

src/main/java/org/distorted/library/main/DistortedFramebuffer.java
36 36

  
37 37
  void create()
38 38
    {
39
    //////////////////////////////////////////////////////////////
40
    // COLOR
41

  
39 42
    if( mColorCreated==NOT_CREATED_YET )
40 43
      {
41
      GLES31.glGenTextures( mNumColors, mColorH, 0);
42
      GLES31.glGenFramebuffers(1, mFBOH, 0);
43
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]);
44
      GLES31.glGenTextures( mNumFBOs*mNumColors, mColorH, 0);
45
      GLES31.glGenFramebuffers(mNumFBOs, mFBOH, 0);
44 46

  
45
      for(int i=0; i<mNumColors; i++)
47
      for(int i=0; i<mNumFBOs; i++)
46 48
        {
47
        GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mColorH[i]);
48
        GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_REPEAT);
49
        GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_REPEAT);
50
        GLES31.glTexParameterf(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
51
        GLES31.glTexParameterf(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_LINEAR);
52
        GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA, mRealWidth, mRealHeight, 0, GLES31.GL_RGBA, GLES31.GL_UNSIGNED_BYTE, null);
49
        GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[i]);
50

  
51
        for(int j=0; j<mNumColors; j++)
52
          {
53
          GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mColorH[i*mNumColors+j]);
54
          GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_REPEAT);
55
          GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_REPEAT);
56
          GLES31.glTexParameterf(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
57
          GLES31.glTexParameterf(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_LINEAR);
58
          GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA, mRealWidth, mRealHeight, 0, GLES31.GL_RGBA, GLES31.GL_UNSIGNED_BYTE, null);
59
          }
60

  
61
        GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, mColorH[i*mNumColors], 0);
62
        GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0);
53 63
        }
54
      GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, mColorH[0], 0);
55
      GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0);
56
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
57 64

  
65
      // TODO
58 66
      mColorCreated = checkStatus("color");
67
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
59 68
      }
69

  
70
    //////////////////////////////////////////////////////////////
71
    // DEPTH / STENCIL
72

  
60 73
    if( mDepthStencilCreated==NOT_CREATED_YET ) // we need to create a new DEPTH or STENCIL attachment
61 74
      {
62
      GLES31.glGenTextures(1, mDepthStencilH, 0);
63
      GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mDepthStencilH[0]);
64
      GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_REPEAT);
65
      GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_REPEAT);
66
      GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
67
      GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST);
68
      GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_DEPTH_STENCIL_TEXTURE_MODE, GLES31.GL_DEPTH_COMPONENT);
69

  
70
      if( mDepthStencil==DEPTH_NO_STENCIL )
71
        {
72
        GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_DEPTH_COMPONENT, mRealWidth, mRealHeight, 0, GLES31.GL_DEPTH_COMPONENT, GLES31.GL_UNSIGNED_INT, null);
73
        }
74
      else if( mDepthStencil==BOTH_DEPTH_STENCIL )
75
      GLES31.glGenTextures(mNumFBOs, mDepthStencilH, 0);
76

  
77
      for(int i=0; i<mNumFBOs; i++)
75 78
        {
76
        GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_DEPTH24_STENCIL8, mRealWidth, mRealHeight, 0, GLES31.GL_DEPTH_STENCIL, GLES31.GL_UNSIGNED_INT_24_8, null);
79
        GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mDepthStencilH[i]);
80
        GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_REPEAT);
81
        GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_REPEAT);
82
        GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
83
        GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST);
84

  
85
        if (mDepthStencil == DEPTH_NO_STENCIL)
86
          {
87
          GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_DEPTH_COMPONENT, mRealWidth, mRealHeight, 0, GLES31.GL_DEPTH_COMPONENT, GLES31.GL_UNSIGNED_INT, null);
88
          }
89
        else if (mDepthStencil == BOTH_DEPTH_STENCIL)
90
          {
91
          GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_DEPTH24_STENCIL8, mRealWidth, mRealHeight, 0, GLES31.GL_DEPTH_STENCIL, GLES31.GL_UNSIGNED_INT_24_8, null);
92
          }
77 93
        }
78

  
79 94
      GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0);
80
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]);
81 95

  
82
      if( mDepthStencil==DEPTH_NO_STENCIL )
83
        {
84
        GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH[0], 0);
85
        }
86
      else if( mDepthStencil==BOTH_DEPTH_STENCIL )
96
      for(int i=0; i<mNumFBOs; i++)
87 97
        {
88
        GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH[0], 0);
98
        GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[i]);
99

  
100
        if (mDepthStencil == DEPTH_NO_STENCIL)
101
          {
102
          GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH[i], 0);
103
          }
104
        else if (mDepthStencil == BOTH_DEPTH_STENCIL)
105
          {
106
          GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH[i], 0);
107
          }
89 108
        }
90 109

  
91
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
92

  
110
      // TODO
93 111
      mDepthStencilCreated = checkStatus("depth");
112
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
94 113
      }
114

  
115
    //////////////////////////////////////////////////////////////
116
    // DETACH
117

  
118
    // TODO
95 119
    if( mDepthStencilCreated==DONT_CREATE && mDepthStencilH[0]>0 ) // we need to detach and recreate the DEPTH attachment.
96 120
      {
97 121
      // OpenGL ES 3.0.5 spec, chapter 4.4.2.4 :
98 122
      // "Note that the texture image is specifically not detached from any other framebuffer objects.
99 123
      //  Detaching the texture image from any other framebuffer objects is the responsibility of the application."
100
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]);
101
      GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT        , GLES31.GL_TEXTURE_2D, 0, 0);
102
      GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_TEXTURE_2D, 0, 0);
103
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
104 124

  
105
      GLES31.glDeleteTextures(1, mDepthStencilH, 0);
106
      mDepthStencilH[0]=0;
125
      for(int i=0; i<mNumFBOs; i++)
126
        {
127
        GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[i]);
128
        GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT, GLES31.GL_TEXTURE_2D, 0, 0);
129
        GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_TEXTURE_2D, 0, 0);
130
        mDepthStencilH[i]=0;
131
        }
132

  
133
      GLES31.glDeleteTextures(mNumFBOs, mDepthStencilH, 0);
134
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
107 135
      }
108 136
    }
109 137

  
110 138
///////////////////////////////////////////////////////////////////////////////////////////////////
139
// TODO
111 140

  
112 141
  private int checkStatus(String message)
113 142
    {
......
135 164
    {
136 165
    if( mColorH[0]>0 )
137 166
      {
138
      GLES31.glDeleteTextures(1, mColorH, 0);
139
      mColorH[0] = 0;
167
      GLES31.glDeleteTextures(mNumFBOs*mNumColors, mColorH, 0);
140 168
      mColorCreated = NOT_CREATED_YET;
169

  
170
      for(int i=0; i<mNumFBOs*mNumColors; i++) mColorH[i] = 0;
141 171
      }
142 172

  
143 173
    if( mDepthStencilH[0]>0 )
144 174
      {
145
      GLES31.glDeleteTextures(1, mDepthStencilH, 0);
146
      mDepthStencilH[0]=0;
175
      GLES31.glDeleteTextures(mNumFBOs, mDepthStencilH, 0);
147 176
      mDepthStencilCreated = NOT_CREATED_YET;
177

  
178
      for(int i=0; i<mNumFBOs; i++) mDepthStencilH[i] = 0;
148 179
      }
149 180

  
150
    GLES31.glDeleteFramebuffers(1, mFBOH, 0);
151
    mFBOH[0] = 0;
181
    GLES31.glDeleteFramebuffers(mNumFBOs, mFBOH, 0);
182
    for(int i=0; i<mNumFBOs; i++) mFBOH[i] = 0;
152 183
    }
153 184

  
154 185
///////////////////////////////////////////////////////////////////////////////////////////////////
......
168 199
      }
169 200
    }
170 201

  
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203

  
204
  boolean setAsInput(int fbo, int texture)
205
    {
206
    if( texture>=0 && texture<mNumColors && fbo>=0 && fbo<mNumFBOs && mColorH[mNumColors*fbo + texture]>0 )
207
      {
208
      GLES31.glActiveTexture(GLES31.GL_TEXTURE0);
209
      GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mColorH[mNumColors*fbo + texture]);
210
      return true;
211
      }
212

  
213
    return false;
214
    }
215

  
171 216
///////////////////////////////////////////////////////////////////////////////////////////////////
172 217
// create SYSTEM or TREE framebuffers (those are just like normal FBOs, just hold information
173 218
// that they were autocreated only for the Library's internal purposes (SYSTEM) or for using
......
176 221

  
177 222
  DistortedFramebuffer(int numcolors, int depthStencil, int type, int width, int height)
178 223
    {
179
    super(width,height,NOT_CREATED_YET,numcolors,depthStencil,NOT_CREATED_YET, type);
224
    super(width,height,NOT_CREATED_YET,1,numcolors,depthStencil,NOT_CREATED_YET, type);
225
    }
226

  
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228
// create a multi-framebuffer (1 object containing multiple FBOs)
229

  
230
  DistortedFramebuffer(int numfbos, int numcolors, int depthStencil, int type, int width, int height)
231
    {
232
    super(width,height,NOT_CREATED_YET,numfbos,numcolors,depthStencil,NOT_CREATED_YET, type);
180 233
    }
181 234

  
182 235
///////////////////////////////////////////////////////////////////////////////////////////////////
......
194 247
  @SuppressWarnings("unused")
195 248
  public DistortedFramebuffer(int width, int height, int numcolors, int depthStencil)
196 249
    {
197
    super(width,height,NOT_CREATED_YET,numcolors,depthStencil,NOT_CREATED_YET,TYPE_USER);
250
    super(width,height,NOT_CREATED_YET,1,numcolors,depthStencil,NOT_CREATED_YET,TYPE_USER);
198 251
    }
199 252

  
200 253
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/main/DistortedNode.java
341 341
        DistortedEffects.blitPriv(mData.mFBO);
342 342
        }
343 343

  
344
      numRenders += mData.mFBO.renderChildren(currTime,mNumChildren[0],mChildren);
344
      numRenders += mData.mFBO.renderChildren(currTime,mNumChildren[0],mChildren,0);
345 345
      }
346 346

  
347 347
    return numRenders;
src/main/java/org/distorted/library/main/DistortedOutputSurface.java
72 72
  // Global buffers used for postprocessing.
73 73
  private static DistortedOutputSurface[] mBuffer = new DistortedOutputSurface[EffectQuality.LENGTH];
74 74

  
75
  private long mTime;
76 75
  private float mFOV;
77 76
  float mDistance, mNear;
78 77
  float[] mProjectionMatrix;
79 78

  
80 79
  int mDepthStencilCreated;
81 80
  int mDepthStencil;
82
  int[] mDepthStencilH = new int[1];
83
  int[] mFBOH          = new int[1];
81
  int[] mDepthStencilH;
82
  int[] mFBOH;
83
  private long[] mTime;
84 84

  
85 85
  private float mClearR, mClearG, mClearB, mClearA;
86 86
  private float mClearDepth;
......
95 95

  
96 96
///////////////////////////////////////////////////////////////////////////////////////////////////
97 97

  
98
  DistortedOutputSurface(int width, int height, int createColor, int numcolors, int depthStencil, int fbo, int type)
98
  DistortedOutputSurface(int width, int height, int createColor, int numfbos, int numcolors, int depthStencil, int fbo, int type)
99 99
    {
100
    super(width,height,createColor,numcolors,type);
100
    super(width,height,createColor,numfbos,numcolors,type);
101

  
102
    mDepthStencilH = new int[numfbos];
103
    mFBOH          = new int[numfbos];
104

  
105
    mTime = new long[numfbos];
106
    for(int i=0; i<mNumFBOs;i++) mTime[i]=0;
101 107

  
102 108
    mRealWidth = width;
103 109
    mRealHeight= height;
......
113 119
    mFBOH[0]         = fbo;
114 120
    mDepthStencilH[0]= 0;
115 121

  
116
    mTime = 0;
117

  
118 122
    mClearR = 0.0f;
119 123
    mClearG = 0.0f;
120 124
    mClearB = 0.0f;
......
263 267

  
264 268
///////////////////////////////////////////////////////////////////////////////////////////////////
265 269

  
266
  private int oitBuild(DistortedOutputSurface buffer)
270
  private int oitBuild(long time, DistortedOutputSurface buffer, int fbo)
267 271
    {
268 272
    GLES31.glViewport(0, 0, mWidth, mHeight);
269
    setAsOutput();
273
    setAsOutput(time,fbo);
270 274
    GLES31.glActiveTexture(GLES31.GL_TEXTURE0);
271 275
    GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, buffer.mColorH[0]);
272 276
    GLES31.glActiveTexture(GLES31.GL_TEXTURE1);
......
355 359
// Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing
356 360
// to a whole buffer (lastQueue.postprocess) and merge it (this.oitBuild).
357 361

  
358
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children)
362
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo)
359 363
    {
360 364
    int quality=0, internalQuality = 0, numRenders = 0, bucketChange = 0;
361 365
    DistortedNode child1, child2;
......
370 374

  
371 375
      if( currBucket==0 )
372 376
        {
373
        GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]);
374
        numRenders += child1.draw(time, this);
377
        setAsOutput(time,fbo);
378
        numRenders += child1.draw(time,this);
375 379
        }
376 380
      else
377 381
        {
......
393 397
              }
394 398

  
395 399
            numRenders += lastQueue.postprocess(mBuffer);
396
            numRenders += oitBuild(mBuffer[quality]);
400
            numRenders += oitBuild(time,mBuffer[quality],fbo);
397 401
            GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT|GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
398 402
            clearBuffer(mBuffer[quality]);
403

  
399 404
            }
400 405

  
401 406
          internalQuality = currQueue.getInternalQuality();
......
415 420
            }
416 421

  
417 422
          numRenders += currQueue.postprocess(mBuffer);
418
          numRenders += oitBuild(mBuffer[quality]);
423
          numRenders += oitBuild(time,mBuffer[quality],fbo);
419 424
          GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT|GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
420 425
          numRenders += oitRender(time);  // merge the OIT linked list
421 426
          clearBuffer(mBuffer[quality]);
......
458 463
    return (float)mHeight/mRealHeight;
459 464
    }
460 465

  
466
///////////////////////////////////////////////////////////////////////////////////////////////////
467

  
468
  private void setAsOutput(long time, int fbo)
469
    {
470
    if( fbo>=0 && fbo<mNumFBOs )
471
      {
472
      GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[fbo]);
473

  
474
      if (mTime[fbo] != time)
475
        {
476
        mTime[fbo] = time;
477
        clear();
478
        }
479
      }
480
    else
481
      {
482
      android.util.Log.e("surface", "error in setAsOutput, fbo="+fbo);
483
      }
484
    }
485

  
461 486
///////////////////////////////////////////////////////////////////////////////////////////////////
462 487
// PUBLIC API
463 488
///////////////////////////////////////////////////////////////////////////////////////////////////
464 489
/**
465
 * Draws all the attached children to this OutputSurface.
490
 * Draws all the attached children to this OutputSurface's 0th FBO.
466 491
 * <p>
467 492
 * Must be called from a thread holding OpenGL Context.
468 493
 *
......
470 495
 * @return Number of objects rendered.
471 496
 */
472 497
  public int render(long time)
498
    {
499
    return render(time,0);
500
    }
501

  
502
///////////////////////////////////////////////////////////////////////////////////////////////////
503
/**
504
 * Draws all the attached children to this OutputSurface.
505
 * <p>
506
 * Must be called from a thread holding OpenGL Context.
507
 *
508
 * @param time Current time, in milliseconds. This will be passed to all the Effects stored in the children Nodes.
509
 * @param fbo The surface can have many FBOs backing it up - render this to FBO number 'fbo'.
510
 * @return Number of objects rendered.
511
 */
512
  public int render(long time, int fbo)
473 513
    {
474 514
    // change tree topology (attach and detach children)
475 515
/*
......
512 552
      numRenders += mChildren.get(i).renderRecursive(time);
513 553
      }
514 554

  
515
    setAsOutput(time);
516
    numRenders += renderChildren(time,mNumChildren,mChildren);
555
    numRenders += renderChildren(time,mNumChildren,mChildren,fbo);
517 556

  
518 557
    return numRenders;
519 558
    }
......
531 570
    {
532 571
    GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]);
533 572

  
534
    if( mTime!=time )
573
    if( mTime[0]!=time )
535 574
      {
536
      mTime = time;
575
      mTime[0] = time;
537 576
      clear();
538 577
      }
539 578
    }
src/main/java/org/distorted/library/main/DistortedScreen.java
55 55
  private static MatrixEffectMove mMoveEffect = new MatrixEffectMove( new Static3D(5,5,0) );
56 56
  ///// END DEBUGGING //////////////////////////
57 57

  
58
  private int mCurrFBO;
59
  private static final int NUM_FBO = 3;
60

  
58 61
///////////////////////////////////////////////////////////////////////////////////////////////////
59 62
// PUBLIC API
60 63
///////////////////////////////////////////////////////////////////////////////////////////////////
......
65 68
 */
66 69
  public DistortedScreen()
67 70
    {
68
    super(1,1,1,BOTH_DEPTH_STENCIL);
71
    super(NUM_FBO,1,BOTH_DEPTH_STENCIL, TYPE_SYST, 1,1);
69 72
    mShowFPS = false;
73
    mCurrFBO = 0;
70 74
    }
71 75

  
72 76
///////////////////////////////////////////////////////////////////////////////////////////////////
......
100 104
      lastTime = time;
101 105
      }
102 106

  
103
    int numrender = super.render(time);
107
    int numrender = super.render(time,mCurrFBO);
104 108

  
105 109
    GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
106
    clear();
107
    setAsInput();
110
    setAsInput(mCurrFBO,0);
108 111
    GLES31.glColorMask(true,true,true,true);
109 112
    GLES31.glDepthMask(false);
110 113
    GLES31.glDisable(GLES31.GL_STENCIL_TEST);
......
118 121
      fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time, 0);
119 122
      }
120 123

  
124
    mCurrFBO++;
125
    if( mCurrFBO>=NUM_FBO ) mCurrFBO=0;
126

  
121 127
    return numrender+1;
122 128
    }
123 129

  
src/main/java/org/distorted/library/main/DistortedSurface.java
25 25
{
26 26
  int mColorCreated;
27 27
  int mNumColors;
28
  int mNumFBOs;
28 29
  int[] mColorH;
29 30
  int mWidth, mHeight;
30 31

  
31 32
///////////////////////////////////////////////////////////////////////////////////////////////////
32 33

  
33
  DistortedSurface(int width, int height, int create, int numcolors, int type)
34
  DistortedSurface(int width, int height, int create, int numfbos, int numcolors, int type)
34 35
    {
35 36
    super(create,type);
36 37

  
38
    mNumFBOs      = numfbos;
37 39
    mNumColors    = numcolors;
38 40
    mWidth        = width ;
39 41
    mHeight       = height;
40 42
    mColorCreated = create;
41 43

  
42
    if( mNumColors>0 )
44
    int total = mNumFBOs*mNumColors;
45

  
46
    if( total>0 )
43 47
      {
44
      mColorH = new int[mNumColors];
45
      for( int i=0; i<mNumColors; i++ )  mColorH[i] = 0;
48
      mColorH = new int[total];
49
      for( int i=0; i<total; i++ )  mColorH[i] = 0;
46 50
      }
47 51
    }
48 52

  
src/main/java/org/distorted/library/main/DistortedTexture.java
34 34
 */
35 35
public class DistortedTexture extends DistortedSurface implements DistortedInputSurface
36 36
  {
37
  private Bitmap mBmp= null;
37
  private Bitmap mBmp;
38 38

  
39 39
///////////////////////////////////////////////////////////////////////////////////////////////////
40 40
// We have to flip vertically every single Bitmap that we get fed with.
......
115 115

  
116 116
  public DistortedTexture(int width, int height, int type)
117 117
    {
118
    super(width,height,NOT_CREATED_YET,1,type);
118
    super(width,height,NOT_CREATED_YET,1,1,type);
119 119
    mBmp= null;
120 120
    }
121 121

  
......
127 127
 */
128 128
  public DistortedTexture(int width, int height)
129 129
    {
130
    super(width,height,NOT_CREATED_YET,1,TYPE_USER);
130
    super(width,height,NOT_CREATED_YET,1,1,TYPE_USER);
131 131
    mBmp= null;
132 132
    }
133 133

  

Also available in: Unified diff