[Mesa-dev] [PATCH V2 2/2] meta: Use gl_FragColor to output color values to all the draw buffers

Pohjolainen, Topi topi.pohjolainen at intel.com
Tue May 20 10:49:16 PDT 2014


On Tue, May 20, 2014 at 10:31:05AM -0700, Anuj Phogat wrote:
> _mesa_meta_setup_blit_shader() currently generates a fragment shader
> which, irrespective of the number of draw buffers, writes the color
> to only one 'out' variable. Current shader rely on an undefined
> behavior and possibly works by chance.
> 
> From OpenGL 4.0  spec, page 256:
>   "If a fragment shader writes to gl_FragColor, DrawBuffers specifies a
>    set of draw buffers into which the single fragment color defined by
>    gl_FragColor is written. If a fragment shader writes to gl_FragData,
>    or a user-defined varying out variable, DrawBuffers specifies a set
>    of draw buffers into which each of the multiple output colors defined
>    by these variables are separately written. If a fragment shader writes
>    to none of gl_FragColor, gl_FragData, nor any user defined varying out
>    variables, the values of the fragment colors following shader execution
>    are undefined, and may differ for each fragment color."
> 
> OpenGL 4.4 spec, page 463, added an additional line in this section:
>   "If some, but not all user-defined output variables are written, the
>    values of fragment colors corresponding to unwritten variables are
>    similarly undefined."
> 
> V2: Write color output to gl_FragColor instead of writing to multiple
>     'out' variables. This'll avoid recompiling the shader every time
>     draw buffers count is updated.
> 
> Cc: <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> Reviewed-by: Matt Turner <mattst88 at gmail.com> (V1)

Fixes gles3 cts tests:

framebuffer_blit_functionality_color_and_depth_blit.test
framebuffer_blit_functionality_nearest_filter_color_blit.test
framebuffer_blit_functionality_linear_filter_color_blit.test
framebuffer_blit_functionality_color_and_stencil_blit.test

> ---
>  src/mesa/drivers/common/meta.c | 15 ++++-----------
>  1 file changed, 4 insertions(+), 11 deletions(-)
> 
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index fab9106..337be1b 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -246,7 +246,6 @@ _mesa_meta_setup_blit_shader(struct gl_context *ctx,
>     void *const mem_ctx = ralloc_context(NULL);
>     struct blit_shader *shader = choose_blit_shader(target, table);
>     const char *vs_input, *vs_output, *fs_input, *vs_preprocess, *fs_preprocess;
> -   const char *fs_output_var, *fs_output_var_decl;
>  
>     if (ctx->Const.GLSLVersion < 130) {
>        vs_preprocess = "";
> @@ -254,16 +253,12 @@ _mesa_meta_setup_blit_shader(struct gl_context *ctx,
>        vs_output = "varying";
>        fs_preprocess = "#extension GL_EXT_texture_array : enable";
>        fs_input = "varying";
> -      fs_output_var_decl = "";
> -      fs_output_var = "gl_FragColor";
>     } else {
>        vs_preprocess = "#version 130";
>        vs_input = "in";
>        vs_output = "out";
>        fs_preprocess = "#version 130";
>        fs_input = "in";
> -      fs_output_var_decl = "out vec4 out_color;";
> -      fs_output_var = "out_color";
>        shader->func = "texture";
>     }
>  
> @@ -291,15 +286,13 @@ _mesa_meta_setup_blit_shader(struct gl_context *ctx,
>                  "#extension GL_ARB_texture_cube_map_array: enable\n"
>                  "uniform %s texSampler;\n"
>                  "%s vec4 texCoords;\n"
> -                "%s\n"
>                  "void main()\n"
>                  "{\n"
> -                "   vec4 color = %s(texSampler, %s);\n"
> -                "   %s = color;\n"
> -                "   gl_FragDepth = color.x;\n"
> +                "   gl_FragColor = %s(texSampler, %s);\n"
> +                "   gl_FragDepth = gl_FragColor.x;\n"
>                  "}\n",
> -                fs_preprocess, shader->type, fs_input, fs_output_decl,
> -                shader->func, shader->texcoords, fs_output);
> +                fs_preprocess, shader->type, fs_input,
> +                shader->func, shader->texcoords);
>  
>     _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source,
>                                         ralloc_asprintf(mem_ctx, "%s blit",
> -- 
> 1.8.3.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list