[Piglit] [PATCH 1/3] msaa: Make changes in shared code to accomodate dual-src-blending test cases

Paul Berry stereotype441 at gmail.com
Thu Aug 16 09:48:05 PDT 2012


On 15 August 2012 19:17, Anuj Phogat <anuj.phogat at gmail.com> wrote:

> These changes are required to enable dual-src-blending test cases to use
> the
> shared code:
> Generate fragment shader which outputs relevant color values.
> Modify compute_expected_color() function to support dual-src-blending.
>
> V2: Removed unnecessary blitting code in case of dual-src-blending.
>     Also set src1_alpha to 1.0 when sample-alpha-to-one is enabled.
>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  .../alpha-to-coverage-no-draw-buffer-zero.cpp      |    3 +-
>  .../alpha-to-one-msaa-disabled.cpp                 |    3 +-
>  .../alpha-to-one-single-sample-buffer.cpp          |    3 +-
>  .../draw-buffers-alpha-to-coverage.cpp             |    3 +-
>  .../draw-buffers-alpha-to-one.cpp                  |    3 +-
>  .../draw-buffers-common.cpp                        |  180
> +++++++++++++++----
>  .../draw-buffers-common.h                          |    2 +-
>  .../int-draw-buffers-alpha-to-coverage.cpp         |    3 +-
>  .../int-draw-buffers-alpha-to-one.cpp              |    3 +-
>  .../sample-alpha-to-coverage.cpp                   |    5 +-
>  .../sample-alpha-to-one.cpp                        |    3 +-
>  11 files changed, 162 insertions(+), 49 deletions(-)
>
> diff --git
> a/tests/spec/ext_framebuffer_multisample/alpha-to-coverage-no-draw-buffer-zero.cpp
> b/tests/spec/ext_framebuffer_multisample/alpha-to-coverage-no-draw-buffer-zero.cpp
> index ef60778..18ac8eb 100644
> ---
> a/tests/spec/ext_framebuffer_multisample/alpha-to-coverage-no-draw-buffer-zero.cpp
> +++
> b/tests/spec/ext_framebuffer_multisample/alpha-to-coverage-no-draw-buffer-zero.cpp
> @@ -97,7 +97,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_NONE /* color_buffer_zero_format
> */);
> -       shader_compile();
> +       shader_compile(true /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/alpha-to-one-msaa-disabled.cpp
> b/tests/spec/ext_framebuffer_multisample/alpha-to-one-msaa-disabled.cpp
> index 2ad09fd..c0e1ea7 100644
> --- a/tests/spec/ext_framebuffer_multisample/alpha-to-one-msaa-disabled.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/alpha-to-one-msaa-disabled.cpp
> @@ -87,7 +87,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA);
> -       shader_compile();
> +       shader_compile(false /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/alpha-to-one-single-sample-buffer.cpp
> b/tests/spec/ext_framebuffer_multisample/alpha-to-one-single-sample-buffer.cpp
> index 6bc390a..4f58e02 100644
> ---
> a/tests/spec/ext_framebuffer_multisample/alpha-to-one-single-sample-buffer.cpp
> +++
> b/tests/spec/ext_framebuffer_multisample/alpha-to-one-single-sample-buffer.cpp
> @@ -65,7 +65,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA);
> -       shader_compile();
> +       shader_compile(false /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-coverage.cpp
> b/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-coverage.cpp
> index 20a69bc..31213f6 100644
> ---
> a/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-coverage.cpp
> +++
> b/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-coverage.cpp
> @@ -95,7 +95,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA);
> -       shader_compile();
> +       shader_compile(true /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-one.cpp
> b/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-one.cpp
> index 66bfd1c..53127aa 100644
> --- a/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-one.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/draw-buffers-alpha-to-one.cpp
> @@ -116,7 +116,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA);
> -       shader_compile();
> +       shader_compile(false /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
> b/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
> index 8876568..0f51ec1 100644
> --- a/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/draw-buffers-common.cpp
> @@ -88,6 +88,7 @@ static int pattern_width;
>  static int pattern_height;
>
>  static bool is_buffer_zero_integer_format = false;
> +static bool is_dual_src_blending = false;
>  static GLenum draw_buffer_zero_format;
>
>  static const int num_components = 4; /* for RGBA formats */
> @@ -116,30 +117,31 @@ static const char *vert =
>         "  gl_Position = vec4(eye_pos.xy, 2 * depth - 1.0, 1.0);\n"
>         "}\n";
>
> -/* Fragment shader outputs to three draw buffers. Output different alpha
> values
> - * to different draw buffers. This is required to verify that alpha
> values from
> - * draw buffer zero are used to determine the fragment coverage value for
> all
> - * the draw buffers.
> +/* Fragment shader generates three different color outputs. Different
> color
> + * values are generated based on if sample_alpha_to_coverage /
> dual_src_blend
> + * are enabled or not.
>   */
>  static const char *frag_template =
>         "#version 130\n"
> +       "#define DUAL_SRC_BLEND %d\n"
> +       "#define ALPHA_TO_COVERAGE %d\n"
>         "#define OUT_TYPE %s\n"
>         "out OUT_TYPE frag_out_0;\n"
>         "out vec4 frag_out_1;\n"
>         "out vec4 frag_out_2;\n"
>         "uniform OUT_TYPE frag_0_color;\n"
>         "uniform vec4 color;\n"
> -       "uniform bool alphatocoverage;\n"
>         "void main()\n"
>         "{\n"
>         "  frag_out_0 = frag_0_color;\n"
> -       "  if(alphatocoverage) {\n"
> +       "  #if DUAL_SRC_BLEND\n"
> +       "    frag_out_1 = vec4(color.rgb, 1.0 - color.a / 2.0);\n"
> +       "  #elif ALPHA_TO_COVERAGE\n"
>         "    frag_out_1 = vec4(color.rgb, color.a / 2);\n"
>         "    frag_out_2 = vec4(color.rgb, color.a / 4);\n"
> -       "  }\n"
> -       "  else {\n"
> +       "  #else\n"
>         "    frag_out_1 = frag_out_2 = color;\n"
> -       "  }\n"
> +       "  #endif\n"
>         "}\n";
>
>  const char *
> @@ -151,16 +153,19 @@ get_out_type_glsl(void)
>                 return "vec4";
>  }
>  void
> -shader_compile(void)
> +shader_compile(bool sample_alpha_to_coverage, bool dual_src_blend)
>  {
> +       is_dual_src_blending = dual_src_blend;
>         /* Compile program */
>         GLint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
>
> +       /* Generate appropriate fragment shader program */
>         const char *out_type_glsl = get_out_type_glsl();;
>          unsigned frag_alloc_len = strlen(frag_template) +
>                                   strlen(out_type_glsl) + 1;
>         char *frag = (char *) malloc(frag_alloc_len);
> -       sprintf(frag, frag_template, out_type_glsl);
> +       sprintf(frag, frag_template, is_dual_src_blending,
> +               sample_alpha_to_coverage, out_type_glsl);
>
>         GLint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
>         prog = piglit_link_simple_program(vs, fs);
> @@ -170,12 +175,18 @@ shader_compile(void)
>         }
>         free(frag);
>
> -       glBindFragDataLocation(prog, 0, "frag_out_0");
> -       /* For multiple draw buffers */
> -       if (num_draw_buffers > 1) {
> +       if (is_dual_src_blending) {
> +               glBindFragDataLocationIndexed(prog, 0, 0, "frag_out_0");
> +               glBindFragDataLocationIndexed(prog, 0, 1, "frag_out_1");
> +
> +       }
> +       else if (num_draw_buffers > 1) {
> +               glBindFragDataLocation(prog, 0, "frag_out_0");
>                 glBindFragDataLocation(prog, 1, "frag_out_1");
>                 glBindFragDataLocation(prog, 2, "frag_out_2");
>         }
> +       else
> +               glBindFragDataLocation(prog, 0, "frag_out_0");
>
>         glBindAttribLocation(prog, 0, "pos");
>         glEnableVertexAttribArray(0);
> @@ -331,6 +342,76 @@ draw_pattern(bool sample_alpha_to_coverage,
>         free(integer_color);
>  }
>
> +float
> +get_alpha_blend_factor(float src0_alpha, float src1_alpha,
> +                      bool compute_src)
> +{
> +       GLint blend_func;
> +       if(compute_src)
> +               glGetIntegerv(GL_BLEND_SRC_RGB, &blend_func);
> +       else
> +               glGetIntegerv(GL_BLEND_DST_RGB, &blend_func);
> +
> +       switch(blend_func) {
> +               case GL_SRC_ALPHA:
> +                       return src0_alpha;
> +                       break;
> +               case GL_ONE_MINUS_SRC_ALPHA:
> +                       return (1.0 - src0_alpha);
> +                       break;
> +               case GL_SRC1_ALPHA:
> +                       return src1_alpha;
> +                       break;
> +               case GL_ONE_MINUS_SRC1_ALPHA:
> +                       return (1.0 - src1_alpha);
> +                       break;
> +               default:
> +                       printf("Blend function is not supported"
> +                              " by test case\n");
> +       }
> +       return -1;
> +}
> +
> +void
> +compute_blend_color(float *frag_color, int rect_count,
> +                   bool sample_alpha_to_one)
> +{
> +       float src_blend_factor, dst_blend_factor;
> +       /* Taking in to account alpha values output by
> +        * fragment shader.
> +        */
> +       float src0_alpha = color[rect_count * num_components + 3];
> +       float src1_alpha =  1.0 - src0_alpha / 2.0;
> +
> +       if(sample_alpha_to_one && num_samples) {
> +               /* Set fragment src0_alpha, src1_alpha to 1.0 and use them
> +                * to compute blending factors.
> +                */
> +               src0_alpha = 1.0;
> +               src1_alpha = 1.0;
> +       }
> +
> +       src_blend_factor = get_alpha_blend_factor(src0_alpha,
> +                                                 src1_alpha,
> +                                                 true);
> +       dst_blend_factor = get_alpha_blend_factor(src0_alpha,
> +                                                 src1_alpha,
> +                                                 false);
> +       /* Using default BlendEquation, blend_color is:
> +        * src0_color * src_blend_factor + dst_color * dst_blend_factor
> +        */
> +       for (int j = 0; j < num_components; j++) {
> +               float blend_color=
> +               color[rect_count * num_components + j] *
> +               src_blend_factor +
> +               bg_color[j] *
> +               dst_blend_factor;
> +
> +               frag_color[rect_count * num_components + j] =
> +                       (blend_color > 1) ? 1.0 : blend_color;
> +       }
> +}
> +
>  void
>  compute_expected_color(bool sample_alpha_to_coverage,
>                        bool sample_alpha_to_one,
> @@ -339,18 +420,9 @@ compute_expected_color(bool sample_alpha_to_coverage,
>         unsigned buffer_idx_offset = draw_buffer_count *
>                                      num_rects *
>                                      num_components;
> -       /* Coverage value decides the number of samples in multisample
> buffer
> -        * covered by an incoming fragment, which will then receive the
> -        * fragment data. When the multisample buffer is resolved it gets
> -        * blended with the background color which is written to the
> remaining
> -        * samples.
> -        * Page 254 (page 270 of the PDF) of the OpenGL 3.0 spec says:
> -        * "The method of combination is not specified, though a simple
> average
> -        * computed independently for each color component is recommended."
> -        * This is followed by NVIDIA and AMD in their proprietary drivers.
> -        */
>         for (int i = 0; i < num_rects; i++) {
>
> +               float *frag_color = NULL;
>                 float samples_used = coverage[i] * num_samples;
>                 /* Expected color values are computed only for integer
>                  * number of samples_used. Non-integer values may result
> @@ -359,21 +431,49 @@ compute_expected_color(bool sample_alpha_to_coverage,
>                 if(samples_used == (int) samples_used) {
>                         int rect_idx_offset = buffer_idx_offset +
>                                               i * num_components;
> +                       frag_color = (float *) malloc(num_rects *
> +                                                     num_components *
> +                                                     sizeof(float));
> +
> +                       /* Do dual source blending computations */
> +                       if(is_dual_src_blending) {
> +                               compute_blend_color(frag_color,
> +                                                   i /* rect_count */,
> +                                                   sample_alpha_to_one);
> +                       }
> +                       else {
> +                               memcpy(frag_color, color,
> +                                      num_rects * num_components *
> +                                      sizeof(float));
> +                       }
> +
> +                       /* Coverage value decides the number of samples in
> +                        * multisample buffer covered by an incoming
> fragment,
> +                        * which will then receive the fragment data. When
> the
> +                        * multisample buffer is resolved it gets blended
> with
> +                        * the background color which is written to the
> +                        * remaining samples. Page 254 (page 270 of the
> PDF) of
> +                        * the OpenGL 3.0 spec says: "The method of
> combination
> +                        * is not specified, though a simple average
> computed
> +                        * independently for each color component is
> recommended."
> +                        * This is followed by NVIDIA and AMD in their
> proprietary
> +                        * linux drivers.
> +                        */
>                         for (int j = 0; j < num_components - 1 ; j++) {
>
>                                 expected_color[rect_idx_offset + j] =
> -                               color[i * num_components + j] *
> coverage[i] +
> +                               frag_color[i * num_components + j] *
> coverage[i] +
>                                 bg_color[j] * (1 - coverage[i]);
>                         }
>
>                         /* Compute expected alpha values of draw buffers */
> -                       float frag_alpha = color[i * num_components + 3];
> +                       float frag_alpha = frag_color[i * num_components +
> 3];
>                         int alpha_idx = rect_idx_offset + 3;
>
>                         if ((!num_samples &&
>                              !sample_alpha_to_coverage) ||
>                             is_buffer_zero_integer_format) {
> -                               /* Taking in account alpha values modified
> by
> +                               /* Taking in to account alpha values
> output by
>                                  * fragment shader.
>                                  */
>                                 expected_color[alpha_idx] =
> @@ -382,7 +482,7 @@ compute_expected_color(bool sample_alpha_to_coverage,
>                                         frag_alpha;
>                         }
>                         else if (sample_alpha_to_coverage) {
> -                               /* Taking in account alpha values modified
> by
> +                               /* Taking in to account alpha values
> output by
>                                  * fragment shader.
>                                  */
>                                 frag_alpha /= (1 << draw_buffer_count);
> @@ -402,6 +502,7 @@ compute_expected_color(bool sample_alpha_to_coverage,
>                                         sample_alpha_to_one ? 1.0 :
> frag_alpha;
>                         }
>                 }
> +               free(frag_color);
>         }
>
>  }
> @@ -448,11 +549,11 @@ compute_expected(bool sample_alpha_to_coverage,
>                 /* Don't compute expected color for color buffer zero
>                  * if no renderbuffer is attached to it.
>                  */
> -               if(draw_buffer_count == 0 && draw_buffer_zero_format ==
> GL_NONE)
> -                       return;
> -               compute_expected_color(sample_alpha_to_coverage,
> -                                      sample_alpha_to_one,
> -                                      draw_buffer_count);
> +               if(draw_buffer_count ||
> +                  draw_buffer_zero_format != GL_NONE)
> +                       compute_expected_color(sample_alpha_to_coverage,
> +                                              sample_alpha_to_one,
> +                                              draw_buffer_count);
>

Was this hunk intentional?  It looks like it undoes my suggestion for
improving "[PATCH 1/2] msaa: Make few changes to shared code to accomodate
no-draw-buffer-zero test".

In any case, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


>         }
>         else if (buffer_to_test == GL_DEPTH_BUFFER_BIT)
>                 compute_expected_depth();
> @@ -645,15 +746,16 @@ draw_test_image(bool sample_alpha_to_coverage, bool
> sample_alpha_to_one)
>                                   pattern_width, pattern_height + y_offset,
>                                   buffer_to_test, GL_NEAREST);
>
> -               if(buffer_to_test == GL_COLOR_BUFFER_BIT)
> -                       draw_image_to_window_system_fb(i /*
> draw_buffer_count */,
> +               if(buffer_to_test == GL_COLOR_BUFFER_BIT) {
> +                       draw_image_to_window_system_fb(i
> /*draw_buffer_count*/,
>                                                        false /* rhs */);
> +               }
>
>                 /* Expected color values for all the draw buffers are
> computed
>                  * to aid probe_framebuffer_color() and
> probe_framebuffer_depth()
>                  * in verification.
>                  */
> -               if(sample_alpha_to_coverage) {
> +               if(sample_alpha_to_coverage || is_dual_src_blending) {
>                         /* Expected color is different for different draw
>                          * buffers
>                          */
> @@ -716,8 +818,10 @@ draw_reference_image(bool sample_alpha_to_coverage,
> bool sample_alpha_to_one)
>                                   pattern_width, pattern_height + y_offset,
>                                   buffer_to_test, GL_NEAREST);
>
> -               draw_image_to_window_system_fb(i /* buffer_count */,
> -                                              true  /* rhs */ );
> +               if(buffer_to_test == GL_COLOR_BUFFER_BIT) {
> +                       draw_image_to_window_system_fb(i
> /*draw_buffer_count*/,
> +                                                      true /* rhs */);
> +               }
>         }
>  }
>
> diff --git a/tests/spec/ext_framebuffer_multisample/draw-buffers-common.h
> b/tests/spec/ext_framebuffer_multisample/draw-buffers-common.h
> index b36bed3..43a8e42 100644
> --- a/tests/spec/ext_framebuffer_multisample/draw-buffers-common.h
> +++ b/tests/spec/ext_framebuffer_multisample/draw-buffers-common.h
> @@ -63,4 +63,4 @@ bool probe_framebuffer_color(void);
>   */
>  bool probe_framebuffer_depth(void);
>
> -void shader_compile(void);
> +void shader_compile(bool sample_alpha_to_coverage, bool dual_src_blend);
> diff --git
> a/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-coverage.cpp
> b/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-coverage.cpp
> index 40b9ddf..cfd90e5 100644
> ---
> a/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-coverage.cpp
> +++
> b/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-coverage.cpp
> @@ -96,7 +96,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA8I);
> -       shader_compile();
> +       shader_compile(true /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-one.cpp
> b/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-one.cpp
> index 7dae6bf..9827db8 100644
> ---
> a/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-one.cpp
> +++
> b/tests/spec/ext_framebuffer_multisample/int-draw-buffers-alpha-to-one.cpp
> @@ -93,7 +93,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA8I);
> -       shader_compile();
> +       shader_compile(false /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage.cpp
> b/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage.cpp
> index 0559adc..38e4ae9 100644
> --- a/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage.cpp
> @@ -28,7 +28,7 @@
>   *
>   * Verify sample alpha to coverage with multisample FBO
>   *
> - * When rendering to multiple draw buffers, fragment's alpha value should
> be
> + * When rendering to multisample FBO, fragment's alpha value should be
>   * used to determine the coverage value.
>   *
>   * This test operates by drawing a pattern in multisample FBO to generate
> @@ -103,7 +103,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       buffer_to_test,
>                                       GL_RGBA);
> -       shader_compile();
> +       shader_compile(true /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> diff --git
> a/tests/spec/ext_framebuffer_multisample/sample-alpha-to-one.cpp
> b/tests/spec/ext_framebuffer_multisample/sample-alpha-to-one.cpp
> index 76d056f..85a08d5 100644
> --- a/tests/spec/ext_framebuffer_multisample/sample-alpha-to-one.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/sample-alpha-to-one.cpp
> @@ -87,7 +87,8 @@ piglit_init(int argc, char **argv)
>                                       num_attachments,
>                                       GL_COLOR_BUFFER_BIT,
>                                       GL_RGBA);
> -       shader_compile();
> +       shader_compile(false /* sample_alpha_to_coverage */,
> +                      false /* dual_src_blend */);
>  }
>
>  enum piglit_result
> --
> 1.7.7.6
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20120816/4dd1a7b3/attachment-0001.html>


More information about the Piglit mailing list