示例#1
0
  @Override
  public void init(final GLAutoDrawable glad) {
    if (null != textureData) {
      texture = TextureIO.newTexture(glad.getGL(), textureData);
    }
    final GL2ES2 gl = glad.getGL().getGL2ES2();

    initShader(gl, true);

    // setup mgl_PMVMatrix
    pmvMatrix = new PMVMatrix();
    pmvMatrix.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
    pmvMatrix.glLoadIdentity();
    pmvMatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
    pmvMatrix.glLoadIdentity();
    pmvMatrixUniform =
        new GLUniformData("mgl_PMVMatrix", 4, 4, pmvMatrix.glGetPMvMatrixf()); // P, Mv

    st.ownUniform(pmvMatrixUniform);
    if (!st.uniform(gl, pmvMatrixUniform)) {
      throw new GLException("Error setting PMVMatrix in shader: " + st);
    }
    if (!st.uniform(gl, new GLUniformData("mgl_ActiveTexture", textureUnit))) {
      throw new GLException("Error setting mgl_ActiveTexture in shader: " + st);
    }

    if (null != texture) {
      // fetch the flipped texture coordinates
      texture.getImageTexCoords().getST_LB_RB_LT_RT(s_quadTexCoords, 0, 1f, 1f);
    }

    interleavedVBO =
        GLArrayDataServer.createGLSLInterleaved(
            3 + 4 + 2, GL.GL_FLOAT, false, 3 * 4, GL.GL_STATIC_DRAW);
    {
      interleavedVBO.addGLSLSubArray("mgl_Vertex", 3, GL.GL_ARRAY_BUFFER);
      interleavedVBO.addGLSLSubArray("mgl_Color", 4, GL.GL_ARRAY_BUFFER);
      // interleavedVBO.addGLSLSubArray("mgl_Normal",        3, GL.GL_ARRAY_BUFFER);
      interleavedVBO.addGLSLSubArray("mgl_MultiTexCoord", 2, GL.GL_ARRAY_BUFFER);

      final FloatBuffer ib = (FloatBuffer) interleavedVBO.getBuffer();

      for (int i = 0; i < 4; i++) {
        ib.put(s_quadVertices, i * 3, 3);
        ib.put(s_quadColors, i * 4, 4);
        // ib.put(s_cubeNormals,   i*3, 3);
        ib.put(s_quadTexCoords, i * 2, 2);
      }
    }
    interleavedVBO.seal(gl, true);
    interleavedVBO.enableBuffer(gl, false);
    st.ownAttribute(interleavedVBO, true);

    // OpenGL Render Settings
    gl.glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
    gl.glEnable(GL.GL_DEPTH_TEST);

    if (keepTextureBound && null != texture) {
      gl.glActiveTexture(GL.GL_TEXTURE0 + textureUnit);
      texture.enable(gl);
      texture.bind(gl);
    }
    st.useProgram(gl, false);
  }
    /* pp */ GenericEye(
        final GenericStereoDevice device,
        final int distortionBits,
        final float[] eyePositionOffset,
        final EyeParameter eyeParam,
        final DimensionImmutable textureSize,
        final RectangleImmutable eyeViewport) {
      this.eyeName = eyeParam.number;
      this.distortionBits = distortionBits;
      this.viewport = eyeViewport;

      final boolean usePP = null != device.config.distortionMeshProducer && 0 != distortionBits;

      final boolean usesTimewarp = usePP && StereoUtil.usesTimewarpDistortion(distortionBits);
      final FloatBuffer fstash = Buffers.newDirectFloatBuffer(2 + 2 + (usesTimewarp ? 16 + 16 : 0));

      if (usePP) {
        eyeToSourceUVScale =
            new GLUniformData("svr_EyeToSourceUVScale", 2, Buffers.slice2Float(fstash, 0, 2));
        eyeToSourceUVOffset =
            new GLUniformData("svr_EyeToSourceUVOffset", 2, Buffers.slice2Float(fstash, 2, 2));
      } else {
        eyeToSourceUVScale = null;
        eyeToSourceUVOffset = null;
      }

      if (usesTimewarp) {
        eyeRotationStart =
            new GLUniformData("svr_EyeRotationStart", 4, 4, Buffers.slice2Float(fstash, 4, 16));
        eyeRotationEnd =
            new GLUniformData("svr_EyeRotationEnd", 4, 4, Buffers.slice2Float(fstash, 20, 16));
      } else {
        eyeRotationStart = null;
        eyeRotationEnd = null;
      }

      this.eyeParameter = eyeParam;

      // Setup: eyeToSourceUVScale, eyeToSourceUVOffset
      if (usePP) {
        final ScaleAndOffset2D textureScaleAndOffset =
            new ScaleAndOffset2D(eyeParam.fovhv, textureSize, eyeViewport);
        if (StereoDevice.DEBUG) {
          System.err.println("XXX." + eyeName + ": eyeParam      " + eyeParam);
          System.err.println("XXX." + eyeName + ": uvScaleOffset " + textureScaleAndOffset);
          System.err.println("XXX." + eyeName + ": textureSize   " + textureSize);
          System.err.println("XXX." + eyeName + ": viewport      " + eyeViewport);
        }
        final FloatBuffer eyeToSourceUVScaleFB = eyeToSourceUVScale.floatBufferValue();
        eyeToSourceUVScaleFB.put(0, textureScaleAndOffset.scale[0]);
        eyeToSourceUVScaleFB.put(1, textureScaleAndOffset.scale[1]);
        final FloatBuffer eyeToSourceUVOffsetFB = eyeToSourceUVOffset.floatBufferValue();
        eyeToSourceUVOffsetFB.put(0, textureScaleAndOffset.offset[0]);
        eyeToSourceUVOffsetFB.put(1, textureScaleAndOffset.offset[1]);
      } else {
        vertexCount = 0;
        indexCount = 0;
        iVBO = null;
        vboPos = null;
        vboParams = null;
        vboTexCoordsR = null;
        vboTexCoordsG = null;
        vboTexCoordsB = null;
        indices = null;
        if (StereoDevice.DEBUG) {
          System.err.println("XXX." + eyeName + ": " + this);
        }
        return;
      }
      final DistortionMesh meshData =
          device.config.distortionMeshProducer.create(eyeParam, distortionBits);
      if (null == meshData) {
        throw new GLException(
            "Failed to create meshData for eye "
                + eyeParam
                + ", and "
                + StereoUtil.distortionBitsToString(distortionBits));
      }

      vertexCount = meshData.vertexCount;
      indexCount = meshData.indexCount;

      /**
       * 2+2+2+2+2: { vec2 position, vec2 color, vec2 texCoordR, vec2 texCoordG, vec2 texCoordB }
       */
      final boolean useChromatic = StereoUtil.usesChromaticDistortion(distortionBits);
      final boolean useVignette = StereoUtil.usesVignetteDistortion(distortionBits);

      final int compsPerElement =
          2 + 2 + 2 + (useChromatic ? 2 + 2 /* texCoordG + texCoordB */ : 0);
      iVBO =
          GLArrayDataServer.createGLSLInterleaved(
              compsPerElement, GL.GL_FLOAT, false, vertexCount, GL.GL_STATIC_DRAW);
      vboPos = iVBO.addGLSLSubArray("svr_Position", 2, GL.GL_ARRAY_BUFFER);
      vboParams = iVBO.addGLSLSubArray("svr_Params", 2, GL.GL_ARRAY_BUFFER);
      vboTexCoordsR = iVBO.addGLSLSubArray("svr_TexCoordR", 2, GL.GL_ARRAY_BUFFER);
      if (useChromatic) {
        vboTexCoordsG = iVBO.addGLSLSubArray("svr_TexCoordG", 2, GL.GL_ARRAY_BUFFER);
        vboTexCoordsB = iVBO.addGLSLSubArray("svr_TexCoordB", 2, GL.GL_ARRAY_BUFFER);
      } else {
        vboTexCoordsG = null;
        vboTexCoordsB = null;
      }
      indices =
          GLArrayDataServer.createData(
              1, GL.GL_SHORT, indexCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);

      /**
       * 2+2+2+2+2: { vec2 position, vec2 color, vec2 texCoordR, vec2 texCoordG, vec2 texCoordB }
       */
      final FloatBuffer iVBOFB = (FloatBuffer) iVBO.getBuffer();

      for (int vertNum = 0; vertNum < vertexCount; vertNum++) {
        final DistortionMesh.DistortionVertex v = meshData.vertices[vertNum];
        int dataIdx = 0;

        if (StereoDevice.DUMP_DATA) {
          System.err.println("XXX." + eyeName + ": START VERTEX " + vertNum + " / " + vertexCount);
        }
        // pos
        if (v.pos_size >= 2) {
          if (StereoDevice.DUMP_DATA) {
            System.err.println(
                "XXX." + eyeName + ": pos [" + v.data[dataIdx] + ", " + v.data[dataIdx + 1] + "]");
          }
          iVBOFB.put(v.data[dataIdx]);
          iVBOFB.put(v.data[dataIdx + 1]);
        } else {
          iVBOFB.put(0f);
          iVBOFB.put(0f);
        }
        dataIdx += v.pos_size;

        // params
        if (v.vignetteFactor_size >= 1 && useVignette) {
          if (StereoDevice.DUMP_DATA) {
            System.err.println("XXX." + eyeName + ": vignette " + v.data[dataIdx]);
          }
          iVBOFB.put(v.data[dataIdx]);
        } else {
          iVBOFB.put(1.0f);
        }
        dataIdx += v.vignetteFactor_size;

        if (v.timewarpFactor_size >= 1) {
          if (StereoDevice.DUMP_DATA) {
            System.err.println("XXX." + eyeName + ": timewarp " + v.data[dataIdx]);
          }
          iVBOFB.put(v.data[dataIdx]);
        } else {
          iVBOFB.put(1.0f);
        }
        dataIdx += v.timewarpFactor_size;

        // texCoordR
        if (v.texR_size >= 2) {
          if (StereoDevice.DUMP_DATA) {
            System.err.println(
                "XXX." + eyeName + ": texR [" + v.data[dataIdx] + ", " + v.data[dataIdx + 1] + "]");
          }
          iVBOFB.put(v.data[dataIdx]);
          iVBOFB.put(v.data[dataIdx + 1]);
        } else {
          iVBOFB.put(1f);
          iVBOFB.put(1f);
        }
        dataIdx += v.texR_size;

        if (useChromatic) {
          // texCoordG
          if (v.texG_size >= 2) {
            if (StereoDevice.DUMP_DATA) {
              System.err.println(
                  "XXX."
                      + eyeName
                      + ": texG ["
                      + v.data[dataIdx]
                      + ", "
                      + v.data[dataIdx + 1]
                      + "]");
            }
            iVBOFB.put(v.data[dataIdx]);
            iVBOFB.put(v.data[dataIdx + 1]);
          } else {
            iVBOFB.put(1f);
            iVBOFB.put(1f);
          }
          dataIdx += v.texG_size;

          // texCoordB
          if (v.texB_size >= 2) {
            if (StereoDevice.DUMP_DATA) {
              System.err.println(
                  "XXX."
                      + eyeName
                      + ": texB ["
                      + v.data[dataIdx]
                      + ", "
                      + v.data[dataIdx + 1]
                      + "]");
            }
            iVBOFB.put(v.data[dataIdx]);
            iVBOFB.put(v.data[dataIdx + 1]);
          } else {
            iVBOFB.put(1f);
            iVBOFB.put(1f);
          }
          dataIdx += v.texB_size;
        } else {
          dataIdx += v.texG_size;
          dataIdx += v.texB_size;
        }
      }
      if (StereoDevice.DUMP_DATA) {
        System.err.println("XXX." + eyeName + ": iVBO " + iVBO);
      }
      {
        if (StereoDevice.DUMP_DATA) {
          System.err.println("XXX." + eyeName + ": idx " + indices + ", count " + indexCount);
          for (int i = 0; i < indexCount; i++) {
            if (0 == i % 16) {
              System.err.printf("%n%5d: ", i);
            }
            System.err.printf("%5d, ", (int) meshData.indices[i]);
          }
          System.err.println();
        }
        final ShortBuffer out = (ShortBuffer) indices.getBuffer();
        out.put(meshData.indices, 0, meshData.indexCount);
      }
      if (StereoDevice.DEBUG) {
        System.err.println("XXX." + eyeName + ": " + this);
      }
    }
示例#3
0
  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 = IOUtil.getResource(Perftst.class, textName);
        if (urlText == null) {
          throw new RuntimeException("couldn't fetch " + textName);
        }
        textDatas[i] =
            TextureIO.newTextureData(gl.getGLProfile(), 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.useProgram(gl, true);

    GLArrayDataServer vertices =
        GLArrayDataServer.createGLSL("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(
            "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(gl, textDatas[0]);
      tU[j + 1] = System.currentTimeMillis();
    }

    GLUniformData activeTexture = new GLUniformData("mgl_ActiveTexture", 0);
    st.uniform(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(gl);
          textures[k].bind(gl);
          activeTexture.setData(k);
          st.uniform(gl, activeTexture);

          t1[i][j][k] = System.currentTimeMillis();

          textures[k].updateSubImage(gl, textDatas[j], 0, 0, 0);

          t2[i][j][k] = System.currentTimeMillis();

          gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, vertices.getElementCount());

          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.useProgram(gl, false);

    for (int i = 0; i < numTextures; i++) {
      textures[i].disable(gl);
      textures[i].destroy(gl);
      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();
  }