Home | History | Annotate | Download | only in pixeloutput
      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 "PixelOutputRenderer.h"
     15 #include <graphics/GLUtils.h>
     16 
     17 #include <Trace.h>
     18 
     19 static const int PO_NUM_VERTICES = 6;
     20 
     21 static const float PO_VERTICES[PO_NUM_VERTICES * 3] = {
     22         1.0f, 1.0f, -1.0f,
     23         -1.0f, 1.0f, -1.0f,
     24         -1.0f, -1.0f, -1.0f,
     25         -1.0f, -1.0f, -1.0f,
     26         1.0f, -1.0f, -1.0f,
     27         1.0f, 1.0f, -1.0f };
     28 static const float PO_TEX_COORDS[PO_NUM_VERTICES * 2] = {
     29         1.0f, 1.0f,
     30         0.0f, 1.0f,
     31         0.0f, 0.0f,
     32         0.0f, 0.0f,
     33         1.0f, 0.0f,
     34         1.0f, 1.0f };
     35 
     36 static const char* PO_VERTEX =
     37         "attribute vec4 a_Position;"
     38         "attribute vec2 a_TexCoord;"
     39         "varying vec2 v_TexCoord;"
     40         "void main() {"
     41         "  v_TexCoord = a_TexCoord;"
     42         "  gl_Position = a_Position;"
     43         "}";
     44 
     45 static const char* PO_FRAGMENT =
     46         "precision mediump float;"
     47         "uniform sampler2D u_Texture;"
     48         "varying vec2 v_TexCoord;"
     49         "void main() {"
     50         "  gl_FragColor = texture2D(u_Texture, v_TexCoord);"
     51         "}";
     52 
     53 PixelOutputRenderer::PixelOutputRenderer(ANativeWindow* window, bool offscreen, int workload) :
     54         Renderer(window, offscreen, workload) {
     55 }
     56 
     57 bool PixelOutputRenderer::setUp() {
     58     SCOPED_TRACE();
     59     if (!Renderer::setUp()) {
     60         return false;
     61     }
     62 
     63     // Create program.
     64     mProgramId = GLUtils::createProgram(&PO_VERTEX, &PO_FRAGMENT);
     65     if (mProgramId == 0) {
     66         return false;
     67     }
     68     // Bind attributes.
     69     mTextureUniformHandle = glGetUniformLocation(mProgramId, "u_Texture");
     70     mPositionHandle = glGetAttribLocation(mProgramId, "a_Position");
     71     mTexCoordHandle = glGetAttribLocation(mProgramId, "a_TexCoord");
     72 
     73     // Setup texture.
     74     mTextureId = GLUtils::genTexture(mWidth, mHeight, GLUtils::RANDOM_FILL);
     75     if (mTextureId == 0) {
     76         return false;
     77     }
     78     return true;
     79 }
     80 
     81 bool PixelOutputRenderer::tearDown() {
     82     SCOPED_TRACE();
     83     if (mTextureId != 0) {
     84         glDeleteTextures(1, &mTextureId);
     85         mTextureId = 0;
     86     }
     87     if (!Renderer::tearDown()) {
     88         return false;
     89     }
     90     return true;
     91 }
     92 
     93 void PixelOutputRenderer::drawWorkload() {
     94     SCOPED_TRACE();
     95     glUseProgram(mProgramId);
     96     // Set the background clear color to black.
     97     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
     98     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
     99 
    100     // No culling of back faces
    101     glDisable(GL_CULL_FACE);
    102 
    103     // No depth testing
    104     glDisable(GL_DEPTH_TEST);
    105 
    106     // Enable blending
    107     glEnable(GL_BLEND);
    108     glBlendFunc(GL_ONE, GL_ONE);
    109 
    110     glActiveTexture(GL_TEXTURE0);
    111     // Bind the texture to this unit.
    112     glBindTexture(GL_TEXTURE_2D, mTextureId);
    113     // Tell the texture uniform sampler to use this texture in the shader by binding to texture
    114     // unit 0.
    115     glUniform1i(mTextureUniformHandle, 0);
    116 
    117     glEnableVertexAttribArray(mPositionHandle);
    118     glEnableVertexAttribArray(mTexCoordHandle);
    119     glVertexAttribPointer(mPositionHandle, 3, GL_FLOAT, false, 0, PO_VERTICES);
    120     glVertexAttribPointer(mTexCoordHandle, 2, GL_FLOAT, false, 0, PO_TEX_COORDS);
    121 
    122     for (int i = 0; i < mWorkload; i++) {
    123         glDrawArrays(GL_TRIANGLES, 0, PO_NUM_VERTICES);
    124     }
    125 }
    126