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
Java_android_opengl2_cts_reference_GLGameActivity_startBenchmark(JNIEnv * env,jclass,jobject assetManager,jobject surface,jint numFrames,jdoubleArray setUpTimes,jdoubleArray updateTimes,jdoubleArray renderTimes)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