diff options
author | Eric Anholt <[email protected]> | 2010-05-07 12:12:49 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2010-06-24 15:05:20 -0700 |
commit | 1d20862c8a0e100e43458f01217c047c76da05f3 (patch) | |
tree | 67c288e841665c9180a3dda757b590e74653ffdd | |
parent | c5ca73e72c27b2e5d7fcf4662b9921ddb3a9627b (diff) |
ir_to_mesa: add logic_not and f2b to get CorrectParse2.frag working.
-rw-r--r-- | ir_to_mesa.cpp | 31 | ||||
-rw-r--r-- | ir_to_mesa.h | 1 |
2 files changed, 32 insertions, 0 deletions
diff --git a/ir_to_mesa.cpp b/ir_to_mesa.cpp index 487e24986f9..8858d4be68e 100644 --- a/ir_to_mesa.cpp +++ b/ir_to_mesa.cpp @@ -195,6 +195,27 @@ ir_to_mesa_visitor::create_tree(int op, return tree; } +struct mbtree * +ir_to_mesa_visitor::create_tree_for_float(ir_instruction *ir, float val) +{ + struct mbtree *tree = (struct mbtree *)calloc(sizeof(struct mbtree), 1); + + tree = this->create_tree(MB_TERM_reference_vec4, ir, NULL, NULL); + + /* FINISHME: This will end up being _mesa_add_unnamed_constant, + * which handles sharing values and sharing channels of vec4 + * constants for small values. + */ + /* FINISHME: Do something with the constant values for now. + */ + (void)val; + ir_to_mesa_set_tree_reg(tree, PROGRAM_CONSTANT, this->next_constant++); + tree->src_reg.swizzle = SWIZZLE_NOOP; + + this->result = tree; + return tree; +} + /** * In the initial pass of codegen, we assign temporary numbers to * intermediate results. (not SSA -- variable assignments will reuse @@ -344,6 +365,11 @@ ir_to_mesa_visitor::visit(ir_expression *ir) this->result = NULL; switch (ir->operation) { + case ir_unop_logic_not: + this->result = this->create_tree_for_float(ir, 0.0); + this->result = this->create_tree(MB_TERM_seq_vec4_vec4, ir, + op[0], this->result); + break; case ir_unop_exp: this->result = this->create_tree(MB_TERM_exp_vec4, ir, op[0], NULL); break; @@ -416,6 +442,11 @@ ir_to_mesa_visitor::visit(ir_expression *ir) case ir_unop_f2i: this->result = this->create_tree(MB_TERM_trunc_vec4, ir, op[0], NULL); break; + case ir_unop_f2b: + this->result = this->create_tree_for_float(ir, 0.0); + this->result = this->create_tree(MB_TERM_sne_vec4_vec4, ir, + op[0], this->result); + break; default: break; } diff --git a/ir_to_mesa.h b/ir_to_mesa.h index 3aa88bcdc40..43ddd5fe517 100644 --- a/ir_to_mesa.h +++ b/ir_to_mesa.h @@ -108,6 +108,7 @@ public: ir_instruction *ir, struct mbtree *left, struct mbtree *right); + struct mbtree *create_tree_for_float(ir_instruction *ir, float val); /** * \name Visit methods |