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-sta...@lists.freedesktop.org> > Signed-off-by: Anuj Phogat <anuj.pho...@gmail.com> > Reviewed-by: Matt Turner <matts...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev