| // Copyright (c) 2013 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 "glbench/glinterfacetest.h" |
| |
| #include <string> |
| |
| #include "base/bind.h" |
| |
| namespace glbench { |
| |
| namespace { |
| |
| // Basic shader code. |
| const char* kVertexShader = |
| "attribute vec4 c;" |
| "void main() {" |
| " gl_Position = c;" |
| "}"; |
| |
| const char* kFragmentShader = |
| "uniform vec4 color;" |
| "void main() {" |
| " gl_FragColor = color;" |
| "}"; |
| |
| // Vertex arrays used to draw a diamond. |
| const GLfloat kVertices[] = { 1.0, 0.0, |
| 0.0, -1.0, |
| -1.0, 0.0, |
| 0.0, 1.0 }; |
| const GLushort kIndices[] = { 0, 1, 2, |
| 0, 2, 3 }; |
| |
| } // namespace |
| |
| void GLInterfaceTest::SetupGLRendering() { |
| vertex_buffer_object_ = |
| SetupVBO(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices); |
| |
| shader_program_ = InitShaderProgram(kVertexShader, kFragmentShader); |
| attribute_index_ = glGetAttribLocation(shader_program_, "c"); |
| glVertexAttribPointer(attribute_index_, 2, GL_FLOAT, GL_FALSE, 0, NULL); |
| glEnableVertexAttribArray(attribute_index_); |
| |
| GLint color_uniform = glGetUniformLocation(shader_program_, "color"); |
| |
| const GLfloat white[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| glUniform4fv(color_uniform, 1, white); |
| |
| num_indices_ = arraysize(kIndices); |
| index_buffer_object_ = |
| SetupVBO(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndices), kIndices); |
| } |
| |
| void GLInterfaceTest::CleanupGLRendering() { |
| glDisableVertexAttribArray(attribute_index_); |
| glDeleteProgram(shader_program_); |
| glDeleteBuffers(1, &index_buffer_object_); |
| glDeleteBuffers(1, &vertex_buffer_object_); |
| } |
| |
| bool GLInterfaceTest::Run() { |
| const std::string test_name_base = std::string(Name()) + "_"; |
| |
| // Run test without GL commands. |
| render_func_.Reset(); |
| RunTest(this, (test_name_base + "nogl").c_str(), 1.0, g_width, g_height, |
| false); |
| |
| // Run main test with simple GL commands. |
| SetupGLRendering(); |
| render_func_ = base::Bind(&GLInterfaceTest::RenderGLSimple, |
| base::Unretained(this)); |
| RunTest(this, (test_name_base + "glsimple").c_str(), 1.0, g_width, g_height, |
| false); |
| CleanupGLRendering(); |
| |
| // TODO(sque): Run with complex GL commands. See crosbug.com/36746. |
| return true; |
| } |
| |
| void GLInterfaceTest::RenderGLSimple() { |
| glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, 0); |
| } |
| |
| } // namespace glbench |