85 |
85 |
|
86 |
86 |
private static IntBuffer mIntBuffer;
|
87 |
87 |
|
88 |
|
private static ByteBuffer mBuf;
|
89 |
|
private static IntBuffer mIntBuf;
|
|
88 |
private static ByteBuffer mBuf, mAtomicBuf;
|
|
89 |
private static IntBuffer mIntBuf, mAtomicIntBuf;
|
90 |
90 |
|
91 |
91 |
/// BLIT DEPTH RENDER PROGRAM ///
|
92 |
92 |
private static DistortedProgram mBlitDepthRenderProgram;
|
... | ... | |
192 |
192 |
if( mLinkedListSSBO[0]<0 )
|
193 |
193 |
{
|
194 |
194 |
GLES31.glGenBuffers(1,mLinkedListSSBO,0);
|
|
195 |
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
|
195 |
196 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
|
196 |
197 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);
|
197 |
|
|
198 |
|
mBuf = (ByteBuffer)GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, mBufferSize*4, GLES31.GL_MAP_READ_BIT);
|
199 |
|
mIntBuf = mBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
|
200 |
|
|
201 |
|
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
|
|
198 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
|
202 |
199 |
}
|
203 |
200 |
|
204 |
201 |
if( mAtomicCounter[0]<0 )
|
205 |
202 |
{
|
206 |
203 |
GLES31.glGenBuffers(1,mAtomicCounter,0);
|
|
204 |
GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[0]);
|
207 |
205 |
GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );
|
208 |
206 |
GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, mIntBuffer, GLES31.GL_DYNAMIC_DRAW);
|
209 |
207 |
GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);
|
... | ... | |
408 |
406 |
|
409 |
407 |
// reset atomic counter to 0
|
410 |
408 |
GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );
|
411 |
|
GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, mIntBuffer, GLES31.GL_DYNAMIC_DRAW);
|
|
409 |
|
|
410 |
mAtomicBuf = (ByteBuffer)GLES31.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,
|
|
411 |
GLES31.GL_MAP_READ_BIT|GLES31.GL_MAP_WRITE_BIT);
|
|
412 |
if( mAtomicBuf!=null )
|
|
413 |
{
|
|
414 |
mAtomicIntBuf = mAtomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
|
|
415 |
|
|
416 |
int counter = mAtomicIntBuf.get(0);
|
|
417 |
mAtomicIntBuf.put(0, 0);
|
|
418 |
//android.util.Log.e("counter", "now = "+counter+" w="+surface.mWidth+" h="+surface.mHeight
|
|
419 |
// +" diff="+(counter-surface.mWidth*surface.mHeight));
|
|
420 |
}
|
|
421 |
else
|
|
422 |
{
|
|
423 |
android.util.Log.e("counter", "failed to map buffer");
|
|
424 |
}
|
|
425 |
|
|
426 |
GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER);
|
412 |
427 |
GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);
|
413 |
428 |
}
|
414 |
429 |
|
415 |
430 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
416 |
431 |
|
417 |
|
|
418 |
432 |
private static void analyzeBuffer(int w, int h)
|
419 |
433 |
{
|
420 |
|
int ptr;
|
421 |
|
final int GREEN = 1;
|
422 |
|
final int RED = 2;
|
|
434 |
int ptr, index;
|
|
435 |
int errors = 0;
|
423 |
436 |
|
424 |
|
int left1=0, left2=0;
|
425 |
|
int right1=0, right2=0;
|
426 |
|
int overflow = 0;
|
|
437 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
|
|
438 |
mBuf = (ByteBuffer)GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, mBufferSize*4, GLES31.GL_MAP_READ_BIT);
|
|
439 |
mIntBuf = mBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
|
427 |
440 |
|
428 |
|
for(int row=0; row<h; row++)
|
429 |
|
for(int col=0; col<w; col++)
|
|
441 |
for(int col=0; col<w; col++)
|
|
442 |
for(int row=0; row<h; row++)
|
430 |
443 |
{
|
431 |
|
ptr = mIntBuf.get( col+row*w );
|
|
444 |
index = col+row*w;
|
|
445 |
ptr = mIntBuf.get(index);
|
432 |
446 |
|
433 |
447 |
if( ptr!=0 )
|
434 |
448 |
{
|
435 |
449 |
if( ptr>0 && ptr<mBufferSize )
|
436 |
450 |
{
|
437 |
451 |
ptr = mIntBuf.get(ptr);
|
438 |
|
|
439 |
|
if ((2*col>w) && ptr != RED)
|
440 |
|
{
|
441 |
|
if (ptr==GREEN) right1++;
|
442 |
|
else right2++;
|
443 |
|
}
|
444 |
|
if ((2*col<=w) && ptr != GREEN)
|
|
452 |
if( ptr != index )
|
445 |
453 |
{
|
446 |
|
if (ptr==RED) left1++;
|
447 |
|
else left2++;
|
|
454 |
android.util.Log.d("surface", "col="+col+" row="+row+" val="+ptr+" expected: "+index);
|
|
455 |
errors++;
|
448 |
456 |
}
|
449 |
457 |
}
|
450 |
458 |
else
|
451 |
459 |
{
|
452 |
|
overflow++;
|
|
460 |
android.util.Log.d("surface", "overflow!");
|
453 |
461 |
}
|
454 |
462 |
}
|
455 |
463 |
}
|
456 |
464 |
|
457 |
|
android.util.Log.e("surface", " left1: "+left1+" left2: "+left2+" right1: "+right1+" right2: "+right2+" overflow: "+overflow);
|
|
465 |
GLES31.glUnmapBuffer(GLES31.GL_SHADER_STORAGE_BUFFER);
|
|
466 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);
|
|
467 |
|
|
468 |
if( errors>0 ) android.util.Log.e("surface", "errors: "+errors);
|
458 |
469 |
}
|
459 |
470 |
|
460 |
471 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
Fix the 'OIT' artefacts.