[Mesa-dev] [PATCH 1/3] mesa/glsl: add ir_unop_round

Brian Paul brianp at vmware.com
Mon Jul 2 15:59:58 PDT 2012


The GLSL round() and roundEven() functions were both generating the
ir_unop_round_even instruction but the GLSL spec allows some leeway for
implementing round().  This change allows drivers to take advantage of
that.  For i965, they still equate to the same thing.
---
 src/glsl/builtins/ir/round.ir                      |    8 ++++----
 src/glsl/ir.cpp                                    |    2 ++
 src/glsl/ir.h                                      |    1 +
 src/glsl/ir_validate.cpp                           |    1 +
 .../dri/i965/brw_fs_channel_expressions.cpp        |    1 +
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp       |    1 +
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp     |    1 +
 src/mesa/program/ir_to_mesa.cpp                    |    1 +
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp         |    1 +
 9 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/glsl/builtins/ir/round.ir b/src/glsl/builtins/ir/round.ir
index d0d425b..becf064 100644
--- a/src/glsl/builtins/ir/round.ir
+++ b/src/glsl/builtins/ir/round.ir
@@ -2,20 +2,20 @@
    (signature float
      (parameters
        (declare (in) float arg0))
-     ((return (expression float round_even (var_ref arg0)))))
+     ((return (expression float round (var_ref arg0)))))
 
    (signature vec2
      (parameters
        (declare (in) vec2 arg0))
-     ((return (expression vec2 round_even (var_ref arg0)))))
+     ((return (expression vec2 round (var_ref arg0)))))
 
    (signature vec3
      (parameters
        (declare (in) vec3 arg0))
-     ((return (expression vec3 round_even (var_ref arg0)))))
+     ((return (expression vec3 round (var_ref arg0)))))
 
    (signature vec4
      (parameters
        (declare (in) vec4 arg0))
-     ((return (expression vec4 round_even (var_ref arg0)))))
+     ((return (expression vec4 round (var_ref arg0)))))
 ))
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 1c9eec6..1ae6197 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -265,6 +265,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
    case ir_unop_ceil:
    case ir_unop_floor:
    case ir_unop_fract:
+   case ir_unop_round:
    case ir_unop_round_even:
    case ir_unop_sin:
    case ir_unop_cos:
@@ -447,6 +448,7 @@ static const char *const operator_strs[] = {
    "ceil",
    "floor",
    "fract",
+   "round",
    "round_even",
    "sin",
    "cos",
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 505d2e7..a7419bb 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -919,6 +919,7 @@ enum ir_expression_operation {
    ir_unop_ceil,
    ir_unop_floor,
    ir_unop_fract,
+   ir_unop_round,
    ir_unop_round_even,
    /*@}*/
 
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index 191d398..5a1f8ea 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -315,6 +315,7 @@ ir_validate::visit_leave(ir_expression *ir)
       break;
 
    case ir_unop_trunc:
+   case ir_unop_round:
    case ir_unop_round_even:
    case ir_unop_ceil:
    case ir_unop_floor:
diff --git a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp
index 983d92e..f973567 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp
@@ -209,6 +209,7 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
    case ir_unop_ceil:
    case ir_unop_floor:
    case ir_unop_fract:
+   case ir_unop_round:
    case ir_unop_round_even:
    case ir_unop_sin:
    case ir_unop_cos:
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 9bd1e67..9ed0c17 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -503,6 +503,7 @@ fs_visitor::visit(ir_expression *ir)
    case ir_unop_fract:
       inst = emit(BRW_OPCODE_FRC, this->result, op[0]);
       break;
+   case ir_unop_round:
    case ir_unop_round_even:
       emit(BRW_OPCODE_RNDE, this->result, op[0]);
       break;
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 25d3c92..66b657a 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1302,6 +1302,7 @@ vec4_visitor::visit(ir_expression *ir)
    case ir_unop_fract:
       inst = emit(FRC(result_dst, op[0]));
       break;
+   case ir_unop_round:
    case ir_unop_round_even:
       emit(RNDE(result_dst, op[0]));
       break;
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 217a264..ca272a7 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -1452,6 +1452,7 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
       break;
 
    case ir_unop_bit_not:
+   case ir_unop_round:
    case ir_unop_round_even:
       emit(ir, OPCODE_MOV, result_dst, op[0]);
       break;
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 96977e4..4b8debc 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1791,6 +1791,7 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
    case ir_unop_floor:
       emit(ir, TGSI_OPCODE_FLR, result_dst, op[0]);
       break;
+   case ir_unop_round:
    case ir_unop_round_even:
       emit(ir, TGSI_OPCODE_ROUND, result_dst, op[0]);
       break;
-- 
1.7.3.4



More information about the mesa-dev mailing list