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 "ReferenceRenderer.h"
15*b7c941bbSAndroid Build Coastguard Worker
16*b7c941bbSAndroid Build Coastguard Worker #include "scene/flocking/FlockingScene.h"
17*b7c941bbSAndroid Build Coastguard Worker #include "scene/glowing/GlowingScene.h"
18*b7c941bbSAndroid Build Coastguard Worker
19*b7c941bbSAndroid Build Coastguard Worker #include <graphics/GLUtils.h>
20*b7c941bbSAndroid Build Coastguard Worker #include <graphics/ProgramNode.h>
21*b7c941bbSAndroid Build Coastguard Worker
22*b7c941bbSAndroid Build Coastguard Worker #include <android/log.h>
23*b7c941bbSAndroid Build Coastguard Worker #include <Trace.h>
24*b7c941bbSAndroid Build Coastguard Worker
ReferenceRenderer(ANativeWindow * window)25*b7c941bbSAndroid Build Coastguard Worker ReferenceRenderer::ReferenceRenderer(ANativeWindow* window) :
26*b7c941bbSAndroid Build Coastguard Worker Renderer(window, false) {
27*b7c941bbSAndroid Build Coastguard Worker }
28*b7c941bbSAndroid Build Coastguard Worker
setUp(int workload)29*b7c941bbSAndroid Build Coastguard Worker bool ReferenceRenderer::setUp(int workload) {
30*b7c941bbSAndroid Build Coastguard Worker SCOPED_TRACE();
31*b7c941bbSAndroid Build Coastguard Worker // Reset the times.
32*b7c941bbSAndroid Build Coastguard Worker for (int i = 0; i < NUM_SETUP_TIMES; i++) {
33*b7c941bbSAndroid Build Coastguard Worker mSetUpTimes[i] = 0;
34*b7c941bbSAndroid Build Coastguard Worker }
35*b7c941bbSAndroid Build Coastguard Worker // Set up OpenGLES.
36*b7c941bbSAndroid Build Coastguard Worker double start = GLUtils::currentTimeMillis();
37*b7c941bbSAndroid Build Coastguard Worker if (!Renderer::setUp(workload)) {
38*b7c941bbSAndroid Build Coastguard Worker return false;
39*b7c941bbSAndroid Build Coastguard Worker }
40*b7c941bbSAndroid Build Coastguard Worker mSetUpTimes[0] = GLUtils::currentTimeMillis() - start;
41*b7c941bbSAndroid Build Coastguard Worker
42*b7c941bbSAndroid Build Coastguard Worker // Create the scenes.
43*b7c941bbSAndroid Build Coastguard Worker mScenes[0] = new FlockingScene(mWidth, mHeight);
44*b7c941bbSAndroid Build Coastguard Worker mScenes[1] = new GlowingScene(mWidth, mHeight);
45*b7c941bbSAndroid Build Coastguard Worker // TODO add more scenes to do a comprehensive test.
46*b7c941bbSAndroid Build Coastguard Worker
47*b7c941bbSAndroid Build Coastguard Worker // Set up the scenes.
48*b7c941bbSAndroid Build Coastguard Worker double times[NUM_SETUP_TIMES];
49*b7c941bbSAndroid Build Coastguard Worker for (int i = 0; i < NUM_SCENES; i++) {
50*b7c941bbSAndroid Build Coastguard Worker times[0] = GLUtils::currentTimeMillis();
51*b7c941bbSAndroid Build Coastguard Worker mScenes[i]->setUpContext();
52*b7c941bbSAndroid Build Coastguard Worker times[1] = GLUtils::currentTimeMillis();
53*b7c941bbSAndroid Build Coastguard Worker mScenes[i]->setUpTextures();
54*b7c941bbSAndroid Build Coastguard Worker times[2] = GLUtils::currentTimeMillis();
55*b7c941bbSAndroid Build Coastguard Worker mScenes[i]->setUpMeshes();
56*b7c941bbSAndroid Build Coastguard Worker times[3] = GLUtils::currentTimeMillis();
57*b7c941bbSAndroid Build Coastguard Worker
58*b7c941bbSAndroid Build Coastguard Worker for (int i = 1; i < NUM_SETUP_TIMES; i++) {
59*b7c941bbSAndroid Build Coastguard Worker // Add on the set up times.
60*b7c941bbSAndroid Build Coastguard Worker mSetUpTimes[i] += times[i] - times[i - 1];
61*b7c941bbSAndroid Build Coastguard Worker }
62*b7c941bbSAndroid Build Coastguard Worker }
63*b7c941bbSAndroid Build Coastguard Worker return true;
64*b7c941bbSAndroid Build Coastguard Worker }
65*b7c941bbSAndroid Build Coastguard Worker
tearDown()66*b7c941bbSAndroid Build Coastguard Worker bool ReferenceRenderer::tearDown() {
67*b7c941bbSAndroid Build Coastguard Worker SCOPED_TRACE();
68*b7c941bbSAndroid Build Coastguard Worker for (int i = 0; i < NUM_SCENES; i++) {
69*b7c941bbSAndroid Build Coastguard Worker mScenes[i]->tearDown();
70*b7c941bbSAndroid Build Coastguard Worker delete mScenes[i];
71*b7c941bbSAndroid Build Coastguard Worker }
72*b7c941bbSAndroid Build Coastguard Worker mCurrentScene = NULL;
73*b7c941bbSAndroid Build Coastguard Worker if (!Renderer::tearDown()) {
74*b7c941bbSAndroid Build Coastguard Worker return false;
75*b7c941bbSAndroid Build Coastguard Worker }
76*b7c941bbSAndroid Build Coastguard Worker return true;
77*b7c941bbSAndroid Build Coastguard Worker }
78*b7c941bbSAndroid Build Coastguard Worker
update(int frame)79*b7c941bbSAndroid Build Coastguard Worker bool ReferenceRenderer::update(int frame) {
80*b7c941bbSAndroid Build Coastguard Worker SCOPED_TRACE();
81*b7c941bbSAndroid Build Coastguard Worker int sceneId = frame / ReferenceRenderer::FRAMES_PER_SCENE;
82*b7c941bbSAndroid Build Coastguard Worker int localFrame = frame % ReferenceRenderer::FRAMES_PER_SCENE;
83*b7c941bbSAndroid Build Coastguard Worker mCurrentScene = mScenes[sceneId];
84*b7c941bbSAndroid Build Coastguard Worker mCurrentScene->update(localFrame);
85*b7c941bbSAndroid Build Coastguard Worker return true;
86*b7c941bbSAndroid Build Coastguard Worker }
87*b7c941bbSAndroid Build Coastguard Worker
drawWorkload()88*b7c941bbSAndroid Build Coastguard Worker void ReferenceRenderer::drawWorkload() {
89*b7c941bbSAndroid Build Coastguard Worker SCOPED_TRACE();
90*b7c941bbSAndroid Build Coastguard Worker // Set the background clear color to black.
91*b7c941bbSAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
92*b7c941bbSAndroid Build Coastguard Worker // Use culling to remove back faces.
93*b7c941bbSAndroid Build Coastguard Worker glEnable (GL_CULL_FACE);
94*b7c941bbSAndroid Build Coastguard Worker // Use depth testing.
95*b7c941bbSAndroid Build Coastguard Worker glEnable (GL_DEPTH_TEST);
96*b7c941bbSAndroid Build Coastguard Worker
97*b7c941bbSAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
98*b7c941bbSAndroid Build Coastguard Worker if (!mCurrentScene->draw()) {
99*b7c941bbSAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_ERROR, "ReferenceRenderer", "Error when rendering scene");
100*b7c941bbSAndroid Build Coastguard Worker }
101*b7c941bbSAndroid Build Coastguard Worker }
102