[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