From a4ba41638d41865ef34bf36a525efcf8102c01ee Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Fri, 28 Aug 2015 17:10:00 -0700 Subject: [PATCH] i965/fs: Use greater-equal cmod to implement maximum. The docs specifically call out SEL with .l and .ge as the implementations of MIN and MAX respectively. Among other things, SEL with these conditional mods are commutative. See commit 3b7f683f. Reviewed-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_fs_builder.h | 2 ++ src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs_builder.h b/src/mesa/drivers/dri/i965/brw_fs_builder.h index 34545ea..df10a9d 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_builder.h +++ b/src/mesa/drivers/dri/i965/brw_fs_builder.h @@ -372,6 +372,8 @@ namespace brw { emit_minmax(const dst_reg &dst, const src_reg &src0, const src_reg &src1, brw_conditional_mod mod) const { + assert(mod == BRW_CONDITIONAL_GE || mod == BRW_CONDITIONAL_L); + if (shader->devinfo->gen >= 6) { set_condmod(mod, SEL(dst, fix_unsigned_negate(src0), fix_unsigned_negate(src1))); diff --git a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp index 50e0acd..727e8d1 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp @@ -686,7 +686,7 @@ namespace { if (is_signed) bld.emit_minmax(offset(dst, bld, c), offset(dst, bld, c), fs_reg(-(int)scale(widths[c] - s) - 1), - BRW_CONDITIONAL_G); + BRW_CONDITIONAL_GE); } } @@ -717,7 +717,7 @@ namespace { if (is_signed) bld.emit_minmax(offset(dst, bld, c), offset(dst, bld, c), fs_reg(-1.0f), - BRW_CONDITIONAL_G); + BRW_CONDITIONAL_GE); } } return dst; @@ -741,7 +741,7 @@ namespace { /* Clamp the normalized floating-point argument. */ if (is_signed) { bld.emit_minmax(offset(fdst, bld, c), offset(src, bld, c), - fs_reg(-1.0f), BRW_CONDITIONAL_G); + fs_reg(-1.0f), BRW_CONDITIONAL_GE); bld.emit_minmax(offset(fdst, bld, c), offset(fdst, bld, c), fs_reg(1.0f), BRW_CONDITIONAL_L); @@ -812,7 +812,7 @@ namespace { /* Clamp to the minimum value. */ if (widths[c] < 16) bld.emit_minmax(offset(fdst, bld, c), offset(fdst, bld, c), - fs_reg(0.0f), BRW_CONDITIONAL_G); + fs_reg(0.0f), BRW_CONDITIONAL_GE); /* Convert to 16-bit floating-point. */ bld.F32TO16(offset(dst, bld, c), offset(fdst, bld, c)); -- 2.7.4