[Piglit] [PATCH 2/6] MSAA tests: port all GLSL shaders to GLSL 1.20

Marek Olšák maraeo at gmail.com
Tue Jan 15 08:16:50 PST 2013


On Wed, Jan 9, 2013 at 8:57 PM, Paul Berry <stereotype441 at gmail.com> wrote:
> On 6 January 2013 06:12, Marek Olšák <maraeo at gmail.com> wrote:
>>
>> ---
>>  tests/spec/ext_framebuffer_multisample/common.cpp  |  126
>> ++++++++++++--------
>>  .../draw-buffers-common.cpp                        |   52 +++++---
>>  .../ext_framebuffer_multisample/interpolation.cpp  |   28 ++---
>>  .../polygon-stipple.cpp                            |    6 +-
>>  .../sample-coverage.cpp                            |    6 +-
>>  5 files changed, 130 insertions(+), 88 deletions(-)
>>
>> diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp
>> b/tests/spec/ext_framebuffer_multisample/common.cpp
>> index fe6b40b..9109b86 100644
>> --- a/tests/spec/ext_framebuffer_multisample/common.cpp
>> +++ b/tests/spec/ext_framebuffer_multisample/common.cpp
>> @@ -195,12 +195,13 @@ Fbo::try_setup(const FboConfig &new_config)
>>                                                   GL_COLOR_ATTACHMENT0,
>>                                                   GL_RENDERBUFFER,
>> color_rb);
>>                 } else {
>> -                       glBindTexture(GL_TEXTURE_2D, color_tex);
>> -                       glTexParameteri(GL_TEXTURE_2D,
>> GL_TEXTURE_MIN_FILTER,
>> +
>> piglit_require_extension("GL_ARB_texture_rectangle");
>> +                       glBindTexture(GL_TEXTURE_RECTANGLE, color_tex);
>> +                       glTexParameteri(GL_TEXTURE_RECTANGLE,
>> GL_TEXTURE_MIN_FILTER,
>>                                         GL_NEAREST);
>> -                       glTexParameteri(GL_TEXTURE_2D,
>> GL_TEXTURE_MAG_FILTER,
>> +                       glTexParameteri(GL_TEXTURE_RECTANGLE,
>> GL_TEXTURE_MAG_FILTER,
>>                                         GL_NEAREST);
>> -                       glTexImage2D(GL_TEXTURE_2D,
>> +                       glTexImage2D(GL_TEXTURE_RECTANGLE,
>>                                      0 /* level */,
>>                                      config.color_internalformat,
>>                                      config.width,
>> @@ -211,7 +212,7 @@ Fbo::try_setup(const FboConfig &new_config)
>>                                      NULL /* data */);
>>                         glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
>>                                                GL_COLOR_ATTACHMENT0,
>> -                                              GL_TEXTURE_2D,
>> +                                              GL_TEXTURE_RECTANGLE,
>>                                                color_tex,
>>                                                0 /* level */);
>>                 }
>> @@ -274,10 +275,10 @@ void
>>  DownsampleProg::compile(int supersample_factor)
>>  {
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos;\n"
>> -               "in vec2 texCoord;\n"
>> -               "out vec2 texCoordVarying;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos;\n"
>> +               "attribute vec2 texCoord;\n"
>> +               "varying vec2 texCoordVarying;\n"
>>                 "void main()\n"
>>                 "{\n"
>>                 "  gl_Position = vec4(pos, 0.0, 1.0);\n"
>> @@ -285,18 +286,18 @@ DownsampleProg::compile(int supersample_factor)
>>                 "}\n";
>>
>>         static const char *frag =
>> -               "#version 130\n"
>> -               "uniform sampler2D samp;\n"
>> +               "#version 120\n"
>> +               "uniform sampler2DRect samp;\n"
>>                 "uniform int supersample_factor;\n"
>> -               "in vec2 texCoordVarying;\n"
>> +               "varying vec2 texCoordVarying;\n"
>>                 "void main()\n"
>>                 "{\n"
>>                 "  vec4 sum = vec4(0.0);\n"
>> -               "  ivec2 pixel = ivec2(texCoordVarying);\n"
>> +               "  vec2 pixel = floor(texCoordVarying);\n"
>>                 "  for (int i = 0; i < supersample_factor; ++i) {\n"
>>                 "    for (int j = 0; j < supersample_factor; ++j) {\n"
>> -               "      sum += texelFetch(\n"
>> -               "          samp, pixel * supersample_factor + ivec2(i, j),
>> 0);\n"
>> +               "      sum += texture2DRect(\n"
>> +               "          samp, pixel * float(supersample_factor) +
>> vec2(i, j));\n"
>>                 "    }\n"
>>                 "  }\n"
>>                 "  gl_FragColor = sum / (supersample_factor *
>> supersample_factor);\n"
>> @@ -354,7 +355,7 @@ DownsampleProg::run(const Fbo *src_fbo, int
>> dest_width, int dest_height,
>>         float h = dest_height;
>>
>>         glActiveTexture(GL_TEXTURE0);
>> -       glBindTexture(GL_TEXTURE_2D, src_fbo->color_tex);
>> +       glBindTexture(GL_TEXTURE_RECTANGLE, src_fbo->color_tex);
>>
>>         glUseProgram(prog);
>>         glBindVertexArray(vao);
>> @@ -384,15 +385,15 @@ void
>>  ManifestStencil::compile()
>>  {
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos;\n"
>>                 "void main()\n"
>>                 "{\n"
>>                 "  gl_Position = vec4(pos, 0.0, 1.0);\n"
>>                 "}\n";
>>
>>         static const char *frag =
>> -               "#version 130\n"
>> +               "#version 120\n"
>>                 "uniform vec4 color;\n"
>>                 "void main()\n"
>>                 "{\n"
>> @@ -483,8 +484,8 @@ void
>>  ManifestDepth::compile()
>>  {
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos;\n"
>>                 "uniform float depth;\n"
>>                 "void main()\n"
>>                 "{\n"
>> @@ -492,7 +493,7 @@ ManifestDepth::compile()
>>                 "}\n";
>>
>>         static const char *frag =
>> -               "#version 130\n"
>> +               "#version 120\n"
>>                 "uniform vec4 color;\n"
>>                 "void main()\n"
>>                 "{\n"
>> @@ -618,8 +619,8 @@ void Triangles::compile()
>>         float final_scale = 0.95;
>>
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos_within_tri;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos_within_tri;\n"
>>                 "uniform float tri_scale;\n"
>>                 "uniform float rotation_delta;\n"
>>                 "uniform int tris_across;\n"
>> @@ -633,7 +634,7 @@ void Triangles::compile()
>>                 "  float rotation = rotation_delta * tri_num;\n"
>>                 "  pos = mat2(cos(rotation), sin(rotation),\n"
>>                 "             -sin(rotation), cos(rotation)) * pos;\n"
>> -               "  int i = tri_num % tris_across;\n"
>> +               "  int i = int(mod(float(tri_num),
>> float(tris_across)));\n"
>>                 "  int j = tris_across - 1 - tri_num / tris_across;\n"
>>                 "  pos += (vec2(i, j) * 2.0 + 1.0) / tris_across - 1.0;\n"
>>                 "  pos *= final_scale;\n"
>> @@ -641,7 +642,7 @@ void Triangles::compile()
>>                 "}\n";
>>
>>         static const char *frag =
>> -               "#version 130\n"
>> +               "#version 120\n"
>>                 "void main()\n"
>>                 "{\n"
>>                 "  gl_FragColor = vec4(1.0);\n"
>> @@ -731,13 +732,13 @@ InterpolationTestPattern::compile()
>>         float final_scale = 0.95;
>>
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos_within_tri;\n"
>> -               "in vec3 in_barycentric_coords;\n"
>> -               "out vec3 barycentric_coords;\n"
>> -               "centroid out vec3 barycentric_coords_centroid;\n"
>> -               "out vec2 pixel_pos;\n"
>> -               "centroid out vec2 pixel_pos_centroid;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos_within_tri;\n"
>> +               "attribute vec3 in_barycentric_coords;\n"
>> +               "varying vec3 barycentric_coords;\n"
>> +               "centroid varying vec3 barycentric_coords_centroid;\n"
>> +               "varying vec2 pixel_pos;\n"
>> +               "centroid varying vec2 pixel_pos_centroid;\n"
>>                 "uniform float tri_scale;\n"
>>                 "uniform float rotation_delta;\n"
>>                 "uniform int tris_across;\n"
>> @@ -752,7 +753,7 @@ InterpolationTestPattern::compile()
>>                 "  float rotation = rotation_delta * tri_num;\n"
>>                 "  pos = mat2(cos(rotation), sin(rotation),\n"
>>                 "             -sin(rotation), cos(rotation)) * pos;\n"
>> -               "  int i = tri_num % tris_across;\n"
>> +               "  int i = int(mod(float(tri_num),
>> float(tris_across)));\n"
>>                 "  int j = tris_across - 1 - tri_num / tris_across;\n"
>>                 "  pos += (vec2(i, j) * 2.0 + 1.0) / tris_across - 1.0;\n"
>>                 "  pos *= final_scale;\n"
>> @@ -852,8 +853,8 @@ void Lines::compile()
>>         float final_scale = 0.95;
>>
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos_line;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos_line;\n"
>>                 "uniform float line_scale;\n"
>>                 "uniform float rotation_delta;\n"
>>                 "uniform int lines_across;\n"
>> @@ -867,7 +868,7 @@ void Lines::compile()
>>                 "  float rotation = rotation_delta * line_num;\n"
>>                 "  pos = mat2(cos(rotation), sin(rotation),\n"
>>                 "             -sin(rotation), cos(rotation)) * pos;\n"
>> -               "  int i = line_num % lines_across;\n"
>> +               "  int i = int(mod(float(line_num),
>> float(lines_across)));\n"
>>                 "  int j = lines_across - 1 - line_num / lines_across;\n"
>>                 "  pos += (vec2(i, j) * 2.0 + 1.0) / lines_across -
>> 1.0;\n"
>>                 "  pos *= final_scale;\n"
>> @@ -875,7 +876,7 @@ void Lines::compile()
>>                 "}\n";
>>
>>         static const char *frag =
>> -               "#version 130\n"
>> +               "#version 120\n"
>>                 "void main()\n"
>>                 "{\n"
>>                 "  gl_FragColor = vec4(1.0);\n"
>> @@ -951,8 +952,8 @@ void Points::compile()
>>         float final_scale = 0.95;
>>
>>         static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos_point;\n"
>> +               "#version 120\n"
>> +               "attribute vec2 pos_point;\n"
>>                 "uniform float point_scale;\n"
>>                 "uniform int points_across;\n"
>>                 "uniform float final_scale;\n"
>> @@ -963,7 +964,7 @@ void Points::compile()
>>                 "void main()\n"
>>                 "{\n"
>>                 "  vec2 pos = point_scale * pos_point;\n"
>> -               "  int i = point_num % points_across;\n"
>> +               "  int i = int(mod(float(point_num),
>> float(points_across)));\n"
>>                 "  int j = points_across - 1 - point_num /
>> points_across;\n"
>>                 "  pos += (vec2(i, j) * 2.0 + 1.0) / points_across -
>> 1.0;\n"
>>                 "  pos *= final_scale;\n"
>> @@ -971,7 +972,7 @@ void Points::compile()
>>                 "}\n";
>>
>>         static const char *frag =
>> -               "#version 130\n"
>> +               "#version 120\n"
>>                 "void main()\n"
>>                 "{\n"
>>                 "  gl_FragColor = vec4(1.0);\n"
>> @@ -1076,15 +1077,20 @@ void Sunburst::compile()
>>                 { {  0.0,  1.0 }, { 0, 1, 0 } },
>>                 { {  0.3, -0.8 }, { 0, 0, 1 } }
>>         };
>> +        bool need_glsl130 = out_type == GL_INT || out_type ==
>> GL_UNSIGNED_INT;
>> +
>> +       if (need_glsl130) {
>> +               piglit_require_gl_version(30);
>
>
> Minor nit-pick: how about
>
> piglit_require_GLSL_version(130);
>
> instead?  In practice it will be equivalent, and it's a little more
> straightforward to ask for GLSL 1.30 if that's what you need.

I also need to use glBindFragDataLocation, so I need the API as well.

>
>>
>> +       }
>>
>>         /* Total number of triangles drawn */
>>         num_tris = 7;
>>
>> -       static const char *vert =
>> -               "#version 130\n"
>> -               "in vec2 pos_within_tri;\n"
>> -               "in vec3 in_barycentric_coords;\n"
>> -               "out vec3 barycentric_coords;\n"
>> +       static const char *vert_template =
>> +               "#version %s\n"
>> +               "attribute vec2 pos_within_tri;\n"
>> +               "attribute vec3 in_barycentric_coords;\n"
>> +               "varying vec3 barycentric_coords;\n"
>>                 "uniform float rotation;\n"
>>                 "uniform float vert_depth;\n"
>>                 "uniform mat4 proj;\n"
>> @@ -1099,17 +1105,23 @@ void Sunburst::compile()
>>                 "}\n";
>>
>>         static const char *frag_template =
>> -               "#version 130\n"
>> +               "#version %s\n"
>>                 "#define OUT_TYPE %s\n"
>>                 "#define COMPUTE_DEPTH %s\n"
>>                 "uniform float frag_depth;\n"
>> -               "in vec3 barycentric_coords;\n"
>> +               "varying vec3 barycentric_coords;\n"
>>                 "uniform mat3x4 draw_colors;\n"
>> -               "out OUT_TYPE frag_out;\n"
>> +               "#if __VERSION__ == 130\n"
>> +               "  out OUT_TYPE frag_out;\n"
>> +               "#endif\n"
>>                 "\n"
>>                 "void main()\n"
>>                 "{\n"
>> +               "#if __VERSION__ == 130\n"
>>                 "  frag_out = OUT_TYPE(draw_colors *
>> barycentric_coords);\n"
>> +               "#else\n"
>> +               "  gl_FragColor = draw_colors * barycentric_coords;\n"
>> +               "#endif\n"
>>                 "#if COMPUTE_DEPTH\n"
>>                 "  gl_FragDepth = (frag_depth + 1.0) / 2.0;\n"
>>                 "#endif\n"
>> @@ -1117,20 +1129,30 @@ void Sunburst::compile()
>>
>>         /* Compile program */
>>         prog = glCreateProgram();
>> +       unsigned vert_alloc_len =
>> +               strlen(vert_template) + 4;
>> +       char *vert = (char *) malloc(vert_alloc_len);
>> +       sprintf(vert, vert_template, need_glsl130 ? "130" : "120");
>>         GLint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
>> +       free(vert);
>>         glAttachShader(prog, vs);
>> +
>>         const char *out_type_glsl = get_out_type_glsl();
>>         unsigned frag_alloc_len =
>>                 strlen(frag_template) + strlen(out_type_glsl) + 1;
>
>
> Can we change this from "+ 1" to "+ 4" to account for the new version
> parameter?  I'm not 100% sure it's necessary (there's some slop due to the
> fact that the template contains "%s"s that get stripped out by sprintf), but
> it would make the code more obviously correct.

