Mesa (master): i965: Add "discard" support to the new FS backend.

Eric Anholt anholt at kemper.freedesktop.org
Mon Aug 30 17:34:40 UTC 2010


Module: Mesa
Branch: master
Commit: b0a933a4d91c47e697459921073f8afe668bac31
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b0a933a4d91c47e697459921073f8afe668bac31

Author: Eric Anholt <eric at anholt.net>
Date:   Sat Aug 28 22:56:33 2010 -0700

i965: Add "discard" support to the new FS backend.

Fixes 3 testcases related to discard.

---

 src/mesa/drivers/dri/i965/brw_fs.cpp |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 0d29c86..fd65ab2 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -70,6 +70,7 @@ enum fs_opcodes {
    FS_OPCODE_TEX,
    FS_OPCODE_TXB,
    FS_OPCODE_TXL,
+   FS_OPCODE_DISCARD,
 };
 
 static int using_new_fs = -1;
@@ -433,6 +434,7 @@ public:
 			 struct brw_reg *src);
    void generate_tex(fs_inst *inst, struct brw_reg dst, struct brw_reg src);
    void generate_math(fs_inst *inst, struct brw_reg dst, struct brw_reg *src);
+   void generate_discard(fs_inst *inst);
 
    void emit_dummy_fs();
    void emit_interpolation();
@@ -995,7 +997,9 @@ fs_visitor::visit(ir_swizzle *ir)
 void
 fs_visitor::visit(ir_discard *ir)
 {
-   assert(!"FINISHME");
+   assert(ir->condition == NULL); /* FINISHME */
+
+   emit(fs_inst(FS_OPCODE_DISCARD));
 }
 
 void
@@ -1460,6 +1464,17 @@ fs_visitor::generate_tex(fs_inst *inst, struct brw_reg dst, struct brw_reg src)
 	      BRW_SAMPLER_SIMD_MODE_SIMD8);
 }
 
+void
+fs_visitor::generate_discard(fs_inst *inst)
+{
+   struct brw_reg g0 = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW);
+   brw_push_insn_state(p);
+   brw_set_mask_control(p, BRW_MASK_DISABLE);
+   brw_NOT(p, c->emit_mask_reg, brw_mask_reg(1)); /* IMASK */
+   brw_AND(p, g0, c->emit_mask_reg, g0);
+   brw_pop_insn_state(p);
+}
+
 static void
 trivial_assign_reg(int header_size, fs_reg *reg)
 {
@@ -1694,6 +1709,9 @@ fs_visitor::generate_code()
       case FS_OPCODE_TXL:
 	 generate_tex(inst, dst, src[0]);
 	 break;
+      case FS_OPCODE_DISCARD:
+	 generate_discard(inst);
+	 break;
       case FS_OPCODE_FB_WRITE:
 	 generate_fb_write(inst);
 	 break;




More information about the mesa-commit mailing list