[Mesa-dev] [PATCH 06/23] i965/fs: Optimize gl_FrontFacing used alone as a condition

Ian Romanick idr at freedesktop.org
Fri Mar 20 13:58:06 PDT 2015


From: Ian Romanick <ian.d.romanick at intel.com>

Shader-db results:

Ivy Bridge (0x0166):
total instructions in shared programs: 6291662 -> 6291642 (-0.00%)
instructions in affected programs:     3383 -> 3363 (-0.59%)
helped:                                20

Haswell (0x0426):
total instructions in shared programs: 5779036 -> 5779016 (-0.00%)
instructions in affected programs:     3050 -> 3030 (-0.66%)
helped:                                20

Broadwell (0x162E):
total instructions in shared programs: 6822830 -> 6822810 (-0.00%)
instructions in affected programs:     3038 -> 3018 (-0.66%)
helped:                                20

No change on GM45, Iron Lake, Sandy Bridge, or any platform with NIR.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 30 ++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index bde9492..f1e9fb5 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -2631,6 +2631,36 @@ fs_visitor::emit_bool_to_cond_code(ir_rvalue *ir)
       return;
    }
 
+   /* Try to generate the condition code more efficiently for gl_FrontFacing
+    * and !gl_FrontFacing.
+    */
+   enum brw_conditional_mod cm;
+   ir_dereference_variable *deref;
+
+   if (expr && expr->operation == ir_unop_logic_not) {
+      cm = BRW_CONDITIONAL_NZ;
+      deref = expr->operands[0]->as_dereference_variable();
+   } else {
+      cm = BRW_CONDITIONAL_Z;
+      deref = ir->as_dereference_variable();
+   }
+
+   if (deref != NULL && strcmp(deref->var->name, "gl_FrontFacing") == 0) {
+      if (brw->gen >= 6) {
+         /* Bit 15 of g0.0 is 0 if the polygon is front facing. */
+         emit(AND(reg_null_d, retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_D),
+                  fs_reg(0x00008000)))
+            ->conditional_mod = cm;
+      } else {
+         /* Bit 31 of g1.6 is 0 if the polygon is front facing. */
+         emit(AND(reg_null_d, retype(brw_vec1_grf(1, 6), BRW_REGISTER_TYPE_D),
+                  fs_reg(0x80000000)))
+            ->conditional_mod = cm;
+      }
+
+      return;
+   }
+
    fs_reg op[3];
 
    assert(expr->get_num_operands() <= 3);
-- 
2.1.0



More information about the mesa-dev mailing list