| // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stdlib.h> |
| |
| #include "glbench/main.h" |
| #include "glbench/testbase.h" |
| #include "glbench/utils.h" |
| |
| |
| namespace glbench { |
| |
| |
| class TriangleSetupTest : public DrawElementsTestFunc { |
| public: |
| TriangleSetupTest() {} |
| virtual ~TriangleSetupTest() {} |
| virtual bool Run(); |
| virtual const char* Name() const { return "triangle_setup"; } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(TriangleSetupTest); |
| }; |
| |
| const char* kVertexShader = |
| "attribute vec4 c;" |
| "void main() {" |
| " gl_Position = c;" |
| "}"; |
| |
| const char* kFragmentShader = |
| "uniform vec4 color;" |
| "void main() {" |
| " gl_FragColor = color;" |
| "}"; |
| |
| bool TriangleSetupTest::Run() { |
| glViewport(0, 0, g_width, g_height); |
| |
| // This specifies a square mesh in the middle of the viewport. |
| // Larger meshes make this test too slow for devices that do 1 mtri/sec. |
| // Also note that GLES 2.0 uses 16 bit indices. |
| GLint width = 128; |
| GLint height = 128; |
| |
| GLfloat *vertices = NULL; |
| GLsizeiptr vertex_buffer_size = 0; |
| CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height, |
| width, height); |
| GLuint vertex_buffer = SetupVBO(GL_ARRAY_BUFFER, |
| vertex_buffer_size, vertices); |
| |
| GLuint program = |
| InitShaderProgram(kVertexShader, kFragmentShader); |
| GLint attribute_index = glGetAttribLocation(program, "c"); |
| glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); |
| glEnableVertexAttribArray(attribute_index); |
| |
| GLint color_uniform = glGetUniformLocation(program, "color"); |
| |
| GLushort *indices = NULL; |
| GLuint index_buffer = 0; |
| GLsizeiptr index_buffer_size = 0; |
| |
| { |
| // Use orange for drawing solid/all culled quads. |
| const GLfloat orange[4] = {1.0f, 0.5f, 0.0f, 1.0f}; |
| glUniform4fv(color_uniform, 1, orange); |
| count_ = CreateMesh(&indices, &index_buffer_size, width, height, 0); |
| |
| index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER, |
| index_buffer_size, indices); |
| RunTest(this, "triangle_setup", count_ / 3, g_width, g_height, true); |
| glEnable(GL_CULL_FACE); |
| RunTest(this, "triangle_setup_all_culled", count_ / 3, g_width, g_height, |
| true); |
| glDisable(GL_CULL_FACE); |
| |
| glDeleteBuffers(1, &index_buffer); |
| delete[] indices; |
| } |
| |
| { |
| // Use blue-ish color for drawing quad with many holes. |
| const GLfloat cyan[4] = {0.0f, 0.5f, 0.5f, 1.0f}; |
| glUniform4fv(color_uniform, 1, cyan); |
| count_ = CreateMesh(&indices, &index_buffer_size, width, height, |
| RAND_MAX / 2); |
| |
| index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER, |
| index_buffer_size, indices); |
| glEnable(GL_CULL_FACE); |
| RunTest(this, "triangle_setup_half_culled", count_ / 3, g_width, g_height, |
| true); |
| |
| glDeleteBuffers(1, &index_buffer); |
| delete[] indices; |
| } |
| |
| glDeleteProgram(program); |
| glDeleteBuffers(1, &vertex_buffer); |
| delete[] vertices; |
| return true; |
| } |
| |
| |
| TestBase* GetTriangleSetupTest() { |
| return new TriangleSetupTest; |
| } |
| |
| |
| } // namespace glbench |