| /* |
| * 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 <stdlib.h> |
| |
| #include <android/native_window.h> |
| #include <android/native_window_jni.h> |
| |
| #include <graphics/GLUtils.h> |
| #include <graphics/Renderer.h> |
| |
| #include "fullpipeline/FullPipelineRenderer.h" |
| #include "pixeloutput/PixelOutputRenderer.h" |
| #include "shaderperf/ShaderPerfRenderer.h" |
| #include "contextswitch/ContextSwitchRenderer.h" |
| |
| // Holds the current benchmark's renderer. |
| Renderer* gRenderer = NULL; |
| ANativeWindow* gNativeWindow = NULL; |
| |
| enum { |
| FULL_PIPELINE_BENCHMARK = 0, |
| PIXEL_OUTPUT_BENCHMARK = 1, |
| SHADER_PERF_BENCHMARK = 2, |
| CONTEXT_SWITCH_BENCHMARK = 3 |
| }; |
| |
| extern "C" JNIEXPORT jboolean JNICALL |
| Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_startBenchmark( |
| JNIEnv* env, jclass /*clazz*/, jint workload, jint numFrames, jdoubleArray frameTimes) { |
| if (gRenderer == NULL) { |
| return false; |
| } |
| |
| // Sets up the renderer. |
| bool success = gRenderer->setUp(workload); |
| |
| // Records the start time. |
| double start = GLUtils::currentTimeMillis(); |
| |
| // Offscreen renders 100 tiles per frame so reduce the number of frames to render. |
| if (gRenderer->mOffscreen) { |
| numFrames /= Renderer::OFFSCREEN_INNER_FRAMES; |
| } |
| |
| // Draw off the screen. |
| for (int i = 0; i < numFrames && success; i++) { |
| // Draw a frame. |
| success = gRenderer->draw(); |
| } |
| |
| // Records the end time. |
| double end = GLUtils::currentTimeMillis(); |
| |
| // Sets the times in the Java array. |
| double times[] = {start, end}; |
| env->SetDoubleArrayRegion(frameTimes, 0, 2, times); |
| |
| success = gRenderer->tearDown() && success; |
| return success; |
| } |
| |
| // The following functions create the renderers for the various benchmarks. |
| extern "C" JNIEXPORT void JNICALL |
| Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_setupBenchmark( |
| JNIEnv* env, jclass /*clazz*/, jobject surface, jint benchmark, |
| jboolean offscreen) { |
| gNativeWindow = ANativeWindow_fromSurface(env, surface); |
| switch (benchmark) { |
| case FULL_PIPELINE_BENCHMARK: |
| gRenderer = new FullPipelineRenderer(gNativeWindow, offscreen); |
| break; |
| case PIXEL_OUTPUT_BENCHMARK: |
| gRenderer = new PixelOutputRenderer(gNativeWindow, offscreen); |
| break; |
| case SHADER_PERF_BENCHMARK: |
| gRenderer = new ShaderPerfRenderer(gNativeWindow, offscreen); |
| break; |
| case CONTEXT_SWITCH_BENCHMARK: |
| gRenderer = new ContextSwitchRenderer(gNativeWindow, offscreen); |
| break; |
| default: |
| ALOGE("Unknown benchmark '%d'", benchmark); |
| ANativeWindow_release(gNativeWindow); |
| gNativeWindow = NULL; |
| return; |
| } |
| |
| // Set up call will log error conditions |
| if (!gRenderer->eglSetUp()) { |
| delete gRenderer; |
| gRenderer = NULL; |
| |
| ANativeWindow_release(gNativeWindow); |
| gNativeWindow = NULL; |
| } |
| } |
| |
| extern "C" JNIEXPORT void JNICALL |
| Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_tearDownBenchmark( |
| JNIEnv* /*env*/, jclass /*clazz*/) { |
| if (gRenderer == NULL) { |
| return; |
| } |
| gRenderer->eglTearDown(); |
| delete gRenderer; |
| gRenderer = NULL; |
| |
| ANativeWindow_release(gNativeWindow); |
| gNativeWindow = NULL; |
| } |