Revision 66ace7f5
Added by Leszek Koltunski over 7 years ago
| src/main/java/org/distorted/library/main/DistortedOutputSurface.java | ||
|---|---|---|
| 26 | 26 |
|
| 27 | 27 |
import java.nio.ByteBuffer; |
| 28 | 28 |
import java.nio.ByteOrder; |
| 29 |
import java.nio.IntBuffer; |
|
| 29 | 30 |
import java.util.ArrayList; |
| 30 | 31 |
|
| 31 | 32 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 104 | 105 |
private static int mBufferSize =10; |
| 105 | 106 |
private static DistortedObjectCounter mSurfaceCounter = new DistortedObjectCounter(); |
| 106 | 107 |
private static int[] mSSBO = new int[1]; |
| 107 |
private static ByteBuffer mSSBOBuffer;
|
|
| 108 |
private static IntBuffer mIntBuffer;
|
|
| 108 | 109 |
|
| 109 | 110 |
static |
| 110 | 111 |
{
|
| 111 |
mSSBO[0] = -1; |
|
| 112 |
mSSBOBuffer = ByteBuffer.allocateDirect(BUFFERING*mBufferSize*4).order(ByteOrder.nativeOrder()); |
|
| 112 |
mSSBO[0]= -1; |
|
| 113 | 113 |
} |
| 114 | 114 |
|
| 115 | 115 |
private int mSurfaceID; |
| 116 | 116 |
private int mLastIndex; |
| 117 |
|
|
| 118 | 117 |
// end section |
| 119 | 118 |
//////////////////////////////////////////////////////////////////////////////// |
| 120 | 119 |
|
| ... | ... | |
| 162 | 161 |
createProjection(); |
| 163 | 162 |
} |
| 164 | 163 |
|
| 165 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 166 |
|
|
| 167 |
void error(String msg) |
|
| 168 |
{
|
|
| 169 |
int err = GLES31.glGetError(); |
|
| 170 |
|
|
| 171 |
if( err != GLES31.GL_NO_ERROR ) |
|
| 172 |
{
|
|
| 173 |
android.util.Log.e("surface", msg+" error: "+err);
|
|
| 174 |
} |
|
| 175 |
} |
|
| 176 |
|
|
| 177 | 164 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 178 | 165 |
// Must be called from a thread holding OpenGL Context |
| 179 | 166 |
|
| ... | ... | |
| 185 | 172 |
|
| 186 | 173 |
// here bind the new SSBO and map it |
| 187 | 174 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mSSBO[0]); |
| 188 |
error("pre1");
|
|
| 189 | 175 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, BUFFERING*mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ); |
| 190 |
error("pre2");
|
|
| 191 |
mSSBOBuffer = (ByteBuffer) GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, BUFFERING*mBufferSize*4, GLES31.GL_MAP_READ_BIT ); |
|
| 192 |
error("pre3");
|
|
| 176 |
ByteBuffer buf = (ByteBuffer) GLES31.glMapBufferRange(GLES31.GL_SHADER_STORAGE_BUFFER, 0, BUFFERING*mBufferSize*4, GLES31.GL_MAP_READ_BIT ); |
|
| 177 |
mIntBuffer = buf.order(ByteOrder.nativeOrder()).asIntBuffer(); |
|
| 193 | 178 |
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER,0, mSSBO[0]); |
| 194 |
error("pre4");
|
|
| 195 | 179 |
} |
| 196 | 180 |
|
| 197 | 181 |
mSurfaceID = mSurfaceCounter.returnNext(); |
| ... | ... | |
| 227 | 211 |
|
| 228 | 212 |
int resetNewCounter() |
| 229 | 213 |
{
|
| 230 |
//mSSBOBuffer.putInt(BUFFERING*mSurfaceID+mLastIndex,0);
|
|
| 214 |
//mIntBuffer.put(BUFFERING*mSurfaceID+mLastIndex,0);
|
|
| 231 | 215 |
return BUFFERING*mSurfaceID + mLastIndex; |
| 232 | 216 |
} |
| 233 | 217 |
|
| ... | ... | |
| 235 | 219 |
|
| 236 | 220 |
int returnOldCounter() |
| 237 | 221 |
{
|
| 238 |
int ret = mSSBOBuffer.getInt(BUFFERING*mSurfaceID+mLastIndex);
|
|
| 222 |
int ret = mIntBuffer.get(BUFFERING*mSurfaceID+mLastIndex);
|
|
| 239 | 223 |
|
| 240 | 224 |
mLastIndex++; |
| 241 | 225 |
if( mLastIndex>=BUFFERING ) mLastIndex-=BUFFERING; |
| ... | ... | |
| 247 | 231 |
|
| 248 | 232 |
int returnCounter() |
| 249 | 233 |
{
|
| 250 |
return mSSBOBuffer.getInt(0);
|
|
| 234 |
return mIntBuffer.get(0);
|
|
| 251 | 235 |
} |
| 252 | 236 |
|
| 253 | 237 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
SSBO: fix problems with endianness.