| Index: client/deps/glbench/src/varyingsandddxytest.cc
|
| diff --git a/client/deps/glbench/src/varyingsandddxytest.cc b/client/deps/glbench/src/varyingsandddxytest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..783416788c4dc610af95dd8e9833994b77663840
|
| --- /dev/null
|
| +++ b/client/deps/glbench/src/varyingsandddxytest.cc
|
| @@ -0,0 +1,249 @@
|
| +// 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 "main.h"
|
| +#include "testbase.h"
|
| +#include "utils.h"
|
| +
|
| +
|
| +namespace glbench {
|
| +
|
| +
|
| +class VaryingsAndDdxyShaderTest : public DrawElementsTestFunc {
|
| + public:
|
| + VaryingsAndDdxyShaderTest() {}
|
| + virtual ~VaryingsAndDdxyShaderTest() {}
|
| + virtual bool Run();
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(VaryingsAndDdxyShaderTest);
|
| +};
|
| +
|
| +#if I915_WORKAROUND
|
| +#define V1 "gl_TexCoord[0]"
|
| +#define V2 "gl_TexCoord[1]"
|
| +#define V3 "gl_TexCoord[2]"
|
| +#define V4 "gl_TexCoord[3]"
|
| +#define V5 "gl_TexCoord[4]"
|
| +#define V6 "gl_TexCoord[5]"
|
| +#define V7 "gl_TexCoord[6]"
|
| +#define V8 "gl_TexCoord[7]"
|
| +#define DDX "dFdx"
|
| +#define DDY "dFdy"
|
| +#else
|
| +#define V1 "v1"
|
| +#define V2 "v2"
|
| +#define V3 "v3"
|
| +#define V4 "v4"
|
| +#define V5 "v5"
|
| +#define V6 "v6"
|
| +#define V7 "v7"
|
| +#define V8 "v8"
|
| +#define DDX "ddx"
|
| +#define DDY "ddy"
|
| +#endif
|
| +
|
| +
|
| +const char *vertex_shader_1_varying =
|
| +"attribute vec4 c;"
|
| +"varying vec4 v1;"
|
| +"void main() {"
|
| +" gl_Position = c;"
|
| + V1 "= c;"
|
| +"}";
|
| +
|
| +const char *vertex_shader_2_varying =
|
| +"attribute vec4 c;"
|
| +"varying vec4 v1;"
|
| +"varying vec4 v2;"
|
| +"void main() {"
|
| +" gl_Position = c;"
|
| + V1 "=" V2 "= c/2.;"
|
| +"}";
|
| +
|
| +const char *vertex_shader_4_varying =
|
| +"attribute vec4 c;"
|
| +"varying vec4 v1;"
|
| +"varying vec4 v2;"
|
| +"varying vec4 v3;"
|
| +"varying vec4 v4;"
|
| +"void main() {"
|
| +" gl_Position = c;"
|
| + V1 "=" V2 "=" V3 "=" V4 "= c/4.;"
|
| +"}";
|
| +
|
| +const char *vertex_shader_8_varying =
|
| +"attribute vec4 c;"
|
| +"varying vec4 v1;"
|
| +"varying vec4 v2;"
|
| +"varying vec4 v3;"
|
| +"varying vec4 v4;"
|
| +"varying vec4 v5;"
|
| +"varying vec4 v6;"
|
| +"varying vec4 v7;"
|
| +"varying vec4 v8;"
|
| +"void main() {"
|
| +" gl_Position = c;"
|
| + V1 "=" V2 "=" V3 "=" V4 "=" V5 "=" V6 "=" V7 "=" V8 "= c/8.;"
|
| +"}";
|
| +
|
| +const char *fragment_shader_1_varying =
|
| +"varying vec4 v1;"
|
| +"void main() {"
|
| +" gl_FragColor =" V1 ";"
|
| +"}";
|
| +
|
| +const char *fragment_shader_2_varying =
|
| +"varying vec4 v1;"
|
| +"varying vec4 v2;"
|
| +"void main() {"
|
| +" gl_FragColor =" V1 "+" V2 ";"
|
| +"}";
|
| +
|
| +const char *fragment_shader_4_varying =
|
| +"varying vec4 v1;"
|
| +"varying vec4 v2;"
|
| +"varying vec4 v3;"
|
| +"varying vec4 v4;"
|
| +"void main() {"
|
| +" gl_FragColor =" V1 "+" V2 "+" V3 "+" V4 ";"
|
| +"}";
|
| +
|
| +const char *fragment_shader_8_varying =
|
| +"varying vec4 v1;"
|
| +"varying vec4 v2;"
|
| +"varying vec4 v3;"
|
| +"varying vec4 v4;"
|
| +"varying vec4 v5;"
|
| +"varying vec4 v6;"
|
| +"varying vec4 v7;"
|
| +"varying vec4 v8;"
|
| +"void main() {"
|
| +" gl_FragColor =" V1 "+" V2 "+" V3 "+" V4 "+" V5 "+" V6 "+" V7 "+" V8 ";"
|
| +"}";
|
| +
|
| +GLuint VaryingsShaderProgram(int varyings_count, GLuint vertex_buffer) {
|
| + const char *vertex_shader = NULL;
|
| + const char *fragment_shader = NULL;
|
| + switch (varyings_count) {
|
| + case 1:
|
| + vertex_shader = vertex_shader_1_varying;
|
| + fragment_shader = fragment_shader_1_varying;
|
| + break;
|
| + case 2:
|
| + vertex_shader = vertex_shader_2_varying;
|
| + fragment_shader = fragment_shader_2_varying;
|
| + break;
|
| + case 4:
|
| + vertex_shader = vertex_shader_4_varying;
|
| + fragment_shader = fragment_shader_4_varying;
|
| + break;
|
| + case 8:
|
| + vertex_shader = vertex_shader_8_varying;
|
| + fragment_shader = fragment_shader_8_varying;
|
| + break;
|
| + default: return 0;
|
| + }
|
| + GLuint program =
|
| + InitShaderProgram(vertex_shader, fragment_shader);
|
| +
|
| + int attribute_index = glGetAttribLocation(program, "c");
|
| + glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
| + glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
| + glEnableVertexAttribArray(attribute_index);
|
| +
|
| + return program;
|
| +}
|
| +
|
| +
|
| +const char *fragment_shader_ddx =
|
| +"varying vec4 v1;"
|
| +"void main() {"
|
| +" gl_FragColor = vec4(" DDX "(" V1 ".x), 0., 0., 1.);"
|
| +"}";
|
| +
|
| +const char *fragment_shader_ddy =
|
| +"varying vec4 v1;"
|
| +"void main() {"
|
| +" gl_FragColor = vec4(" DDY "(" V1 ".y), 0., 0., 1.);"
|
| +"}";
|
| +
|
| +GLuint DdxDdyShaderProgram(bool ddx, GLuint vertex_buffer) {
|
| + GLuint program =
|
| + InitShaderProgram(vertex_shader_1_varying,
|
| + ddx ? fragment_shader_ddx : fragment_shader_ddy);
|
| +
|
| + int attribute_index = glGetAttribLocation(program, "c");
|
| + glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
| + glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
| + glEnableVertexAttribArray(attribute_index);
|
| +
|
| + return program;
|
| +}
|
| +
|
| +
|
| +bool VaryingsAndDdxyShaderTest::Run() {
|
| + glViewport(-g_width, -g_height, g_width*2, g_height*2);
|
| +
|
| + const int c = 4;
|
| + GLfloat *vertices = NULL;
|
| + GLsizeiptr vertex_buffer_size = 0;
|
| + CreateLattice(&vertices, &vertex_buffer_size, 1.f / c, 1.f / c, c, c);
|
| + GLuint vertex_buffer = SetupVBO(GL_ARRAY_BUFFER,
|
| + vertex_buffer_size, vertices);
|
| +
|
| + GLuint *indices = NULL;
|
| + GLuint index_buffer = 0;
|
| + GLsizeiptr index_buffer_size = 0;
|
| +
|
| + count_ = CreateMesh(&indices, &index_buffer_size, c, c, 0);
|
| + index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER,
|
| + index_buffer_size, indices);
|
| +
|
| + GLuint program = VaryingsShaderProgram(1, vertex_buffer);
|
| + RunTest(this,
|
| + "mpixels_sec_varyings_shader_1", g_width * g_height, true);
|
| + glDeleteProgram(program);
|
| +
|
| + program = VaryingsShaderProgram(2, vertex_buffer);
|
| + RunTest(this,
|
| + "mpixels_sec_varyings_shader_2", g_width * g_height, true);
|
| + glDeleteProgram(program);
|
| +
|
| + program = VaryingsShaderProgram(4, vertex_buffer);
|
| + RunTest(this,
|
| + "mpixels_sec_varyings_shader_4", g_width * g_height, true);
|
| + glDeleteProgram(program);
|
| +
|
| + program = VaryingsShaderProgram(8, vertex_buffer);
|
| + RunTest(this,
|
| + "mpixels_sec_varyings_shader_8", g_width * g_height, true);
|
| + glDeleteProgram(program);
|
| +
|
| + program = DdxDdyShaderProgram(true, vertex_buffer);
|
| + RunTest(this,
|
| + "mpixels_sec_ddx_shader", g_width * g_height, true);
|
| + glDeleteProgram(program);
|
| +
|
| + program = DdxDdyShaderProgram(false, vertex_buffer);
|
| + RunTest(this,
|
| + "mpixels_sec_ddy_shader", g_width * g_height, true);
|
| + glDeleteProgram(program);
|
| +
|
| + glDeleteBuffers(1, &index_buffer);
|
| + delete[] indices;
|
| +
|
| + glDeleteBuffers(1, &vertex_buffer);
|
| + delete[] vertices;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +
|
| +TestBase* GetVaryingsAndDdxyShaderTest() {
|
| + return new VaryingsAndDdxyShaderTest;
|
| +}
|
| +
|
| +
|
| +} // namespace glbench
|
|
|