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 "testbase.h" 7 #include "utils.h" 8 9 namespace glbench { 10 11 class VaryingsAndDdxyShaderTest : public DrawElementsTestFunc { 12 public: 13 VaryingsAndDdxyShaderTest() {} 14 virtual ~VaryingsAndDdxyShaderTest() {} 15 virtual bool Run(); 16 virtual const char* Name() const { return "varyings_ddx_shader"; } 17 virtual const char* Unit() const { return "mpixels_sec"; } 18 19 private: 20 DISALLOW_COPY_AND_ASSIGN(VaryingsAndDdxyShaderTest); 21 }; 22 23 const char* vertex_shader_1_varying = 24 "attribute vec4 c;" 25 "varying vec4 v1;" 26 "void main() {" 27 " gl_Position = c;" 28 " v1 = c;" 29 "}"; 30 31 const char* vertex_shader_2_varying = 32 "attribute vec4 c;" 33 "varying vec4 v1;" 34 "varying vec4 v2;" 35 "void main() {" 36 " gl_Position = c;" 37 " v1 = v2 = c/2.;" 38 "}"; 39 40 const char* vertex_shader_4_varying = 41 "attribute vec4 c;" 42 "varying vec4 v1;" 43 "varying vec4 v2;" 44 "varying vec4 v3;" 45 "varying vec4 v4;" 46 "void main() {" 47 " gl_Position = c;" 48 " v1 = v2 = v3 = v4 = c/4.;" 49 "}"; 50 51 const char* vertex_shader_8_varying = 52 "attribute vec4 c;" 53 "varying vec4 v1;" 54 "varying vec4 v2;" 55 "varying vec4 v3;" 56 "varying vec4 v4;" 57 "varying vec4 v5;" 58 "varying vec4 v6;" 59 "varying vec4 v7;" 60 "varying vec4 v8;" 61 "void main() {" 62 " gl_Position = c;" 63 " v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = c/8.;" 64 "}"; 65 66 const char* fragment_shader_1_varying = 67 "varying vec4 v1;" 68 "void main() {" 69 " gl_FragColor = v1;" 70 "}"; 71 72 const char* fragment_shader_2_varying = 73 "varying vec4 v1;" 74 "varying vec4 v2;" 75 "void main() {" 76 " gl_FragColor = v1 + v2;" 77 "}"; 78 79 const char* fragment_shader_4_varying = 80 "varying vec4 v1;" 81 "varying vec4 v2;" 82 "varying vec4 v3;" 83 "varying vec4 v4;" 84 "void main() {" 85 " gl_FragColor = v1 + v2 + v3 + v4;" 86 "}"; 87 88 const char* fragment_shader_8_varying = 89 "varying vec4 v1;" 90 "varying vec4 v2;" 91 "varying vec4 v3;" 92 "varying vec4 v4;" 93 "varying vec4 v5;" 94 "varying vec4 v6;" 95 "varying vec4 v7;" 96 "varying vec4 v8;" 97 "void main() {" 98 " gl_FragColor = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;" 99 "}"; 100 101 GLuint VaryingsShaderProgram(int varyings_count, GLuint vertex_buffer) { 102 const char* vertex_shader = NULL; 103 const char* fragment_shader = NULL; 104 switch (varyings_count) { 105 case 1: 106 vertex_shader = vertex_shader_1_varying; 107 fragment_shader = fragment_shader_1_varying; 108 break; 109 case 2: 110 vertex_shader = vertex_shader_2_varying; 111 fragment_shader = fragment_shader_2_varying; 112 break; 113 case 4: 114 vertex_shader = vertex_shader_4_varying; 115 fragment_shader = fragment_shader_4_varying; 116 break; 117 case 8: 118 vertex_shader = vertex_shader_8_varying; 119 fragment_shader = fragment_shader_8_varying; 120 break; 121 default: 122 return 0; 123 } 124 GLuint program = InitShaderProgram(vertex_shader, fragment_shader); 125 126 int attribute_index = glGetAttribLocation(program, "c"); 127 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 128 glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); 129 glEnableVertexAttribArray(attribute_index); 130 131 return program; 132 } 133 134 const char* fragment_shader_ddx = 135 "#extension GL_OES_standard_derivatives : enable\n" 136 "varying vec4 v1;" 137 "void main() {" 138 " gl_FragColor = vec4(dFdx(v1.x), 0., 0., 1.);" 139 "}"; 140 141 const char* fragment_shader_ddy = 142 "#extension GL_OES_standard_derivatives : enable\n" 143 "varying vec4 v1;" 144 "void main() {" 145 " gl_FragColor = vec4(dFdy(v1.y), 0., 0., 1.);" 146 "}"; 147 148 GLuint DdxDdyShaderProgram(bool ddx, GLuint vertex_buffer) { 149 GLuint program = InitShaderProgram( 150 vertex_shader_1_varying, ddx ? fragment_shader_ddx : fragment_shader_ddy); 151 152 int attribute_index = glGetAttribLocation(program, "c"); 153 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 154 glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); 155 glEnableVertexAttribArray(attribute_index); 156 157 return program; 158 } 159 160 bool VaryingsAndDdxyShaderTest::Run() { 161 glViewport(0, 0, g_width, g_height); 162 163 const int c = 4; 164 GLfloat* vertices = NULL; 165 GLsizeiptr vertex_buffer_size = 0; 166 CreateLattice(&vertices, &vertex_buffer_size, 1.f / c, 1.f / c, c, c); 167 GLuint vertex_buffer = 168 SetupVBO(GL_ARRAY_BUFFER, vertex_buffer_size, vertices); 169 170 GLushort* indices = NULL; 171 GLuint index_buffer = 0; 172 GLsizeiptr index_buffer_size = 0; 173 174 count_ = CreateMesh(&indices, &index_buffer_size, c, c, 0); 175 index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, indices); 176 177 GLuint program = VaryingsShaderProgram(1, vertex_buffer); 178 RunTest(this, "varyings_shader_1", g_width * g_height, g_width, g_height, 179 true); 180 glDeleteProgram(program); 181 182 program = VaryingsShaderProgram(2, vertex_buffer); 183 RunTest(this, "varyings_shader_2", g_width * g_height, g_width, g_height, 184 true); 185 glDeleteProgram(program); 186 187 program = VaryingsShaderProgram(4, vertex_buffer); 188 RunTest(this, "varyings_shader_4", g_width * g_height, g_width, g_height, 189 true); 190 glDeleteProgram(program); 191 192 program = VaryingsShaderProgram(8, vertex_buffer); 193 RunTest(this, "varyings_shader_8", g_width * g_height, g_width, g_height, 194 true); 195 glDeleteProgram(program); 196 197 #if !defined(DISABLE_SOME_TESTS_FOR_INTEL_DRIVER) 198 program = DdxDdyShaderProgram(true, vertex_buffer); 199 RunTest(this, "ddx_shader", g_width * g_height, g_width, g_height, true); 200 glDeleteProgram(program); 201 202 program = DdxDdyShaderProgram(false, vertex_buffer); 203 RunTest(this, "ddy_shader", g_width * g_height, g_width, g_height, true); 204 glDeleteProgram(program); 205 #endif 206 207 glDeleteBuffers(1, &index_buffer); 208 delete[] indices; 209 210 glDeleteBuffers(1, &vertex_buffer); 211 delete[] vertices; 212 213 return true; 214 } 215 216 TestBase* GetVaryingsAndDdxyShaderTest() { 217 return new VaryingsAndDdxyShaderTest; 218 } 219 220 } // namespace glbench 221