• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
AttributeFetchShaderTest()14   AttributeFetchShaderTest() {}
~AttributeFetchShaderTest()15   virtual ~AttributeFetchShaderTest() {}
16   virtual bool Run();
Name() const17   virtual const char* Name() const { return "attribute_fetch_shader"; }
IsDrawTest() const18   virtual bool IsDrawTest() const { return false; }
Unit() const19   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 
AttributeFetchShaderProgram(int attribute_count,GLuint vertex_buffers[])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 
Run()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 
GetAttributeFetchShaderTest()146 TestBase* GetAttributeFetchShaderTest() {
147   return new AttributeFetchShaderTest();
148 }
149 
150 } // namespace glbench
151