1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker *
4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5*b7c941bbSAndroid Build Coastguard Worker * in compliance with the License. You may obtain a copy of the License at
6*b7c941bbSAndroid Build Coastguard Worker *
7*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
8*b7c941bbSAndroid Build Coastguard Worker *
9*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software distributed under the License
10*b7c941bbSAndroid Build Coastguard Worker * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11*b7c941bbSAndroid Build Coastguard Worker * or implied. See the License for the specific language governing permissions and limitations under
12*b7c941bbSAndroid Build Coastguard Worker * the License.
13*b7c941bbSAndroid Build Coastguard Worker */
14*b7c941bbSAndroid Build Coastguard Worker #include <jni.h>
15*b7c941bbSAndroid Build Coastguard Worker
16*b7c941bbSAndroid Build Coastguard Worker #include <stdlib.h>
17*b7c941bbSAndroid Build Coastguard Worker #include <android/log.h>
18*b7c941bbSAndroid Build Coastguard Worker
19*b7c941bbSAndroid Build Coastguard Worker #include <android/native_window.h>
20*b7c941bbSAndroid Build Coastguard Worker #include <android/native_window_jni.h>
21*b7c941bbSAndroid Build Coastguard Worker
22*b7c941bbSAndroid Build Coastguard Worker #include <graphics/GLUtils.h>
23*b7c941bbSAndroid Build Coastguard Worker #include <graphics/Renderer.h>
24*b7c941bbSAndroid Build Coastguard Worker
25*b7c941bbSAndroid Build Coastguard Worker #include "fullpipeline/FullPipelineRenderer.h"
26*b7c941bbSAndroid Build Coastguard Worker #include "pixeloutput/PixelOutputRenderer.h"
27*b7c941bbSAndroid Build Coastguard Worker #include "shaderperf/ShaderPerfRenderer.h"
28*b7c941bbSAndroid Build Coastguard Worker #include "contextswitch/ContextSwitchRenderer.h"
29*b7c941bbSAndroid Build Coastguard Worker
30*b7c941bbSAndroid Build Coastguard Worker // Holds the current benchmark's renderer.
31*b7c941bbSAndroid Build Coastguard Worker Renderer* gRenderer = NULL;
32*b7c941bbSAndroid Build Coastguard Worker ANativeWindow* gNativeWindow = NULL;
33*b7c941bbSAndroid Build Coastguard Worker
34*b7c941bbSAndroid Build Coastguard Worker enum {
35*b7c941bbSAndroid Build Coastguard Worker FULL_PIPELINE_BENCHMARK = 0,
36*b7c941bbSAndroid Build Coastguard Worker PIXEL_OUTPUT_BENCHMARK = 1,
37*b7c941bbSAndroid Build Coastguard Worker SHADER_PERF_BENCHMARK = 2,
38*b7c941bbSAndroid Build Coastguard Worker CONTEXT_SWITCH_BENCHMARK = 3
39*b7c941bbSAndroid Build Coastguard Worker };
40*b7c941bbSAndroid Build Coastguard Worker
41*b7c941bbSAndroid Build Coastguard Worker extern "C" JNIEXPORT jboolean JNICALL
Java_android_opengl2_cts_primitive_GLPrimitiveActivity_startBenchmark(JNIEnv * env,jclass,jint workload,jint numFrames,jdoubleArray frameTimes)42*b7c941bbSAndroid Build Coastguard Worker Java_android_opengl2_cts_primitive_GLPrimitiveActivity_startBenchmark(
43*b7c941bbSAndroid Build Coastguard Worker JNIEnv* env, jclass /*clazz*/, jint workload, jint numFrames, jdoubleArray frameTimes) {
44*b7c941bbSAndroid Build Coastguard Worker if (gRenderer == NULL) {
45*b7c941bbSAndroid Build Coastguard Worker return false;
46*b7c941bbSAndroid Build Coastguard Worker }
47*b7c941bbSAndroid Build Coastguard Worker
48*b7c941bbSAndroid Build Coastguard Worker // Sets up the renderer.
49*b7c941bbSAndroid Build Coastguard Worker bool success = gRenderer->setUp(workload);
50*b7c941bbSAndroid Build Coastguard Worker
51*b7c941bbSAndroid Build Coastguard Worker // Records the start time.
52*b7c941bbSAndroid Build Coastguard Worker double start = GLUtils::currentTimeMillis();
53*b7c941bbSAndroid Build Coastguard Worker
54*b7c941bbSAndroid Build Coastguard Worker // Offscreen renders 100 tiles per frame so reduce the number of frames to render.
55*b7c941bbSAndroid Build Coastguard Worker if (gRenderer->mOffscreen) {
56*b7c941bbSAndroid Build Coastguard Worker numFrames /= Renderer::OFFSCREEN_INNER_FRAMES;
57*b7c941bbSAndroid Build Coastguard Worker }
58*b7c941bbSAndroid Build Coastguard Worker
59*b7c941bbSAndroid Build Coastguard Worker // Draw off the screen.
60*b7c941bbSAndroid Build Coastguard Worker for (int i = 0; i < numFrames && success; i++) {
61*b7c941bbSAndroid Build Coastguard Worker // Draw a frame.
62*b7c941bbSAndroid Build Coastguard Worker success = gRenderer->draw();
63*b7c941bbSAndroid Build Coastguard Worker }
64*b7c941bbSAndroid Build Coastguard Worker
65*b7c941bbSAndroid Build Coastguard Worker // Records the end time.
66*b7c941bbSAndroid Build Coastguard Worker double end = GLUtils::currentTimeMillis();
67*b7c941bbSAndroid Build Coastguard Worker
68*b7c941bbSAndroid Build Coastguard Worker // Sets the times in the Java array.
69*b7c941bbSAndroid Build Coastguard Worker double times[] = {start, end};
70*b7c941bbSAndroid Build Coastguard Worker env->SetDoubleArrayRegion(frameTimes, 0, 2, times);
71*b7c941bbSAndroid Build Coastguard Worker
72*b7c941bbSAndroid Build Coastguard Worker success = gRenderer->tearDown() && success;
73*b7c941bbSAndroid Build Coastguard Worker return success;
74*b7c941bbSAndroid Build Coastguard Worker }
75*b7c941bbSAndroid Build Coastguard Worker
76*b7c941bbSAndroid Build Coastguard Worker // The following functions create the renderers for the various benchmarks.
77*b7c941bbSAndroid Build Coastguard Worker extern "C" JNIEXPORT void JNICALL
Java_android_opengl2_cts_primitive_GLPrimitiveActivity_setupBenchmark(JNIEnv * env,jclass,jobject surface,jint benchmark,jboolean offscreen)78*b7c941bbSAndroid Build Coastguard Worker Java_android_opengl2_cts_primitive_GLPrimitiveActivity_setupBenchmark(
79*b7c941bbSAndroid Build Coastguard Worker JNIEnv* env, jclass /*clazz*/, jobject surface, jint benchmark,
80*b7c941bbSAndroid Build Coastguard Worker jboolean offscreen) {
81*b7c941bbSAndroid Build Coastguard Worker gNativeWindow = ANativeWindow_fromSurface(env, surface);
82*b7c941bbSAndroid Build Coastguard Worker switch (benchmark) {
83*b7c941bbSAndroid Build Coastguard Worker case FULL_PIPELINE_BENCHMARK:
84*b7c941bbSAndroid Build Coastguard Worker gRenderer = new FullPipelineRenderer(gNativeWindow, offscreen);
85*b7c941bbSAndroid Build Coastguard Worker break;
86*b7c941bbSAndroid Build Coastguard Worker case PIXEL_OUTPUT_BENCHMARK:
87*b7c941bbSAndroid Build Coastguard Worker gRenderer = new PixelOutputRenderer(gNativeWindow, offscreen);
88*b7c941bbSAndroid Build Coastguard Worker break;
89*b7c941bbSAndroid Build Coastguard Worker case SHADER_PERF_BENCHMARK:
90*b7c941bbSAndroid Build Coastguard Worker gRenderer = new ShaderPerfRenderer(gNativeWindow, offscreen);
91*b7c941bbSAndroid Build Coastguard Worker break;
92*b7c941bbSAndroid Build Coastguard Worker case CONTEXT_SWITCH_BENCHMARK:
93*b7c941bbSAndroid Build Coastguard Worker gRenderer = new ContextSwitchRenderer(gNativeWindow, offscreen);
94*b7c941bbSAndroid Build Coastguard Worker break;
95*b7c941bbSAndroid Build Coastguard Worker default:
96*b7c941bbSAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_ERROR, "GLPrimitive",
97*b7c941bbSAndroid Build Coastguard Worker "Unknown benchmark '%d'", benchmark);
98*b7c941bbSAndroid Build Coastguard Worker ANativeWindow_release(gNativeWindow);
99*b7c941bbSAndroid Build Coastguard Worker gNativeWindow = NULL;
100*b7c941bbSAndroid Build Coastguard Worker return;
101*b7c941bbSAndroid Build Coastguard Worker }
102*b7c941bbSAndroid Build Coastguard Worker
103*b7c941bbSAndroid Build Coastguard Worker // Set up call will log error conditions
104*b7c941bbSAndroid Build Coastguard Worker if (!gRenderer->eglSetUp()) {
105*b7c941bbSAndroid Build Coastguard Worker delete gRenderer;
106*b7c941bbSAndroid Build Coastguard Worker gRenderer = NULL;
107*b7c941bbSAndroid Build Coastguard Worker
108*b7c941bbSAndroid Build Coastguard Worker ANativeWindow_release(gNativeWindow);
109*b7c941bbSAndroid Build Coastguard Worker gNativeWindow = NULL;
110*b7c941bbSAndroid Build Coastguard Worker }
111*b7c941bbSAndroid Build Coastguard Worker }
112*b7c941bbSAndroid Build Coastguard Worker
113*b7c941bbSAndroid Build Coastguard Worker extern "C" JNIEXPORT void JNICALL
Java_android_opengl2_cts_primitive_GLPrimitiveActivity_tearDownBenchmark(JNIEnv *,jclass)114*b7c941bbSAndroid Build Coastguard Worker Java_android_opengl2_cts_primitive_GLPrimitiveActivity_tearDownBenchmark(
115*b7c941bbSAndroid Build Coastguard Worker JNIEnv* /*env*/, jclass /*clazz*/) {
116*b7c941bbSAndroid Build Coastguard Worker if (gRenderer == NULL) {
117*b7c941bbSAndroid Build Coastguard Worker return;
118*b7c941bbSAndroid Build Coastguard Worker }
119*b7c941bbSAndroid Build Coastguard Worker gRenderer->eglTearDown();
120*b7c941bbSAndroid Build Coastguard Worker delete gRenderer;
121*b7c941bbSAndroid Build Coastguard Worker gRenderer = NULL;
122*b7c941bbSAndroid Build Coastguard Worker
123*b7c941bbSAndroid Build Coastguard Worker ANativeWindow_release(gNativeWindow);
124*b7c941bbSAndroid Build Coastguard Worker gNativeWindow = NULL;
125*b7c941bbSAndroid Build Coastguard Worker }
126