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 "main.h" 6 #include "utils.h" 7 #include "testbase.h" 8 9 10 namespace glbench { 11 12 class AttributeFetchShaderTest : public DrawElementsTestFunc { 13 public: 14 AttributeFetchShaderTest() {} 15 virtual ~AttributeFetchShaderTest() {} 16 virtual bool Run(); 17 virtual const char* Name() const { return "attribute_fetch_shader"; } 18 virtual bool IsDrawTest() const { return false; } 19 virtual const char* Unit() const { return "mvtx_sec"; } 20 21 private: 22 DISALLOW_COPY_AND_ASSIGN(AttributeFetchShaderTest); 23 }; 24 25 26 const char *simple_vertex_shader = 27 "attribute vec4 c1;" 28 "void main() {" 29 " gl_Position = c1;" 30 "}"; 31 32 const char *simple_vertex_shader_2_attr = 33 "attribute vec4 c1;" 34 "attribute vec4 c2;" 35 "void main() {" 36 " gl_Position = c1+c2;" 37 "}"; 38 39 const char *simple_vertex_shader_4_attr = 40 "attribute vec4 c1;" 41 "attribute vec4 c2;" 42 "attribute vec4 c3;" 43 "attribute vec4 c4;" 44 "void main() {" 45 " gl_Position = c1+c2+c3+c4;" 46 "}"; 47 48 const char *simple_vertex_shader_8_attr = 49 "attribute vec4 c1;" 50 "attribute vec4 c2;" 51 "attribute vec4 c3;" 52 "attribute vec4 c4;" 53 "attribute vec4 c5;" 54 "attribute vec4 c6;" 55 "attribute vec4 c7;" 56 "attribute vec4 c8;" 57 "void main() {" 58 " gl_Position = c1+c2+c3+c4+c5+c6+c7+c8;" 59 "}"; 60 61 const char *simple_fragment_shader = 62 "void main() {" 63 " gl_FragColor = vec4(0.5);" 64 "}"; 65 66 GLuint AttributeFetchShaderProgram(int attribute_count, 67 GLuint vertex_buffers[]) { 68 const char *vertex_shader = NULL; 69 switch (attribute_count) { 70 case 1: vertex_shader = simple_vertex_shader; break; 71 case 2: vertex_shader = simple_vertex_shader_2_attr; break; 72 case 4: vertex_shader = simple_vertex_shader_4_attr; break; 73 case 8: vertex_shader = simple_vertex_shader_8_attr; break; 74 default: return 0; 75 } 76 GLuint program = 77 InitShaderProgram(vertex_shader, simple_fragment_shader); 78 79 for (int i = 0; i < attribute_count; i++) { 80 char attribute[] = "c_"; 81 attribute[1] = '1' + i; 82 int attribute_index = glGetAttribLocation(program, attribute); 83 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffers[i]); 84 glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); 85 glEnableVertexAttribArray(attribute_index); 86 } 87 88 return program; 89 } 90 91 bool AttributeFetchShaderTest::Run() { 92 GLint width = 64; 93 GLint height = 64; 94 95 glViewport(0, 0, g_width, g_height); 96 97 GLfloat *vertices = NULL; 98 GLsizeiptr vertex_buffer_size = 0; 99 CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height, 100 width, height); 101 GLuint vertex_buffer = SetupVBO(GL_ARRAY_BUFFER, 102 vertex_buffer_size, vertices); 103 104 GLushort *indices = NULL; 105 GLuint index_buffer = 0; 106 GLsizeiptr index_buffer_size = 0; 107 108 // Everything will be back-face culled. 109 count_ = CreateMesh(&indices, &index_buffer_size, width, height, 0); 110 index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER, 111 index_buffer_size, indices); 112 113 glEnable(GL_CULL_FACE); 114 115 GLuint vertex_buffers[8]; 116 for (GLuint i = 0; i < sizeof(vertex_buffers)/sizeof(vertex_buffers[0]); i++) 117 vertex_buffers[i] = vertex_buffer; 118 119 GLuint program = AttributeFetchShaderProgram(1, vertex_buffers); 120 RunTest(this, "attribute_fetch_shader", count_, g_width, g_height, true); 121 glDeleteProgram(program); 122 123 program = AttributeFetchShaderProgram(2, vertex_buffers); 124 RunTest(this, 125 "attribute_fetch_shader_2_attr", count_, g_width, g_height, true); 126 glDeleteProgram(program); 127 128 program = AttributeFetchShaderProgram(4, vertex_buffers); 129 RunTest(this, 130 "attribute_fetch_shader_4_attr", count_, g_width, g_height, true); 131 glDeleteProgram(program); 132 133 program = AttributeFetchShaderProgram(8, vertex_buffers); 134 RunTest(this, 135 "attribute_fetch_shader_8_attr", count_, g_width, g_height, true); 136 glDeleteProgram(program); 137 138 glDeleteBuffers(1, &index_buffer); 139 delete[] indices; 140 141 glDeleteBuffers(1, &vertex_buffer); 142 delete[] vertices; 143 return true; 144 } 145 146 TestBase* GetAttributeFetchShaderTest() { 147 return new AttributeFetchShaderTest(); 148 } 149 150 } // namespace glbench 151