diff options
author | Ian Romanick <[email protected]> | 2010-11-18 11:05:32 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-11-19 15:00:25 -0800 |
commit | f2616e56de8a48360cae8f269727b58490555f4d (patch) | |
tree | 56462288844e777618344e9f7830b5c3eb1f1f02 /src/glsl | |
parent | 04ffbe1ac6a82ac5cce843afa15ffdfa4ef78103 (diff) |
glsl: Add ir_unop_sin_reduced and ir_unop_cos_reduced
The operate just like ir_unop_sin and ir_unop_cos except that they
expect their inputs to be limited to the range [-pi, pi]. Several
GPUs require this limited range for their sine and cosine
instructions, so having these as operations (along with a to-be-written
lowering pass) helps this architectures.
These new operations also matche the semantics of the
GL_ARB_fragment_program SCS instruction. Having these as operations
helps in generating GLSL IR directly from assembly fragment programs.
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/ir.cpp | 2 | ||||
-rw-r--r-- | src/glsl/ir.h | 2 | ||||
-rw-r--r-- | src/glsl/ir_constant_expression.cpp | 2 | ||||
-rw-r--r-- | src/glsl/ir_validate.cpp | 2 |
4 files changed, 8 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 574ef3e1832..714826343c7 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -239,6 +239,8 @@ static const char *const operator_strs[] = { "round_even", "sin", "cos", + "sin_reduced", + "cos_reduced", "dFdx", "dFdy", "noise", diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 3ea7301f472..2b94e63cc2c 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -729,6 +729,8 @@ enum ir_expression_operation { /*@{*/ ir_unop_sin, ir_unop_cos, + ir_unop_sin_reduced, /**< Reduced range sin. [-pi, pi] */ + ir_unop_cos_reduced, /**< Reduced range cos. [-pi, pi] */ /*@}*/ /** diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp index 8a54fc78cca..45860b279fb 100644 --- a/src/glsl/ir_constant_expression.cpp +++ b/src/glsl/ir_constant_expression.cpp @@ -216,6 +216,7 @@ ir_expression::constant_expression_value() break; case ir_unop_sin: + case ir_unop_sin_reduced: assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); for (unsigned c = 0; c < op[0]->type->components(); c++) { data.f[c] = sinf(op[0]->value.f[c]); @@ -223,6 +224,7 @@ ir_expression::constant_expression_value() break; case ir_unop_cos: + case ir_unop_cos_reduced: assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); for (unsigned c = 0; c < op[0]->type->components(); c++) { data.f[c] = cosf(op[0]->value.f[c]); diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index 77f48968b81..2a066c1a277 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -273,6 +273,8 @@ ir_validate::visit_leave(ir_expression *ir) case ir_unop_fract: case ir_unop_sin: case ir_unop_cos: + case ir_unop_sin_reduced: + case ir_unop_cos_reduced: case ir_unop_dFdx: case ir_unop_dFdy: assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); |