Mesa (master): glsl: Add unary operation ir_unop_f2u.

Paul Berry stereotype441 at kemper.freedesktop.org
Fri Jun 15 16:12:39 UTC 2012


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

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Wed Jun 13 15:47:45 2012 -0700

glsl: Add unary operation ir_unop_f2u.

Previously, we performed conversions from float->uint by a two step
process: float->int->uint.  However, on platforms that use saturating
conversions (e.g. i965), this didn't work, because if the source value
was larger than the maximum representable int (0x7fffffff), then
converting it to an int would clamp it to 0x7fffffff.

This patch just adds the new opcode; further patches will adapt
optimization passes and back-ends to use it, and then finally the
ast_to_hir logic will be modified to emit the new opcode.

Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/glsl/ir.cpp          |    2 ++
 src/glsl/ir.h            |    1 +
 src/glsl/ir_validate.cpp |    4 ++++
 3 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index f81bfd1..1c9eec6 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -299,6 +299,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
       break;
 
    case ir_unop_i2u:
+   case ir_unop_f2u:
    case ir_unop_bitcast_f2u:
       this->type = glsl_type::get_instance(GLSL_TYPE_UINT,
 					   op0->type->vector_elements, 1);
@@ -428,6 +429,7 @@ static const char *const operator_strs[] = {
    "exp2",
    "log2",
    "f2i",
+   "f2u",
    "i2f",
    "f2b",
    "b2f",
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 55535b2..014f363 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -896,6 +896,7 @@ enum ir_expression_operation {
    ir_unop_exp2,
    ir_unop_log2,
    ir_unop_f2i,         /**< Float-to-integer conversion. */
+   ir_unop_f2u,         /**< Float-to-unsigned conversion. */
    ir_unop_i2f,         /**< Integer-to-float conversion. */
    ir_unop_f2b,         /**< Float-to-boolean conversion */
    ir_unop_b2f,         /**< Boolean-to-float conversion */
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index 5721717..191d398 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -256,6 +256,10 @@ ir_validate::visit_leave(ir_expression *ir)
       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
       assert(ir->type->base_type == GLSL_TYPE_INT);
       break;
+   case ir_unop_f2u:
+      assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
+      assert(ir->type->base_type == GLSL_TYPE_UINT);
+      break;
    case ir_unop_i2f:
       assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
       assert(ir->type->base_type == GLSL_TYPE_FLOAT);




More information about the mesa-commit mailing list