Home | History | Annotate | Download | only in src
      1 // Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/bind.h"
      6 
      7 #include "glinterfacetest.h"
      8 
      9 namespace glbench {
     10 
     11 namespace {
     12 
     13 // Basic shader code.
     14 const char* kVertexShader =
     15     "attribute vec4 c;"
     16     "void main() {"
     17     "  gl_Position = c;"
     18     "}";
     19 
     20 const char* kFragmentShader =
     21     "uniform vec4 color;"
     22     "void main() {"
     23     "  gl_FragColor = color;"
     24     "}";
     25 
     26 // Vertex arrays used to draw a diamond.
     27 const GLfloat kVertices[] = { 1.0, 0.0,
     28                               0.0, -1.0,
     29                               -1.0, 0.0,
     30                               0.0, 1.0 };
     31 const GLushort kIndices[] = { 0, 1, 2,
     32                               0, 2, 3 };
     33 
     34 }  // namespace
     35 
     36 void GLInterfaceTest::SetupGLRendering() {
     37   vertex_buffer_object_ =
     38       SetupVBO(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices);
     39 
     40   shader_program_ = InitShaderProgram(kVertexShader, kFragmentShader);
     41   attribute_index_ = glGetAttribLocation(shader_program_, "c");
     42   glVertexAttribPointer(attribute_index_, 2, GL_FLOAT, GL_FALSE, 0, NULL);
     43   glEnableVertexAttribArray(attribute_index_);
     44 
     45   GLint color_uniform = glGetUniformLocation(shader_program_, "color");
     46 
     47   const GLfloat white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
     48   glUniform4fv(color_uniform, 1, white);
     49 
     50   num_indices_ = arraysize(kIndices);
     51   index_buffer_object_ =
     52       SetupVBO(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndices), kIndices);
     53 }
     54 
     55 void GLInterfaceTest::CleanupGLRendering() {
     56   glDisableVertexAttribArray(attribute_index_);
     57   glDeleteProgram(shader_program_);
     58   glDeleteBuffers(1, &index_buffer_object_);
     59   glDeleteBuffers(1, &vertex_buffer_object_);
     60 }
     61 
     62 bool GLInterfaceTest::Run() {
     63   const std::string test_name_base = std::string(Name()) + "_";
     64 
     65   // Run test without GL commands.
     66   render_func_.Reset();
     67   RunTest(this, (test_name_base + "nogl").c_str(), 1.0, g_width, g_height, false);
     68 
     69   // Run main test with simple GL commands.
     70   SetupGLRendering();
     71   render_func_ = base::Bind(&GLInterfaceTest::RenderGLSimple,
     72                             base::Unretained(this));
     73   RunTest(this, (test_name_base + "glsimple").c_str(), 1.0, g_width, g_height, false);
     74   CleanupGLRendering();
     75 
     76   // TODO(sque): Run with complex GL commands. See crosbug.com/36746.
     77   return true;
     78 }
     79 
     80 void GLInterfaceTest::RenderGLSimple() {
     81   glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, 0);
     82 }
     83 
     84 } // namespace glbench
     85