1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 #include <jni.h> 15 16 #include <android/native_window.h> 17 #include <android/native_window_jni.h> 18 19 #include <graphics/GLUtils.h> 20 #include <graphics/Renderer.h> 21 22 #include "ReferenceRenderer.h" 23 24 extern "C" JNIEXPORT jboolean JNICALL 25 Java_android_opengl2_cts_reference_GLGameActivity_startBenchmark( 26 JNIEnv* env, jclass /*clazz*/, jobject assetManager, jobject surface, jint numFrames, 27 jdoubleArray setUpTimes, jdoubleArray updateTimes, jdoubleArray renderTimes) { 28 29 GLUtils::setEnvAndAssetManager(env, assetManager); 30 31 if (numFrames > (ReferenceRenderer::FRAMES_PER_SCENE * ReferenceRenderer::NUM_SCENES)) { 32 return false; 33 } 34 35 ANativeWindow* nativeWindow = ANativeWindow_fromSurface(env, surface); 36 ReferenceRenderer* renderer = new ReferenceRenderer(nativeWindow); 37 bool success = renderer->eglSetUp(); 38 success = renderer->setUp(0) && success; 39 env->SetDoubleArrayRegion( 40 setUpTimes, 0, ReferenceRenderer::NUM_SETUP_TIMES, renderer->mSetUpTimes); 41 42 double updates[numFrames]; 43 double renders[numFrames]; 44 for (int i = 0; i < numFrames && success; i++) { 45 double t0 = GLUtils::currentTimeMillis(); 46 success = renderer->update(i); 47 double t1 = GLUtils::currentTimeMillis(); 48 success = success && renderer->draw(); 49 double t2 = GLUtils::currentTimeMillis(); 50 updates[i] = t1 - t0; 51 renders[i] = t2 - t1; 52 } 53 54 env->SetDoubleArrayRegion(updateTimes, 0, numFrames, updates); 55 env->SetDoubleArrayRegion(renderTimes, 0, numFrames, renders); 56 57 success = renderer->tearDown() && success; 58 renderer->eglTearDown(); 59 delete renderer; 60 renderer = NULL; 61 62 ANativeWindow_release(nativeWindow); 63 64 return success; 65 } 66