Browse Source

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 <jordan.l.justen@intel.com>
tags/11.1-branchpoint
Matt Turner 10 years ago
parent
commit
a4ba41638d

+ 2
- 0
src/mesa/drivers/dri/i965/brw_fs_builder.h View File

@@ -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)));

+ 4
- 4
src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp View File

@@ -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));

Loading…
Cancel
Save