blob: dc0b4e235edb832c1647f427f6f437a1285e4bab [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
#include <jni.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
#include <graphics/GLUtils.h>
#include <graphics/Renderer.h>
#include "ReferenceRenderer.h"
extern "C" JNIEXPORT jboolean JNICALL
Java_com_android_cts_opengl_reference_GLGameActivity_startBenchmark(
JNIEnv* env, jclass /*clazz*/, jobject assetManager, jobject surface, jint numFrames,
jdoubleArray setUpTimes, jdoubleArray updateTimes, jdoubleArray renderTimes) {
GLUtils::setEnvAndAssetManager(env, assetManager);
if (numFrames > (ReferenceRenderer::FRAMES_PER_SCENE * ReferenceRenderer::NUM_SCENES)) {
return false;
}
ANativeWindow* nativeWindow = ANativeWindow_fromSurface(env, surface);
ReferenceRenderer* renderer = new ReferenceRenderer(nativeWindow);
bool success = renderer->eglSetUp();
success = renderer->setUp(0) && success;
env->SetDoubleArrayRegion(
setUpTimes, 0, ReferenceRenderer::NUM_SETUP_TIMES, renderer->mSetUpTimes);
double updates[numFrames];
double renders[numFrames];
for (int i = 0; i < numFrames && success; i++) {
double t0 = GLUtils::currentTimeMillis();
success = renderer->update(i);
double t1 = GLUtils::currentTimeMillis();
success = success && renderer->draw();
double t2 = GLUtils::currentTimeMillis();
updates[i] = t1 - t0;
renders[i] = t2 - t1;
}
env->SetDoubleArrayRegion(updateTimes, 0, numFrames, updates);
env->SetDoubleArrayRegion(renderTimes, 0, numFrames, renders);
success = renderer->tearDown() && success;
renderer->eglTearDown();
delete renderer;
renderer = NULL;
ANativeWindow_release(nativeWindow);
return success;
}