xref: /aosp_15_r20/cts/tests/openglperf2/jni/primitive/GLPrimitive.cpp (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
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