glsl2: Add ir_unop_fract as an expression type.
authorEric Anholt <eric@anholt.net>
Thu, 1 Jul 2010 17:37:11 +0000 (10:37 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 1 Jul 2010 18:07:22 +0000 (11:07 -0700)
Most backends will prefer seeing this to seeing (a - floor(a)), so
represent it explicitly.

src/glsl/builtin_function.cpp
src/glsl/builtins/110/fract
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_constant_expression.cpp
src/mesa/shader/ir_to_mesa.cpp

index b7dbc6b34f5fd4aba191b7b1c38204e5d6cfed5c..30ba6a52677afbeca1797c46b57b6ad62fd6dea6 100644 (file)
@@ -781,22 +781,22 @@ static const char *builtins_110_fract = {
    "   (signature float\n"
    "     (parameters\n"
    "       (declare (in) float x))\n"
-   "     ((return (expression float - (var_ref x) (expression float floor (var_ref x))))))\n"
+   "     ((return (expression float fract (var_ref x)))))\n"
    "\n"
    "   (signature vec2\n"
    "     (parameters\n"
    "       (declare (in) vec2 x))\n"
-   "     ((return (expression vec2 - (var_ref x) (expression vec2 floor (var_ref x))))))\n"
+   "     ((return (expression vec2 fract (var_ref x)))))\n"
    "\n"
    "   (signature vec3\n"
    "     (parameters\n"
    "       (declare (in) vec3 x))\n"
-   "     ((return (expression vec3 - (var_ref x) (expression vec3 floor (var_ref x))))))\n"
+   "     ((return (expression vec3 fract (var_ref x)))))\n"
    "\n"
    "   (signature vec4\n"
    "     (parameters\n"
    "       (declare (in) vec4 x))\n"
-   "     ((return (expression vec4 - (var_ref x) (expression vec4 floor (var_ref x))))))\n"
+   "     ((return (expression vec4 fract (var_ref x)))))\n"
    "))\n"
    "\n"
 };
index 46741bb3cb4cfddf6662e1bce1a46341f365ce5f..3f0763d1b3e21955d75ba481429229c34711e6af 100644 (file)
@@ -2,21 +2,21 @@
    (signature float
      (parameters
        (declare (in) float x))
-     ((return (expression float - (var_ref x) (expression float floor (var_ref x))))))
+     ((return (expression float fract (var_ref x)))))
 
    (signature vec2
      (parameters
        (declare (in) vec2 x))
-     ((return (expression vec2 - (var_ref x) (expression vec2 floor (var_ref x))))))
+     ((return (expression vec2 fract (var_ref x)))))
 
    (signature vec3
      (parameters
        (declare (in) vec3 x))
-     ((return (expression vec3 - (var_ref x) (expression vec3 floor (var_ref x))))))
+     ((return (expression vec3 fract (var_ref x)))))
 
    (signature vec4
      (parameters
        (declare (in) vec4 x))
-     ((return (expression vec4 - (var_ref x) (expression vec4 floor (var_ref x))))))
+     ((return (expression vec4 fract (var_ref x)))))
 ))
 
index 60ee36d17cb9a09345e71469e936c550ce075ef5..4257842583958398fdccc2396f024112daab8125 100644 (file)
@@ -72,6 +72,7 @@ ir_expression::get_num_operands(ir_expression_operation op)
       1, /* ir_unop_trunc */
       1, /* ir_unop_ceil */
       1, /* ir_unop_floor */
+      1, /* ir_unop_fract */
 
       1, /* ir_unop_sin */
       1, /* ir_unop_cos */
@@ -137,6 +138,7 @@ static const char *const operator_strs[] = {
    "trunc",
    "ceil",
    "floor",
+   "fract",
    "sin",
    "cos",
    "dFdx",
index 00b0076c1728321e4ef6ef70a5ead50dfe97be58..f47813786b508f913316e6b42bc7802693776c76 100644 (file)
@@ -528,6 +528,7 @@ enum ir_expression_operation {
    ir_unop_trunc,
    ir_unop_ceil,
    ir_unop_floor,
+   ir_unop_fract,
    /*@}*/
 
    /**
index c6348ac4347fdc8ab1c814d415e3251cf66f5178..548217cddd969ee7c9cc8b8cfaf4053d645bfd27 100644 (file)
@@ -187,6 +187,24 @@ ir_constant_visitor::visit(ir_expression *ir)
       }
       break;
 
+   case ir_unop_fract:
+      for (c = 0; c < ir->operands[0]->type->components(); c++) {
+        switch (ir->type->base_type) {
+        case GLSL_TYPE_UINT:
+           data.u[c] = 0;
+           break;
+        case GLSL_TYPE_INT:
+           data.i[c] = 0;
+           break;
+        case GLSL_TYPE_FLOAT:
+           data.f[c] = op[0]->value.f[c] - floor(op[0]->value.f[c]);
+           break;
+        default:
+           assert(0);
+        }
+      }
+      break;
+
    case ir_unop_neg:
       for (c = 0; c < ir->operands[0]->type->components(); c++) {
         switch (ir->type->base_type) {
index b270e2da413db2fdc4e768e87d8c53b9d441cd93..2f2096ef97b24f4d61feea2bae1c856beb4b5b16 100644 (file)
@@ -782,6 +782,10 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
    case ir_unop_floor:
       ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]);
       break;
+   case ir_unop_fract:
+      ir_to_mesa_emit_op1(ir, OPCODE_FRC, result_dst, op[0]);
+      break;
+
    case ir_binop_min:
       ir_to_mesa_emit_op2(ir, OPCODE_MIN, result_dst, op[0], op[1]);
       break;