Project

General

Profile

« Previous | Next » 

Revision 9d845904

Added by Leszek Koltunski almost 6 years ago

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

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

  
77
      for(int i=0; i<mNumFBOs; i++)
74 78
        {
75
        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
          }
76 93
        }
77

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

  
81
      if( mDepthStencil==DEPTH_NO_STENCIL )
82
        {
83
        GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH[0], 0);
84
        }
85
      else if( mDepthStencil==BOTH_DEPTH_STENCIL )
96
      for(int i=0; i<mNumFBOs; i++)
86 97
        {
87
        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
          }
88 108
        }
89 109

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

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

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

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

  
104
      GLES31.glDeleteTextures(1, mDepthStencilH, 0);
105
      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);
106 135
      }
107 136
    }
108 137

  
109 138
///////////////////////////////////////////////////////////////////////////////////////////////////
139
// TODO
110 140

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

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

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

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

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

  
153 185
///////////////////////////////////////////////////////////////////////////////////////////////////
......
167 199
      }
168 200
    }
169 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

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

  
176 222
  DistortedFramebuffer(int numcolors, int depthStencil, int type, int width, int height)
177 223
    {
178
    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);
179 233
    }
180 234

  
181 235
///////////////////////////////////////////////////////////////////////////////////////////////////
......
193 247
  @SuppressWarnings("unused")
194 248
  public DistortedFramebuffer(int width, int height, int numcolors, int depthStencil)
195 249
    {
196
    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);
197 251
    }
198 252

  
199 253
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff