[Mesa-dev] [PATCH 2/3] i965/fs: Make emit_if_gen6 never fall back to emit_bool_to_cond_code.
Matt Turner
mattst88 at gmail.com
Thu Sep 4 10:10:14 PDT 2014
On Thu, Sep 4, 2014 at 12:18 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Matt and I believe that Sandybridge actually uses 0xFFFFFFFF for a
> "true" comparison result, similar to Ivybridge. This matches the
> internal documentation, and empirical results, but contradicts the PRM.
>
> So, the comment is inaccurate, and we can actually just handle these
> directly without ever needing to fall through to the condition code
> path.
>
> Also, the vec4 backend has always done it this way, and has apparently
> been working fine. This patch makes the FS backend match the vec4
> backend's behavior.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 25 +++++++++++++++++--------
> 1 file changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 8f2e1df..d7e3120 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -2378,14 +2378,24 @@ fs_visitor::emit_if_gen6(ir_if *ir)
>
> switch (expr->operation) {
> case ir_unop_logic_not:
> + emit(IF(op[0], fs_reg(0), BRW_CONDITIONAL_Z));
> + return;
> +
> case ir_binop_logic_xor:
> + emit(IF(op[0], op[1], BRW_CONDITIONAL_NZ));
> + return;
> +
> case ir_binop_logic_or:
> + temp = fs_reg(this, glsl_type::bool_type);
> + emit(OR(temp, op[0], op[1]));
> + emit(IF(temp, fs_reg(0), BRW_CONDITIONAL_NZ));
> + return;
> +
> case ir_binop_logic_and:
> - /* For operations on bool arguments, only the low bit of the bool is
> - * valid, and the others are undefined. Fall back to the condition
> - * code path.
> - */
> - break;
> + temp = fs_reg(this, glsl_type::bool_type);
> + emit(AND(temp, op[0], op[1]));
For this and the OR case, we might as well generate the flag and use a
predicated IF if we have to use two instructions. That would let the
SEL peephole not emit an extra CMP.
One of us can do this in a follow up. This patch is fine since it
makes the code like the vec4 code.
Reviewed-by: Matt Turner <mattst88 at gmail.com>
More information about the mesa-dev
mailing list