Yes.

>
>>
>>         char *frag = (char *) malloc(frag_alloc_len);
>> -       sprintf(frag, frag_template, out_type_glsl,
>> +       sprintf(frag, frag_template, need_glsl130 ? "130" : "120",
>> +               out_type_glsl,
>>                 compute_depth ? "1" : "0");
>>         GLint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
>>         free(frag);
>>         glAttachShader(prog, fs);
>> +
>>         glBindAttribLocation(prog, 0, "pos_within_tri");
>>         glBindAttribLocation(prog, 1, "in_barycentric_coords");
>> -       glBindFragDataLocation(prog, 0, "frag_out");
>> +       if (need_glsl130) {
>> +               glBindFragDataLocation(prog, 0, "frag_out");
>> +       }
>>         glLinkProgram(prog);
>>         if (!piglit_link_check_status(prog)) {
>>                 piglit_report_result(PIGLIT_FAIL);
>> diff --git
>> a/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
>> b/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
>> index 3831720..e3a98b2 100644
>> --- a/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
>> +++ b/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
>> @@ -107,9 +107,9 @@ static const GLenum draw_buffers[] = {
>>  /* Offset the viewport transformation on depth value passed to the vertex
>>   * shader by setting it to (2 * depth - 1.0).
>>   */
>> -static const char *vert =
>> -       "#version 130\n"
>> -       "in vec2 pos;\n"
>> +static const char *vert_template =
>> +       "#version %s\n"
>> +       "attribute vec2 pos;\n"
>>         "uniform float depth;\n"
>>         "void main()\n"
>>         "{\n"
>> @@ -122,13 +122,19 @@ static const char *vert =
>>   * are enabled or not.
>>   */
>>  static const char *frag_template =
>> -       "#version 130\n"
>> +       "#version %s\n"
>>         "#define DUAL_SRC_BLEND %d\n"
>>         "#define ALPHA_TO_COVERAGE %d\n"
>>         "#define OUT_TYPE %s\n"
>> +       "#if __VERSION__ == 130\n"
>>         "out OUT_TYPE frag_out_0;\n"
>>         "out vec4 frag_out_1;\n"
>>         "out vec4 frag_out_2;\n"
>> +       "#else\n"
>> +       "#define frag_out_0 gl_FragData[0]\n"
>> +       "#define frag_out_1 gl_FragData[1]\n"
>> +       "#define frag_out_2 gl_FragData[2]\n"
>> +       "#endif\n"
>>         "uniform OUT_TYPE frag_0_color;\n"
>>         "uniform vec4 color;\n"
>>         "void main()\n"
>> @@ -155,16 +161,28 @@ get_out_type_glsl(void)
>>  void
>>  shader_compile(bool sample_alpha_to_coverage, bool dual_src_blend)
>>  {
>> +       bool need_glsl130 = is_buffer_zero_integer_format ||
>> dual_src_blend;
>> +
>> +       if (need_glsl130) {
>> +               piglit_require_gl_version(30);
>
>
> Same comment as above.

We use glBindFragDataLocation here too.

Marek


More information about the Piglit mailing list