summaryrefslogtreecommitdiffstats
path: root/src/demos/es2/perftst/PerfTextLoad.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/demos/es2/perftst/PerfTextLoad.java')
-rwxr-xr-xsrc/demos/es2/perftst/PerfTextLoad.java219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/demos/es2/perftst/PerfTextLoad.java b/src/demos/es2/perftst/PerfTextLoad.java
new file mode 100755
index 0000000..55aad9a
--- /dev/null
+++ b/src/demos/es2/perftst/PerfTextLoad.java
@@ -0,0 +1,219 @@
+package demos.es2.perftst;
+
+import java.nio.*;
+import java.io.*;
+import java.net.*;
+import javax.media.opengl.*;
+import com.sun.opengl.util.*;
+import com.sun.opengl.util.texture.*;
+
+import com.sun.javafx.newt.*;
+import com.sun.javafx.newt.opengl.*;
+
+public class PerfTextLoad extends PerfModule {
+ static final int MAX_TEXTURE_ENGINES = 8;
+
+ public PerfTextLoad() {
+ }
+
+ public void initShaderState(GL2ES2 gl) {
+ initShaderState(gl, "vbo-vert-text", "ftext");
+ }
+
+ Texture[] textures = null;
+ TextureData[] textDatas = null;
+
+ protected void runOneSet(GLAutoDrawable drawable, String textBaseName, int numObjs, int numTextures, int loops) {
+ GL2ES2 gl = drawable.getGL().getGL2ES2();
+
+ if(numTextures>MAX_TEXTURE_ENGINES) {
+ throw new GLException("numTextures must be within 1.."+MAX_TEXTURE_ENGINES);
+ }
+
+ String textName = null;
+ textDatas = new TextureData[numObjs];
+ textures = new Texture[numTextures];
+ try {
+ for(int i=0; i<numObjs; i++) {
+ textName = "data/"+textBaseName+"."+(i+1)+".tga";
+ URL urlText = Locator.getResource(Perftst.class, textName);
+ if(urlText==null) {
+ throw new RuntimeException("couldn't fetch "+textName);
+ }
+ textDatas[i] = TextureIO.newTextureData(urlText.openStream(), false, TextureIO.TGA);
+ System.out.println(textBaseName+": "+textDatas[i]);
+ }
+
+ for(int i=0; i<numTextures; i++) {
+ gl.glActiveTexture(i);
+ textures[i] = new Texture(GL.GL_TEXTURE_2D);
+ }
+ } catch (IOException ioe) {
+ System.err.println("couldn't fetch "+textName);
+ throw new RuntimeException(ioe);
+ }
+
+ //
+ // Vertices Data setup
+ //
+
+ st.glUseProgram(gl, true);
+
+ GLArrayDataServer vertices = GLArrayDataServer.createGLSL(gl, "mgl_Vertex", 2, GL.GL_FLOAT, true, 4, GL.GL_STATIC_DRAW);
+ {
+ FloatBuffer vb = (FloatBuffer)vertices.getBuffer();
+ vb.put(0f); vb.put(0f);
+ vb.put(1f); vb.put(0f);
+ vb.put(0f); vb.put(1f);
+ vb.put(1f); vb.put(1f);
+ }
+ vertices.seal(gl, true);
+
+ GLArrayDataServer texCoords = GLArrayDataServer.createGLSL(gl, "mgl_MultiTexCoord0", 2, GL.GL_FLOAT, true, 4, GL.GL_STATIC_DRAW);
+ {
+ FloatBuffer cb = (FloatBuffer)texCoords.getBuffer();
+ cb.put(0f); cb.put(0f);
+ cb.put(1f); cb.put(0f);
+ cb.put(0f); cb.put(1f);
+ cb.put(1f); cb.put(1f);
+ }
+ texCoords.seal(gl, true);
+
+ //
+ // texture setup
+ //
+ long[] tU = new long[numObjs+1];
+ tU[0] = System.currentTimeMillis();
+ for(int j=0; j<numTextures; j++) {
+ gl.glActiveTexture(j);
+ textures[j].updateImage(textDatas[0]);
+ tU[j+1] = System.currentTimeMillis();
+ }
+
+ GLUniformData activeTexture = new GLUniformData("mgl_ActiveTexture", 0);
+ st.glUniform(gl, activeTexture);
+
+ //
+ // run loops
+ //
+
+ long dtC, dt, dt2, dt3, dtF, dtS, dtT;
+ long[][] tC = new long[loops][numObjs];
+ long[][] t0 = new long[loops][numObjs];
+ long[][][] t1 = new long[loops][numObjs][numTextures];
+ long[][][] t2 = new long[loops][numObjs][numTextures];
+ long[][][] t3 = new long[loops][numObjs][numTextures];
+ long[][] tF = new long[loops][numObjs];
+ long[][] tS = new long[loops][numObjs];
+
+ for(int i=0; i<loops; i++) {
+ for(int j=0; j<numObjs; j++) {
+ tC[i][j] = System.currentTimeMillis();
+
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT);
+
+ t0[i][j] = System.currentTimeMillis();
+
+ for(int k=0; k<numTextures; k++) {
+ gl.glActiveTexture(GL.GL_TEXTURE0+k);
+ textures[k].enable();
+ textures[k].bind();
+ activeTexture.setData(k);
+ st.glUniform(gl, activeTexture);
+
+ t1[i][j][k] = System.currentTimeMillis();
+
+ textures[k].updateSubImage(textDatas[j], 0, 0, 0);
+
+ t2[i][j][k] = System.currentTimeMillis();
+
+ gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, vertices.getElementNumber());
+
+ t3[i][j][k] = System.currentTimeMillis();
+ }
+ gl.glFinish();
+
+ tF[i][j] = System.currentTimeMillis();
+
+ drawable.swapBuffers();
+
+ tS[i][j] = System.currentTimeMillis();
+
+ /*try {
+ Thread.sleep(100);
+ } catch (Exception e) {} */
+ }
+
+ }
+
+ int textBytes = 0;
+ for(int j=0; j<numObjs; j++) {
+ textBytes += textDatas[j].getEstimatedMemorySize();
+ }
+ textBytes*=numTextures;
+
+ dt = 0;
+ for(int i=1; i<loops; i++) {
+ for(int j=0; j<numObjs; j++) {
+ dt += tS[i][j] - tC[i][j];
+ }
+ }
+
+ System.out.println("");
+ System.out.println("Texture "+textBaseName+", loops "+loops+", textures "+numTextures+", objects "+numObjs+
+ ", total bytes "+textBytes+", total time: "+dt +
+ "ms, fps(-1): "+(((loops-1)*numObjs*1000)/dt)+
+ ",\n text kB/s: " + ( ((double)(loops*textBytes)/1024.0) / ((double)dt/1000.0) ) );
+
+ for(int i=0; i<loops; i++) {
+ dtC = 0;
+ dtF = 0;
+ dtS = 0;
+ dtT = 0;
+ for(int j=0; j<numObjs; j++) {
+ dtC += t0[i][j] - tC[i][j];
+ dtF += tF[i][j] - t3[i][j][numTextures-1];
+ dtS += tS[i][j] - tF[i][j];
+ dtT += tS[i][j] - tC[i][j];
+ }
+ if(dtT<=0) dtT=1;
+ System.out.println("\tloop "+i+": clear "+dtC+"ms, finish "+dtF+", swap "+dtS+"ms, total: "+ dtT+"ms, fps "+(numObjs*1000)/dtT);
+ /*
+ for(int j=0; j<dummyUni.length; j++) {
+ dt = t1[i][j] - t0[i];
+ dt2= t2[i][j] - t1[i][j];
+ dt3= t3[i][j] - t2[i][j];
+ dtT= dt+dt2+dt3;
+ System.out.println("\t\tobj "+j+": setup "+dt +"ms, update "+dt2 +"ms, draw "+dt3+"ms, total: "+ dtT);
+ } */
+ }
+ System.out.println("*****************************************************************");
+
+ st.glUseProgram(gl, false);
+
+ for(int i=0; i<numTextures; i++) {
+ textures[i].disable();
+ textures[i].dispose();
+ textures[i]=null;
+ }
+ for(int i=0; i<numObjs; i++) {
+ textDatas[i] = null;
+ }
+ textures=null;
+ textDatas=null;
+ System.gc();
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {}
+ System.gc();
+ }
+
+ public void run(GLAutoDrawable drawable, int loops) {
+ runOneSet(drawable, "bob2.64x64", 33, 1, loops);
+ runOneSet(drawable, "bob2.128x128", 33, 1, loops);
+ runOneSet(drawable, "bob2.128x128", 4, 1, loops);
+ runOneSet(drawable, "bob2.256x256", 4, 1, loops);
+ runOneSet(drawable, "bob2.512x512", 4, 1, loops);
+ }
+
+}