@Override
  public void onDrawFrame(GL10 glUnused) {

    boolean barrelDistortionEnabled = mDisplayModeManager.isAntiDistortionEnabled();

    glCheck("MD360Renderer onDrawFrame 0");

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

    glCheck("MD360Renderer onDrawFrame 1");
    int size = mDisplayModeManager.getVisibleSize();

    int width = (int) (this.mWidth * 1.0f / size);
    int height = mHeight;

    if (barrelDistortionEnabled) {
      // Barrel Distortion take over
      mBarrelDistortionPlugin.takeOver(mWidth, mHeight, size);
    }

    for (int i = 0; i < size; i++) {
      MD360Director director = mProjectionModeManager.getDirectors().get(i);
      GLES20.glViewport(width * i, 0, width, height);
      GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
      GLES20.glScissor(width * i, 0, width, height);

      Iterator<MDAbsPlugin> iterator = mPluginManager.getPlugins().iterator();
      while (iterator.hasNext()) {
        MDAbsPlugin plugin = iterator.next();
        plugin.setup(mContext);
        plugin.renderer(i, width, height, director);
      }

      GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
    }

    if (barrelDistortionEnabled) {
      // Barrel Distortion render
      for (int i = 0; i < size; i++) {

        GLES20.glViewport(width * i, 0, width, mHeight);
        GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
        GLES20.glScissor(width * i, 0, width, mHeight);
        mBarrelDistortionPlugin.commit(i);
        GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
      }
    }

    // mFps.step();
  }
  private MD360Renderer(Builder params) {
    mContext = params.context;
    mDisplayModeManager = params.displayModeManager;
    mProjectionModeManager = params.projectionModeManager;
    mPluginManager = params.pluginManager;

    mBarrelDistortionPlugin =
        new MDBarrelDistortionPlugin(mDisplayModeManager.getBarrelDistortionConfig());
    mPluginManager.add(mBarrelDistortionPlugin);
  }