// OpenGL ES 2.0 code #include #define LOG_TAG "GLPerf gl_code.cpp" #include #include #include #include #include #include #include #include #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; const int doLoopStates = 2; const int doSingleTestStates = 2; bool done; // Saves the parameters of the test (so we can print them out when we finish the timing.) char saveBuf[1024]; int pgm; void ptSwap() { } static void doSingleTest(uint32_t w, uint32_t h, bool useVarColor, int texCount, bool modulateFirstTex, int extraMath, int tex0, int tex1) { int doSingleTestState = (stateClock / doLoopStates) % doSingleTestStates; // LOGI("doSingleTest %d\n", doSingleTestState); switch (doSingleTestState) { case 0: { char *pgmTxt = genShader(useVarColor, texCount, modulateFirstTex, extraMath); pgm = createProgram(gVertexShader, pgmTxt); if (!pgm) { LOGE("error running test\n"); return; } int loc = glGetUniformLocation(pgm, "u_tex0"); if (loc >= 0) glUniform1i(loc, 0); loc = glGetUniformLocation(pgm, "u_tex1"); if (loc >= 0) glUniform1i(loc, 1); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, tex0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, tex1); glActiveTexture(GL_TEXTURE0); glBlendFunc(GL_ONE, GL_ONE); glDisable(GL_BLEND); char str2[1024]; sprintf(str2, "%i, %i, %i, %i, %i, 0", useVarColor, texCount, modulateFirstTex, extraMath, tex0); doLoop((stateClock % doLoopStates) != 0, pgm, w, h, str2); } break; case 1: { char str2[1024]; glEnable(GL_BLEND); sprintf(str2, "%i, %i, %i, %i, %i, 1", useVarColor, texCount, modulateFirstTex, extraMath, tex0); doLoop((stateClock % doLoopStates) != 0, pgm, w, h, str2); } break; } } void doTest(uint32_t w, uint32_t h) { int testState = stateClock / (doLoopStates * doSingleTestStates); int texCount; int extraMath; int testSubState; const int extraMathCount = 5; const int texCount0SubTestCount = 2; const int texCountNSubTestCount = 8; if ( testState < extraMathCount * texCount0SubTestCount) { texCount = 0; // Only 10 tests for texCount 0 extraMath = (testState / texCount0SubTestCount) % extraMathCount; testSubState = testState % texCount0SubTestCount; } else { texCount = 1 + (testState - extraMathCount * texCount0SubTestCount) / (extraMathCount * texCountNSubTestCount); extraMath = (testState / texCountNSubTestCount) % extraMathCount; testSubState = testState % texCountNSubTestCount; } if (texCount >= 3) { LOGI("done\n"); if (fOut) { fclose(fOut); fOut = NULL; } done = true; return; } // LOGI("doTest %d %d %d\n", texCount, extraMath, testSubState); switch(testSubState) { case 0: doSingleTest(w, h, false, texCount, false, extraMath, 1, 1); break; case 1: doSingleTest(w, h, true, texCount, false, extraMath, 1, 1); break; case 2: doSingleTest(w, h, false, texCount, true, extraMath, 1, 1); break; case 3: doSingleTest(w, h, true, texCount, true, extraMath, 1, 1); break; case 4: doSingleTest(w, h, false, texCount, false, extraMath, 2, 2); break; case 5: doSingleTest(w, h, true, texCount, false, extraMath, 2, 2); break; case 6: doSingleTest(w, h, false, texCount, true, extraMath, 2, 2); break; case 7: doSingleTest(w, h, true, texCount, true, extraMath, 2, 2); break; } } 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) { if (!done) { w = width; h = height; stateClock = 0; done = false; setupVA(); genTextures(); const char* fileName = "/sdcard/glperf.csv"; if (fOut != NULL) { LOGI("Closing partially written output.n"); fclose(fOut); fOut = NULL; } LOGI("Writing to: %s\n",fileName); fOut = fopen(fileName, "w"); if (fOut == NULL) { LOGE("Could not open: %s\n", fileName); } LOGI("\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(saveBuf, w, h, 1, 100); } doTest(w, h); stateClock++; } else { glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); } }