| // 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 "glbench/main.h" |
| #include "glbench/testbase.h" |
| #include "glbench/utils.h" |
| |
| |
| namespace glbench { |
| |
| class AttributeFetchShaderTest : public DrawElementsTestFunc { |
| public: |
| AttributeFetchShaderTest() {} |
| virtual ~AttributeFetchShaderTest() {} |
| virtual bool Run(); |
| virtual const char* Name() const { return "attribute_fetch_shader"; } |
| virtual bool IsDrawTest() const { return false; } |
| virtual const char* Unit() const { return "mvtx_sec"; } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(AttributeFetchShaderTest); |
| }; |
| |
| |
| const char *simple_vertex_shader = |
| "attribute vec4 c1;" |
| "void main() {" |
| " gl_Position = c1;" |
| "}"; |
| |
| const char *simple_vertex_shader_2_attr = |
| "attribute vec4 c1;" |
| "attribute vec4 c2;" |
| "void main() {" |
| " gl_Position = c1+c2;" |
| "}"; |
| |
| const char *simple_vertex_shader_4_attr = |
| "attribute vec4 c1;" |
| "attribute vec4 c2;" |
| "attribute vec4 c3;" |
| "attribute vec4 c4;" |
| "void main() {" |
| " gl_Position = c1+c2+c3+c4;" |
| "}"; |
| |
| const char *simple_vertex_shader_8_attr = |
| "attribute vec4 c1;" |
| "attribute vec4 c2;" |
| "attribute vec4 c3;" |
| "attribute vec4 c4;" |
| "attribute vec4 c5;" |
| "attribute vec4 c6;" |
| "attribute vec4 c7;" |
| "attribute vec4 c8;" |
| "void main() {" |
| " gl_Position = c1+c2+c3+c4+c5+c6+c7+c8;" |
| "}"; |
| |
| const char *simple_fragment_shader = |
| "void main() {" |
| " gl_FragColor = vec4(0.5);" |
| "}"; |
| |
| GLuint AttributeFetchShaderProgram(int attribute_count, |
| GLuint vertex_buffers[]) { |
| const char *vertex_shader = NULL; |
| switch (attribute_count) { |
| case 1: vertex_shader = simple_vertex_shader; break; |
| case 2: vertex_shader = simple_vertex_shader_2_attr; break; |
| case 4: vertex_shader = simple_vertex_shader_4_attr; break; |
| case 8: vertex_shader = simple_vertex_shader_8_attr; break; |
| default: return 0; |
| } |
| GLuint program = |
| InitShaderProgram(vertex_shader, simple_fragment_shader); |
| |
| for (int i = 0; i < attribute_count; i++) { |
| char attribute[] = "c_"; |
| attribute[1] = '1' + i; |
| int attribute_index = glGetAttribLocation(program, attribute); |
| glBindBuffer(GL_ARRAY_BUFFER, vertex_buffers[i]); |
| glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); |
| glEnableVertexAttribArray(attribute_index); |
| } |
| |
| return program; |
| } |
| |
| bool AttributeFetchShaderTest::Run() { |
| GLint width = 64; |
| GLint height = 64; |
| |
| glViewport(0, 0, g_width, g_height); |
| |
| 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); |
| |
| GLushort *indices = NULL; |
| GLuint index_buffer = 0; |
| GLsizeiptr index_buffer_size = 0; |
| |
| // Everything will be back-face culled. |
| count_ = CreateMesh(&indices, &index_buffer_size, width, height, 0); |
| index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER, |
| index_buffer_size, indices); |
| |
| glEnable(GL_CULL_FACE); |
| |
| GLuint vertex_buffers[8]; |
| for (GLuint i = 0; i < sizeof(vertex_buffers)/sizeof(vertex_buffers[0]); i++) |
| vertex_buffers[i] = vertex_buffer; |
| |
| GLuint program = AttributeFetchShaderProgram(1, vertex_buffers); |
| RunTest(this, "attribute_fetch_shader", count_, g_width, g_height, true); |
| glDeleteProgram(program); |
| |
| program = AttributeFetchShaderProgram(2, vertex_buffers); |
| RunTest(this, |
| "attribute_fetch_shader_2_attr", count_, g_width, g_height, true); |
| glDeleteProgram(program); |
| |
| program = AttributeFetchShaderProgram(4, vertex_buffers); |
| RunTest(this, |
| "attribute_fetch_shader_4_attr", count_, g_width, g_height, true); |
| glDeleteProgram(program); |
| |
| program = AttributeFetchShaderProgram(8, vertex_buffers); |
| RunTest(this, |
| "attribute_fetch_shader_8_attr", count_, g_width, g_height, true); |
| glDeleteProgram(program); |
| |
| glDeleteBuffers(1, &index_buffer); |
| delete[] indices; |
| |
| glDeleteBuffers(1, &vertex_buffer); |
| delete[] vertices; |
| return true; |
| } |
| |
| TestBase* GetAttributeFetchShaderTest() { |
| return new AttributeFetchShaderTest(); |
| } |
| |
| } // namespace glbench |