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