Home | History | Annotate | Download | only in src
      1 // Copyright (c) 2010 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 <stdlib.h>
      6 
      7 #include "main.h"
      8 #include "testbase.h"
      9 #include "utils.h"
     10 
     11 namespace glbench {
     12 
     13 class TriangleSetupTest : public DrawElementsTestFunc {
     14  public:
     15   TriangleSetupTest() {}
     16   virtual ~TriangleSetupTest() {}
     17   virtual bool Run();
     18   virtual const char* Name() const { return "triangle_setup"; }
     19 
     20  private:
     21   DISALLOW_COPY_AND_ASSIGN(TriangleSetupTest);
     22 };
     23 
     24 const char* kVertexShader =
     25     "attribute vec4 c;"
     26     "void main() {"
     27     "  gl_Position = c;"
     28     "}";
     29 
     30 const char* kFragmentShader =
     31     "uniform vec4 color;"
     32     "void main() {"
     33     "  gl_FragColor = color;"
     34     "}";
     35 
     36 bool TriangleSetupTest::Run() {
     37   glViewport(0, 0, g_width, g_height);
     38 
     39   // This specifies a square mesh in the middle of the viewport.
     40   // Larger meshes make this test too slow for devices that do 1 mtri/sec.
     41   // Also note that GLES 2.0 uses 16 bit indices.
     42   GLint width = 128;
     43   GLint height = 128;
     44 
     45   GLfloat* vertices = NULL;
     46   GLsizeiptr vertex_buffer_size = 0;
     47   CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height,
     48                 width, height);
     49   GLuint vertex_buffer =
     50       SetupVBO(GL_ARRAY_BUFFER, vertex_buffer_size, vertices);
     51 
     52   GLuint program = InitShaderProgram(kVertexShader, kFragmentShader);
     53   GLint attribute_index = glGetAttribLocation(program, "c");
     54   glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL);
     55   glEnableVertexAttribArray(attribute_index);
     56 
     57   GLint color_uniform = glGetUniformLocation(program, "color");
     58 
     59   GLushort* indices = NULL;
     60   GLuint index_buffer = 0;
     61   GLsizeiptr index_buffer_size = 0;
     62 
     63   {
     64     // Use orange for drawing solid/all culled quads.
     65     const GLfloat orange[4] = {1.0f, 0.5f, 0.0f, 1.0f};
     66     glUniform4fv(color_uniform, 1, orange);
     67     count_ = CreateMesh(&indices, &index_buffer_size, width, height, 0);
     68 
     69     index_buffer =
     70         SetupVBO(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, indices);
     71     RunTest(this, "triangle_setup", count_ / 3, g_width, g_height, true);
     72     glEnable(GL_CULL_FACE);
     73     RunTest(this, "triangle_setup_all_culled", count_ / 3, g_width, g_height,
     74             true);
     75     glDisable(GL_CULL_FACE);
     76 
     77     glDeleteBuffers(1, &index_buffer);
     78     delete[] indices;
     79   }
     80 
     81   {
     82     // Use blue-ish color for drawing quad with many holes.
     83     const GLfloat cyan[4] = {0.0f, 0.5f, 0.5f, 1.0f};
     84     glUniform4fv(color_uniform, 1, cyan);
     85     count_ =
     86         CreateMesh(&indices, &index_buffer_size, width, height, RAND_MAX / 2);
     87 
     88     index_buffer =
     89         SetupVBO(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, indices);
     90     glEnable(GL_CULL_FACE);
     91     RunTest(this, "triangle_setup_half_culled", count_ / 3, g_width, g_height,
     92             true);
     93 
     94     glDeleteBuffers(1, &index_buffer);
     95     delete[] indices;
     96   }
     97 
     98   glDeleteProgram(program);
     99   glDeleteBuffers(1, &vertex_buffer);
    100   delete[] vertices;
    101   return true;
    102 }
    103 
    104 TestBase* GetTriangleSetupTest() {
    105   return new TriangleSetupTest;
    106 }
    107 
    108 }  // namespace glbench
    109