101 |
101 |
|
102 |
102 |
////////////////////////////////////////////////////////////////////////////////
|
103 |
103 |
// section dealing with Shader Storage Buffer Object (for counting transparency)
|
104 |
|
private static final int BUFFERING = 3;
|
105 |
|
private static int mBufferSize =10;
|
|
104 |
private static final int FRAME_DELAY = 3;
|
|
105 |
private static int mBufferSize =10;
|
106 |
106 |
private static DistortedObjectCounter mSurfaceCounter = new DistortedObjectCounter();
|
107 |
107 |
private static int[] mSSBO = new int[1];
|
108 |
108 |
private static IntBuffer mIntBuffer;
|
... | ... | |
114 |
114 |
|
115 |
115 |
private int mSurfaceID;
|
116 |
116 |
private int mLastIndex;
|
117 |
|
private int mLastValue =-1;
|
|
117 |
private int[] mLastValue = new int[FRAME_DELAY];
|
118 |
118 |
// end section
|
119 |
119 |
////////////////////////////////////////////////////////////////////////////////
|
120 |
120 |
|
... | ... | |
173 |
173 |
|
174 |
174 |
// here bind the new SSBO and map it
|
175 |
175 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mSSBO[0]);
|
176 |
|
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, BUFFERING*mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ);
|
177 |
|
ByteBuffer buf = (ByteBuffer) GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, BUFFERING*mBufferSize*4, GLES31.GL_MAP_READ_BIT );
|
|
176 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, FRAME_DELAY *mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ);
|
|
177 |
ByteBuffer buf = (ByteBuffer) GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, FRAME_DELAY *mBufferSize*4, GLES31.GL_MAP_READ_BIT );
|
178 |
178 |
mIntBuffer = buf.order(ByteOrder.nativeOrder()).asIntBuffer();
|
179 |
179 |
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER,0, mSSBO[0]);
|
180 |
180 |
}
|
... | ... | |
184 |
184 |
if( mSurfaceID>=mBufferSize )
|
185 |
185 |
{
|
186 |
186 |
// increase size of the Buffer, copy over old values, remap.
|
187 |
|
int[] tmp = new int[BUFFERING*mBufferSize];
|
188 |
|
for(int i=0;i<BUFFERING*mBufferSize;i++) tmp[i] = mIntBuffer.get(i);
|
|
187 |
int[] tmp = new int[FRAME_DELAY *mBufferSize];
|
|
188 |
for(int i = 0; i< FRAME_DELAY *mBufferSize; i++) tmp[i] = mIntBuffer.get(i);
|
189 |
189 |
|
190 |
190 |
mBufferSize*= 2;
|
191 |
191 |
|
... | ... | |
194 |
194 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER,0);
|
195 |
195 |
|
196 |
196 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mSSBO[0]);
|
197 |
|
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, BUFFERING*mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ);
|
198 |
|
ByteBuffer buf = (ByteBuffer) GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, BUFFERING*mBufferSize*4, GLES31.GL_MAP_READ_BIT );
|
|
197 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, FRAME_DELAY *mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ);
|
|
198 |
ByteBuffer buf = (ByteBuffer) GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, FRAME_DELAY *mBufferSize*4, GLES31.GL_MAP_READ_BIT );
|
199 |
199 |
mIntBuffer = buf.order(ByteOrder.nativeOrder()).asIntBuffer();
|
200 |
200 |
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER,0, mSSBO[0]);
|
201 |
201 |
|
... | ... | |
218 |
218 |
|
219 |
219 |
void recreate()
|
220 |
220 |
{
|
221 |
|
mSSBO[0] = -1;
|
222 |
|
mLastValue = -1;
|
|
221 |
for(int i = 0; i< FRAME_DELAY; i++) mLastValue[i] = 0;
|
|
222 |
mSSBO[0]= -1;
|
223 |
223 |
mSurfaceCounter.releaseAll();
|
224 |
224 |
recreateSurface();
|
225 |
225 |
}
|
... | ... | |
228 |
228 |
|
229 |
229 |
int getNewCounter()
|
230 |
230 |
{
|
231 |
|
int value = mIntBuffer.get(BUFFERING*mSurfaceID+(mLastIndex==0 ? BUFFERING-1:mLastIndex-1));
|
232 |
|
|
233 |
|
if( value!=mLastValue )
|
234 |
|
{
|
235 |
|
mLastValue = value;
|
236 |
|
android.util.Log.d("surface", "surface id: "+mSurfaceID+" value now: "+mLastValue);
|
237 |
|
}
|
238 |
|
|
239 |
|
return BUFFERING*mSurfaceID + mLastIndex;
|
|
231 |
return FRAME_DELAY*mSurfaceID + mLastIndex;
|
240 |
232 |
}
|
241 |
233 |
|
242 |
234 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
524 |
516 |
GLES31.glClear(mClear);
|
525 |
517 |
DistortedRenderState.colorDepthStencilRestore();
|
526 |
518 |
|
527 |
|
mLastIndex++;
|
528 |
|
if( mLastIndex>=BUFFERING ) mLastIndex=0;
|
529 |
|
mIntBuffer.put(BUFFERING*mSurfaceID+mLastIndex,0);
|
|
519 |
if( ++mLastIndex >= FRAME_DELAY ) mLastIndex=0;
|
|
520 |
|
|
521 |
int index = (mLastIndex==0 ? FRAME_DELAY-1 : mLastIndex-1);
|
|
522 |
int value = mIntBuffer.get(FRAME_DELAY *mSurfaceID+index);
|
|
523 |
|
|
524 |
if( value!=mLastValue[index] )
|
|
525 |
{
|
|
526 |
// yes, this DOES keep on working when 'value' overflows into negative territory.
|
|
527 |
android.util.Log.d("surface", "surface id: "+mSurfaceID+" last frame: "+(value-mLastValue[index]) );
|
|
528 |
mLastValue[index] = value;
|
|
529 |
}
|
530 |
530 |
}
|
531 |
531 |
}
|
532 |
532 |
|
SSBO: correct various things.