[Mesa-dev] [PATCH 4/4] i965/fs: Don't issue FB writes for bound but unwritten color targets.
Jason Ekstrand
jason at jlekstrand.net
Fri Feb 27 14:01:37 PST 2015
Thanks for figuring out how to do this properly.
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
On Fri, Feb 27, 2015 at 12:06 AM, Kenneth Graunke <kenneth at whitecape.org>
wrote:
> We used to loop over all color attachments, and emit FB writes for each
> one, even if the shader didn't write to a corresponding output variable.
> Those color attachments would be filled with garbage (undefined values).
>
> Football Manager binds a framebuffer with 4 color attachments, but draws
> to it using a shader that only writes to gl_FragData[0..2]. This meant
> that color attachment 3 would be filled with garbage, resulting in
> rendering artifacts. Now we skip writing to it, fixing rendering.
>
> Writes to gl_FragColor initialize outputs[0..nr_color_regions-1] to
> GRFs, while writes to gl_FragData[i] initialize outputs[i].
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86747
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> While this should be much more correct, I wonder if more fixes are needed.
>
> It seems like the loop condition should be:
>
> for (int target = 0; target < BRW_MAX_DRAW_BUFFERS; target++)
>
> Even if we have only 1 color region, it could be attached to
> GL_COLOR_ATTACHMENT3. (Ilia mentioned this should be legal.)
> It sure looks like that would break here (and probably always has).
> Unfortunately, fixing that means binding more NULL render targets,
> and that's complex enough I think it's best left to a follow-up series.
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 77e1103..dc5c2fe 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -3646,7 +3646,7 @@ fs_visitor::emit_fb_writes()
> do_dual_src = false;
> }
>
> - fs_inst *inst;
> + fs_inst *inst = NULL;
> if (do_dual_src) {
> this->current_annotation = ralloc_asprintf(this->mem_ctx,
> "FB dual-source write");
> @@ -3654,8 +3654,12 @@ fs_visitor::emit_fb_writes()
> reg_undef, 4);
> inst->target = 0;
> prog_data->dual_src_blend = true;
> - } else if (key->nr_color_regions > 0) {
> + } else {
> for (int target = 0; target < key->nr_color_regions; target++) {
> + /* Skip over outputs that weren't written. */
> + if (this->outputs[target].file == BAD_FILE)
> + continue;
> +
> this->current_annotation = ralloc_asprintf(this->mem_ctx,
> "FB write target %d",
> target);
> @@ -3668,7 +3672,9 @@ fs_visitor::emit_fb_writes()
> this->output_components[target]);
> inst->target = target;
> }
> - } else {
> + }
> +
> + if (inst == NULL) {
> /* Even if there's no color buffers enabled, we still need to send
> * alpha out the pipeline to our null renderbuffer to support
> * alpha-testing, alpha-to-coverage, and so on.
> --
> 2.2.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150227/f5deb8fa/attachment-0001.html>
More information about the mesa-dev
mailing list