[Mesa-dev] [PATCH] i965/fs: Fix Sandybridge regressions from SEL optimization.
Matt Turner
mattst88 at gmail.com
Thu Aug 15 15:27:23 PDT 2013
On Tue, Aug 13, 2013 at 4:47 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Sandybridge is the only platform that supports an IF instruction
> with an embedded comparison. In this case, we need to emit a CMP
> to go along with the SEL.
>
> Fixes regressions in Piglit's glsl-fs-atan-3, fs-unpackHalf2x16,
> fs-faceforward-float-float-float, isinf-and-isnan fs_basic, and
> isinf-and-isnan fs_fbo.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 17 +++++++++++++----
> 1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index a36c248..984b08a 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -1911,10 +1911,19 @@ fs_visitor::try_replace_with_sel()
> emit(MOV(src0, then_mov->src[0]));
> }
>
> - fs_inst *sel = emit(BRW_OPCODE_SEL, then_mov->dst, src0, else_mov->src[0]);
> - sel->predicate = if_inst->predicate;
> - sel->predicate_inverse = if_inst->predicate_inverse;
> - sel->conditional_mod = if_inst->conditional_mod;
> + fs_inst *sel;
> + if (if_inst->conditional_mod) {
> + /* Sandybridge-specific IF with embedded comparison */
> + emit(CMP(reg_null_d, if_inst->src[0], if_inst->src[1],
> + if_inst->conditional_mod));
> + sel = emit(BRW_OPCODE_SEL, then_mov->dst, src0, else_mov->src[0]);
> + sel->predicate = BRW_PREDICATE_NORMAL;
> + } else {
> + /* Separate CMP and IF instructions */
> + sel = emit(BRW_OPCODE_SEL, then_mov->dst, src0, else_mov->src[0]);
> + sel->predicate = if_inst->predicate;
> + sel->predicate_inverse = if_inst->predicate_inverse;
> + }
> }
> }
>
> --
> 1.8.3.4
Reviewed-by: Matt Turner <mattst88 at gmail.com>
More information about the mesa-dev
mailing list