| 88 |
88 |
}
|
| 89 |
89 |
|
| 90 |
90 |
private static int mBufferSize=(0x1<<23); // 8 million entries
|
|
91 |
|
| 91 |
92 |
private static IntBuffer mIntBuffer;
|
| 92 |
93 |
|
|
94 |
private static ByteBuffer mBuf;
|
|
95 |
private static IntBuffer mIntBuf;
|
|
96 |
|
| 93 |
97 |
/// BLIT DEPTH RENDER PROGRAM ///
|
| 94 |
98 |
private static DistortedProgram mBlitDepthRenderProgram;
|
| 95 |
99 |
private static int mBlitDepthRenderDepthTextureH;
|
| ... | ... | |
| 118 |
122 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException
|
| 119 |
123 |
{
|
| 120 |
124 |
// MAIN PROGRAM ////////////////////////////////////
|
|
125 |
android.util.Log.e("Effects", "creating main program");
|
|
126 |
|
| 121 |
127 |
final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
|
| 122 |
128 |
final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
|
| 123 |
129 |
|
| ... | ... | |
| 136 |
142 |
|
| 137 |
143 |
String[] feedback = { "v_Position", "v_endPosition" };
|
| 138 |
144 |
|
| 139 |
|
mMainProgram = new DistortedProgram( mainVertStream, mainFragStream, mainVertHeader, mainFragHeader,
|
| 140 |
|
enabledEffectV, enabledEffectF, Distorted.GLSL, feedback);
|
|
145 |
try
|
|
146 |
{
|
|
147 |
mMainProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader,
|
|
148 |
enabledEffectV, enabledEffectF, Distorted.GLSL, feedback);
|
|
149 |
}
|
|
150 |
catch(Exception e)
|
|
151 |
{
|
|
152 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile MAIN program: "+e.getMessage());
|
|
153 |
throw new RuntimeException(e.getMessage());
|
|
154 |
}
|
| 141 |
155 |
|
| 142 |
156 |
int mainProgramH = mMainProgram.getProgramHandle();
|
| 143 |
157 |
EffectQueueFragment.getUniforms(mainProgramH);
|
| ... | ... | |
| 147 |
161 |
mCountIndexH = GLES31.glGetUniformLocation( mainProgramH, "u_currentIndex");
|
| 148 |
162 |
|
| 149 |
163 |
// BLIT PROGRAM ////////////////////////////////////
|
|
164 |
android.util.Log.e("Effects", "creating blit program");
|
|
165 |
|
| 150 |
166 |
final InputStream blitVertStream = resources.openRawResource(R.raw.blit_vertex_shader);
|
| 151 |
167 |
final InputStream blitFragStream = resources.openRawResource(R.raw.blit_fragment_shader);
|
| 152 |
168 |
|
| ... | ... | |
| 159 |
175 |
}
|
| 160 |
176 |
catch(Exception e)
|
| 161 |
177 |
{
|
| 162 |
|
Log.e("EFFECTS", "exception trying to compile BLIT program: "+e.getMessage());
|
|
178 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile BLIT program: "+e.getMessage());
|
| 163 |
179 |
throw new RuntimeException(e.getMessage());
|
| 164 |
180 |
}
|
| 165 |
181 |
|
| ... | ... | |
| 168 |
184 |
mBlitDepthH = GLES31.glGetUniformLocation( blitProgramH, "u_Depth");
|
| 169 |
185 |
|
| 170 |
186 |
// BLIT DEPTH PROGRAM ////////////////////////////////////
|
|
187 |
android.util.Log.e("Effects", "creating blit depth program");
|
|
188 |
|
| 171 |
189 |
final InputStream blitDepthVertStream = resources.openRawResource(R.raw.blit_depth_vertex_shader);
|
| 172 |
190 |
final InputStream blitDepthFragStream = resources.openRawResource(R.raw.blit_depth_fragment_shader);
|
| 173 |
191 |
|
| ... | ... | |
| 177 |
195 |
}
|
| 178 |
196 |
catch(Exception e)
|
| 179 |
197 |
{
|
| 180 |
|
Log.e("EFFECTS", "exception trying to compile BLIT DEPTH program: "+e.getMessage());
|
|
198 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile BLIT DEPTH program: "+e.getMessage());
|
| 181 |
199 |
throw new RuntimeException(e.getMessage());
|
| 182 |
200 |
}
|
| 183 |
201 |
|
| ... | ... | |
| 196 |
214 |
{
|
| 197 |
215 |
GLES31.glGenBuffers(1,mLinkedListSSBO,0);
|
| 198 |
216 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);
|
| 199 |
|
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ);
|
|
217 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);
|
|
218 |
|
|
219 |
mBuf = (ByteBuffer)GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, mBufferSize*4, GLES31.GL_MAP_READ_BIT);
|
|
220 |
mIntBuf = mBuf.order(ByteOrder.nativeOrder()).asIntBuffer();
|
|
221 |
|
| 200 |
222 |
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);
|
| 201 |
223 |
}
|
| 202 |
224 |
|
| ... | ... | |
| 209 |
231 |
}
|
| 210 |
232 |
|
| 211 |
233 |
// BLIT DEPTH RENDER PROGRAM ///////////////////////////
|
|
234 |
android.util.Log.e("Effects", "creating blit depth render program");
|
|
235 |
|
| 212 |
236 |
final InputStream blitDepthRenderVertStream = resources.openRawResource(R.raw.blit_depth_vertex_shader);
|
| 213 |
237 |
final InputStream blitDepthRenderFragStream = resources.openRawResource(R.raw.blit_depth_render_fragment_shader);
|
| 214 |
238 |
|
| ... | ... | |
| 218 |
242 |
}
|
| 219 |
243 |
catch(Exception e)
|
| 220 |
244 |
{
|
| 221 |
|
Log.e("EFFECTS", "exception trying to compile BLIT DEPTH RENDER program: "+e.getMessage());
|
|
245 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile BLIT DEPTH RENDER program: "+e.getMessage());
|
| 222 |
246 |
throw new RuntimeException(e.getMessage());
|
| 223 |
247 |
}
|
| 224 |
248 |
|
| ... | ... | |
| 229 |
253 |
mBlitDepthRenderSizeH = GLES31.glGetUniformLocation( blitDepthRenderProgramH, "u_Size");
|
| 230 |
254 |
|
| 231 |
255 |
// NORMAL PROGRAM //////////////////////////////////////
|
|
256 |
android.util.Log.e("Effects", "creating normal program");
|
|
257 |
|
| 232 |
258 |
final InputStream normalVertexStream = resources.openRawResource(R.raw.normal_vertex_shader);
|
| 233 |
259 |
final InputStream normalFragmentStream = resources.openRawResource(R.raw.normal_fragment_shader);
|
| 234 |
260 |
|
| ... | ... | |
| 238 |
264 |
}
|
| 239 |
265 |
catch(Exception e)
|
| 240 |
266 |
{
|
| 241 |
|
Log.e("EFFECTS", "exception trying to compile NORMAL program: "+e.getMessage());
|
|
267 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile NORMAL program: "+e.getMessage());
|
| 242 |
268 |
throw new RuntimeException(e.getMessage());
|
| 243 |
269 |
}
|
| 244 |
270 |
|
| ... | ... | |
| 411 |
437 |
{
|
| 412 |
438 |
mBlitDepthRenderProgram.useProgram();
|
| 413 |
439 |
|
|
440 |
analyzeBuffer(surface.mWidth, surface.mHeight);
|
|
441 |
|
| 414 |
442 |
GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
|
| 415 |
443 |
GLES31.glUniform1i(mBlitDepthRenderDepthTextureH, 1);
|
| 416 |
444 |
GLES31.glUniform2f(mBlitDepthRenderTexCorrH, corrW, corrH );
|
| ... | ... | |
| 426 |
454 |
}
|
| 427 |
455 |
|
| 428 |
456 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 429 |
|
|
|
457 |
|
|
458 |
|
|
459 |
private static void analyzeBuffer(int w, int h)
|
|
460 |
{
|
|
461 |
int ptr;
|
|
462 |
final int GREEN = (255<<16) + 255;
|
|
463 |
final int RED = (255<<24) + 255;
|
|
464 |
|
|
465 |
int left1=0, left2=0;
|
|
466 |
int right1=0, right2=0;
|
|
467 |
int overflow = 0;
|
|
468 |
|
|
469 |
for(int row=0; row<h; row++)
|
|
470 |
for(int col=0; col<w; col++)
|
|
471 |
{
|
|
472 |
ptr = mIntBuf.get( col+row*w );
|
|
473 |
|
|
474 |
if( ptr!=0 )
|
|
475 |
{
|
|
476 |
if( ptr>0 && ptr<mBufferSize )
|
|
477 |
{
|
|
478 |
ptr = mIntBuf.get(ptr);
|
|
479 |
|
|
480 |
if ((2*col>w) && ptr != RED)
|
|
481 |
{
|
|
482 |
if (ptr==GREEN) right1++;
|
|
483 |
else right2++;
|
|
484 |
}
|
|
485 |
if ((2*col<=w) && ptr != GREEN)
|
|
486 |
{
|
|
487 |
if (ptr==RED) left1++;
|
|
488 |
else left2++;
|
|
489 |
}
|
|
490 |
}
|
|
491 |
else
|
|
492 |
{
|
|
493 |
overflow++;
|
|
494 |
}
|
|
495 |
}
|
|
496 |
}
|
|
497 |
|
|
498 |
android.util.Log.e("surface", " left1: "+left1+" left2: "+left2+" right1: "+right1+" right2: "+right2+" overflow: "+overflow);
|
|
499 |
}
|
|
500 |
|
|
501 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
502 |
|
| 430 |
503 |
private void releasePriv()
|
| 431 |
504 |
{
|
| 432 |
505 |
if( !matrixCloned ) mM.abortAll(false);
|
Order Independent Transparency: debugging