Home | History | Annotate | Download | only in reference
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
      5  * in compliance with the License. You may obtain a copy of the License at
      6  *
      7  * http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the License
     10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
     11  * or implied. See the License for the specific language governing permissions and limitations under
     12  * the License.
     13  */
     14 #include "ReferenceRenderer.h"
     15 
     16 #include "scene/flocking/FlockingScene.h"
     17 #include "scene/glowing/GlowingScene.h"
     18 
     19 #include <graphics/GLUtils.h>
     20 #include <graphics/ProgramNode.h>
     21 
     22 #include <android/log.h>
     23 #include <Trace.h>
     24 
     25 ReferenceRenderer::ReferenceRenderer(ANativeWindow* window) :
     26         Renderer(window, false) {
     27 }
     28 
     29 bool ReferenceRenderer::setUp(int workload) {
     30     SCOPED_TRACE();
     31     // Reset the times.
     32     for (int i = 0; i < NUM_SETUP_TIMES; i++) {
     33         mSetUpTimes[i] = 0;
     34     }
     35     // Set up OpenGLES.
     36     double start = GLUtils::currentTimeMillis();
     37     if (!Renderer::setUp(workload)) {
     38         return false;
     39     }
     40     mSetUpTimes[0] = GLUtils::currentTimeMillis() - start;
     41 
     42     // Create the scenes.
     43     mScenes[0] = new FlockingScene(mWidth, mHeight);
     44     mScenes[1] = new GlowingScene(mWidth, mHeight);
     45     // TODO add more scenes to do a comprehensive test.
     46 
     47     // Set up the scenes.
     48     double times[NUM_SETUP_TIMES];
     49     for (int i = 0; i < NUM_SCENES; i++) {
     50         times[0] = GLUtils::currentTimeMillis();
     51         mScenes[i]->setUpContext();
     52         times[1] = GLUtils::currentTimeMillis();
     53         mScenes[i]->setUpTextures();
     54         times[2] = GLUtils::currentTimeMillis();
     55         mScenes[i]->setUpMeshes();
     56         times[3] = GLUtils::currentTimeMillis();
     57 
     58         for (int i = 1; i < NUM_SETUP_TIMES; i++) {
     59             // Add on the set up times.
     60             mSetUpTimes[i] += times[i] - times[i - 1];
     61         }
     62     }
     63     return true;
     64 }
     65 
     66 bool ReferenceRenderer::tearDown() {
     67     SCOPED_TRACE();
     68     for (int i = 0; i < NUM_SCENES; i++) {
     69         mScenes[i]->tearDown();
     70         delete mScenes[i];
     71     }
     72     mCurrentScene = NULL;
     73     if (!Renderer::tearDown()) {
     74         return false;
     75     }
     76     return true;
     77 }
     78 
     79 bool ReferenceRenderer::update(int frame) {
     80     SCOPED_TRACE();
     81     int sceneId = frame / ReferenceRenderer::FRAMES_PER_SCENE;
     82     int localFrame = frame % ReferenceRenderer::FRAMES_PER_SCENE;
     83     mCurrentScene = mScenes[sceneId];
     84     mCurrentScene->update(localFrame);
     85     return true;
     86 }
     87 
     88 void ReferenceRenderer::drawWorkload() {
     89     SCOPED_TRACE();
     90     // Set the background clear color to black.
     91     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
     92     // Use culling to remove back faces.
     93     glEnable (GL_CULL_FACE);
     94     // Use depth testing.
     95     glEnable (GL_DEPTH_TEST);
     96 
     97     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
     98     if (!mCurrentScene->draw()) {
     99         __android_log_print(ANDROID_LOG_ERROR, "ReferenceRenderer", "Error when rendering scene");
    100     }
    101 }
    102