// OpenGL ES 2.0 code

#include <jni.h>
#define LOG_TAG "GLPerf gl_code.cpp"
#include <utils/Log.h>

#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <utils/Timers.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "../../gl_perf/fill_common.cpp"


//////////////////////////

// Width and height of the screen

uint32_t w;
uint32_t h;

// The stateClock starts at zero and increments by 1 every time we draw a frame. It is used to control which phase of the test we are in.

int stateClock;
bool done;

// Saves the parameters of the test (so we can print them out when we finish the timing.)


int pgm;

void ptSwap() {
}

void doTest() {
    uint32_t testNum = stateClock >> 2;
    int texSize = ((stateClock >> 1) & 0x1) + 1;

    if (testNum >= gFragmentTestCount) {
       ALOGI("done\n");
       if (fOut) {
           fclose(fOut);
           fOut = NULL;
       }
       done = true;
       return;
    }

    // ALOGI("doTest %d %d %d\n", texCount, extraMath, testSubState);

//        for (uint32_t num = 0; num < gFragmentTestCount; num++) {
    doSingleTest(testNum, texSize);
}

extern "C" {
    JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * env, jobject obj,  jint width, jint height);
    JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_step(JNIEnv * env, jobject obj);
};

JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * /*env*/, jobject /*obj*/,  jint width, jint height)
{
    gWidth = width;
    gHeight = height;
    if (!done) {
            stateClock = 0;
            done = false;
            setupVA();
            genTextures();
            const char* fileName = "/sdcard/glperf.csv";
            if (fOut != NULL) {
                 ALOGI("Closing partially written output.n");
                 fclose(fOut);
                 fOut = NULL;
            }
            ALOGI("Writing to: %s\n",fileName);
            fOut = fopen(fileName, "w");
            if (fOut == NULL) {
                ALOGE("Could not open: %s\n", fileName);
            }

            ALOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
            if (fOut) fprintf(fOut,"varColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\r\n");
    }
}

JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_step(JNIEnv * /*env*/, jobject /*obj*/)
{
    if (! done) {
        if (stateClock > 0 && ((stateClock & 1) == 0)) {
            //endTimer(100);
        }
        doTest();
        stateClock++;
    } else {
            glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    }
}
