Android Open Source - droidengine2d G L Debugger






From Project

Back to project page droidengine2d.

License

The source code is released under:

Apache License

If you think the Android project droidengine2d listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*   Copyright 2013-2014 Miguel Vicente Linares
 *//from www  . j av a2  s .  co  m
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.miviclin.droidengine2d.graphics;

import android.opengl.GLES20;
import android.opengl.GLException;
import android.opengl.GLU;
import android.util.Log;

/**
 * OpenGL debugger.<br>
 * Allows getting error messages from OpenGL errors, logging the number of draw calls, etc.
 * 
 * @author Miguel Vicente Linares
 * 
 */
public final class GLDebugger {

  private static final GLDebugger INSTANCE = new GLDebugger();

  public static final int FLAG_NO_LOGGING = 0;
  public static final int FLAG_LOG_NUM_DRAW_CALLS = 1;

  private boolean debugModeEnabled;
  private int numDrawCallsInCurrentFrame;
  private int numDrawCallsInPreviousFrame;
  private int logFlags;

  /**
   * Constructor.
   */
  private GLDebugger() {
    this.debugModeEnabled = false;
    this.numDrawCallsInCurrentFrame = 0;
    this.numDrawCallsInPreviousFrame = 0;
    this.logFlags = FLAG_NO_LOGGING;
  }

  /**
   * Returns the instance of GLDebugger.
   * 
   * @return GLDebugger
   */
  public static GLDebugger getInstance() {
    return INSTANCE;
  }

  /**
   * Sets logging flags. Use {@link GLDebugger#FLAG_NO_LOGGING} to disable logging.
   * 
   * @param flags Logging flags.
   */
  public void setLoggingFlags(int flags) {
    this.logFlags = flags;
  }

