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