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