  /**
   * Checks if any OpenGL erros occurred before calling this method.<br>
   * If the debug mode is disabled, this method will not do anything.
   * 
   * @throws GLException If an error is detected.
   * @see GLDebugger#checkGLError()
   */
  public void passiveCheckGLError() {
    int errorCode;
    if (debugModeEnabled) {
      if ((errorCode = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
        throwGLException(errorCode);
      }
    }
  }

  /**
   * Checks if any OpenGL erros occurred before calling this method.<br>
   * If an error is detected, the debug mode will be enabled, so {@link #passiveCheckGLError()} calls will also check
   * for errors, making it easier to find the error source.
   * 
   * @throws GLException If an error is detected.
   */
  public void checkGLError() {
    int errorCode;
    if ((errorCode = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
      if (debugModeEnabled) {
        throwGLException(errorCode);
      } else {
        debugModeEnabled = true;
        while (true) {
          if (GLES20.glGetError() == GLES20.GL_NO_ERROR) {
            break;
          }
        }
      }
    }
  }

  /**
   * Throws a GLException with the specified error code. The exception will also contain the error message associated
   * with the specified error code.
   * 
   * @param errorCode Error code.
   * @throws GLException
   */
  private static void throwGLException(int errorCode) {
    throw new GLException(errorCode, "GLError " + errorCode + ", " + getErrorString(errorCode));
  }

  /**
   * Returns the error message associated with the specified error code.
   * 
   * @param error Error code.
   * @return Error message.
   */
  private static String getErrorString(int error) {
    String errorString = GLU.gluErrorString(error);
    if (errorString == null) {
      errorString = "Unknown error 0x" + Integer.toHexString(error);
    }
    return errorString;
  }

  /**
   * Returns the number of draw calls registered in the current frame.<br>
   * In order to register a draw call, {@link #incrementNumDrawCallsInCurrentFrame()} should be called after the draw
   * call is executed.<br>
   * Also {@link #resetNumDrawCallsInCurrentFrame()} should be called at the end of each frame.
   * 
   * @return Number of draw calls registered in the current frame.
   * 
   * @see GLDebugger#incrementNumDrawCallsInCurrentFrame()
   * @see GLDebugger#resetNumDrawCallsInCurrentFrame()
   * @see GLDebugger#getNumDrawCallsInPreviousFrame()
   */
  public int getNumDrawCallsInCurrentFrame() {
    return numDrawCallsInCurrentFrame;
  }

  /**
   * Returns the number of draw calls registered in the previously rendered frame.
   * 
   * @return Number of draw calls registered in the previously rendered frame.
   * 
   * @see GLDebugger#getNumDrawCallsInCurrentFrame()
   * @see GLDebugger#incrementNumDrawCallsInCurrentFrame()
   * @see GLDebugger#resetNumDrawCallsInCurrentFrame()
   */
  public int getNumDrawCallsInPreviousFrame() {
    return numDrawCallsInPreviousFrame;
  }

  /**
   * Increments the number of draw calls registered in the current frame.<br>
   * This method should be called after each draw call in order to register it.
   * 
   * @see GLDebugger#getNumDrawCallsInCurrentFrame()
   * @see GLDebugger#resetNumDrawCallsInCurrentFrame()
   * @see GLDebugger#getNumDrawCallsInPreviousFrame()
   */
  public void incrementNumDrawCallsInCurrentFrame() {
    numDrawCallsInCurrentFrame++;
  }

  /**
   * Sets the number of draw calls registered in the previous frame to the number of draw calls registered in the
   * current frame and resets the number of draw calls registered in the current frame.<br>
   * This method should be called at the end of each frame.
   * 
   * @see GLDebugger#getNumDrawCallsInCurrentFrame()
   * @see GLDebugger#incrementNumDrawCallsInCurrentFrame()
   * @see GLDebugger#getNumDrawCallsInPreviousFrame()
   */
  public void resetNumDrawCallsInCurrentFrame() {
    numDrawCallsInPreviousFrame = numDrawCallsInCurrentFrame;
    numDrawCallsInCurrentFrame = 0;
  }

  /**
   * Logs the number of draw calls registered in the current frame. If the flag
   * {@link GLDebugger#FLAG_LOG_NUM_DRAW_CALLS} is disabled, this method does not do anything.
   * 
   * @see #getNumDrawCallsInCurrentFrame()
   */
  public void logNumDrawCallsInCurrentFrame() {
    boolean flagLogNumDrawCallsSet = ((logFlags & FLAG_LOG_NUM_DRAW_CALLS) == FLAG_LOG_NUM_DRAW_CALLS);
    if (flagLogNumDrawCallsSet) {
      String tag = getClass().getSimpleName();
      Log.d(tag, "Number of draw calls in the current frame: " + getNumDrawCallsInCurrentFrame());
    }
  }

  /**
   * Logs the number of draw calls registered in the previously rendered frame. If the flag
   * {@link GLDebugger#FLAG_LOG_NUM_DRAW_CALLS} is disabled, this method does not do anything.
   * 
   * @see #getNumDrawCallsInPreviousFrame()
   */
  public void logNumDrawCallsInPreviousFrame() {
    boolean flagLogNumDrawCallsSet = ((logFlags & FLAG_LOG_NUM_DRAW_CALLS) == FLAG_LOG_NUM_DRAW_CALLS);
    if (flagLogNumDrawCallsSet) {
      String tag = getClass().getSimpleName();
      Log.d(tag, "Number of draw calls in the previous frame: " + getNumDrawCallsInPreviousFrame());
    }
  }

}




Java Source Code List

com.miviclin.droidengine2d.AbstractGame.java
com.miviclin.droidengine2d.EngineActivity.java
com.miviclin.droidengine2d.EngineLock.java
com.miviclin.droidengine2d.Engine.java
com.miviclin.droidengine2d.GameThread.java
com.miviclin.droidengine2d.Game.java
com.miviclin.droidengine2d.audio.MusicPlayer.java
com.miviclin.droidengine2d.audio.SoundManager.java
com.miviclin.droidengine2d.gamestate.GameStateAdapter.java
com.miviclin.droidengine2d.gamestate.GameStateManager.java
com.miviclin.droidengine2d.gamestate.GameStateNotRegisteredException.java
com.miviclin.droidengine2d.gamestate.GameState.java
com.miviclin.droidengine2d.gamestate.OnGameStateChangeListener.java
com.miviclin.droidengine2d.graphics.Color.java
com.miviclin.droidengine2d.graphics.DefaultRenderer.java
com.miviclin.droidengine2d.graphics.EngineRenderer.java
com.miviclin.droidengine2d.graphics.GLDebugger.java
com.miviclin.droidengine2d.graphics.GLRenderer.java
com.miviclin.droidengine2d.graphics.GLView.java
com.miviclin.droidengine2d.graphics.Graphics.java
com.miviclin.droidengine2d.graphics.animation.AnimationFrame.java
com.miviclin.droidengine2d.graphics.animation.AnimationStateAdapter.java
com.miviclin.droidengine2d.graphics.animation.AnimationStateListener.java
com.miviclin.droidengine2d.graphics.animation.Animation.java
com.miviclin.droidengine2d.graphics.cameras.Camera.java
com.miviclin.droidengine2d.graphics.cameras.OrthographicCamera.java
com.miviclin.droidengine2d.graphics.material.BlendingOptions.java
com.miviclin.droidengine2d.graphics.material.ColorMaterial.java
com.miviclin.droidengine2d.graphics.material.Material.java
com.miviclin.droidengine2d.graphics.material.TextureColorMaterial.java
com.miviclin.droidengine2d.graphics.material.TextureHsvMaterial.java
com.miviclin.droidengine2d.graphics.material.TextureMaterial.java
com.miviclin.droidengine2d.graphics.material.TransparentTextureMaterial.java
com.miviclin.droidengine2d.graphics.material.UnsupportedMaterialException.java
com.miviclin.droidengine2d.graphics.mesh.ColorMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.Geometry.java
com.miviclin.droidengine2d.graphics.mesh.GraphicsBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.RectangleBatchGeometry.java
com.miviclin.droidengine2d.graphics.mesh.RectangleBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TextureColorMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TextureHsvMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TextureMaterialBatchRendererBase.java
com.miviclin.droidengine2d.graphics.mesh.TextureMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TransparentTextureMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.shader.ShaderProgramException.java
com.miviclin.droidengine2d.graphics.shader.ShaderProgram.java
com.miviclin.droidengine2d.graphics.shader.ShaderVars.java
com.miviclin.droidengine2d.graphics.text.BitmapFont.java
com.miviclin.droidengine2d.graphics.text.FontChar.java
com.miviclin.droidengine2d.graphics.text.Font.java
com.miviclin.droidengine2d.graphics.text.UndefinedCharacterException.java
com.miviclin.droidengine2d.graphics.texture.TextureAtlas.java
com.miviclin.droidengine2d.graphics.texture.TextureManager.java
com.miviclin.droidengine2d.graphics.texture.TexturePackerAtlas.java
com.miviclin.droidengine2d.graphics.texture.TextureRegion.java
com.miviclin.droidengine2d.graphics.texture.Texture.java
com.miviclin.droidengine2d.input.DefaultKeyEventProcessor.java
com.miviclin.droidengine2d.input.GameInputManager.java
com.miviclin.droidengine2d.input.GameStateInputManager.java
com.miviclin.droidengine2d.input.KeyEventInfo.java
com.miviclin.droidengine2d.input.KeyEventProcessor.java
com.miviclin.droidengine2d.input.KeyProcessor.java
com.miviclin.droidengine2d.input.MotionEventProcessor.java
com.miviclin.droidengine2d.input.TouchProcessor.java
com.miviclin.droidengine2d.input.sensor.AccelerometerValuesListener.java
com.miviclin.droidengine2d.input.sensor.Accelerometer.java
com.miviclin.droidengine2d.input.sensor.SensorUtilities.java
com.miviclin.droidengine2d.resources.AssetsLoader.java
com.miviclin.droidengine2d.util.ActivityUtilities.java
com.miviclin.droidengine2d.util.MutexLock.java
com.miviclin.droidengine2d.util.PrimitiveTypeSize.java
com.miviclin.droidengine2d.util.TransformUtilities.java
com.miviclin.droidengine2d.util.Transform.java
com.miviclin.droidengine2d.util.math.Matrix4.java
com.miviclin.droidengine2d.util.math.MatrixFix.java
com.miviclin.droidengine2d.util.math.Vector2.java
com.miviclin.droidengine2d.util.math.Vector3.java
com.miviclin.droidengine2d.util.time.TimeConstants.java
com.miviclin.droidengine2d.util.time.TimeCounter.java