i965/vec4_nir: Do boolean source modifier resolves on BDW+
On BDW+, the negation source modifier on NOT, AND, OR, and XOR, is actually a boolean negate and not an integer negate. However, NIR's soruce modifiers are the integer version. We have to resolve it with a MOV prior to emitting the actual instruction. This is basically the same thing we do in the FS backend. Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -320,6 +320,7 @@ public:
|
||||
dst_reg dst, src_reg src0, src_reg src1);
|
||||
|
||||
src_reg fix_3src_operand(src_reg src);
|
||||
src_reg resolve_source_modifiers(const src_reg& src);
|
||||
|
||||
vec4_instruction *emit_math(enum opcode opcode, const dst_reg &dst, const src_reg &src0,
|
||||
const src_reg &src1 = src_reg());
|
||||
|
||||
@@ -1020,18 +1020,33 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr)
|
||||
}
|
||||
|
||||
case nir_op_inot:
|
||||
if (devinfo->gen >= 8) {
|
||||
op[0] = resolve_source_modifiers(op[0]);
|
||||
}
|
||||
emit(NOT(dst, op[0]));
|
||||
break;
|
||||
|
||||
case nir_op_ixor:
|
||||
if (devinfo->gen >= 8) {
|
||||
op[0] = resolve_source_modifiers(op[0]);
|
||||
op[1] = resolve_source_modifiers(op[1]);
|
||||
}
|
||||
emit(XOR(dst, op[0], op[1]));
|
||||
break;
|
||||
|
||||
case nir_op_ior:
|
||||
if (devinfo->gen >= 8) {
|
||||
op[0] = resolve_source_modifiers(op[0]);
|
||||
op[1] = resolve_source_modifiers(op[1]);
|
||||
}
|
||||
emit(OR(dst, op[0], op[1]));
|
||||
break;
|
||||
|
||||
case nir_op_iand:
|
||||
if (devinfo->gen >= 8) {
|
||||
op[0] = resolve_source_modifiers(op[0]);
|
||||
op[1] = resolve_source_modifiers(op[1]);
|
||||
}
|
||||
emit(AND(dst, op[0], op[1]));
|
||||
break;
|
||||
|
||||
|
||||
@@ -312,6 +312,19 @@ vec4_visitor::fix_3src_operand(src_reg src)
|
||||
return src_reg(expanded);
|
||||
}
|
||||
|
||||
src_reg
|
||||
vec4_visitor::resolve_source_modifiers(const src_reg& src)
|
||||
{
|
||||
if (!src.abs && !src.negate)
|
||||
return src;
|
||||
|
||||
dst_reg resolved = dst_reg(this, glsl_type::ivec4_type);
|
||||
resolved.type = src.type;
|
||||
emit(MOV(resolved, src));
|
||||
|
||||
return src_reg(resolved);
|
||||
}
|
||||
|
||||
src_reg
|
||||
vec4_visitor::fix_math_operand(src_reg src)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user