diff options
author | Ian Romanick <[email protected]> | 2016-07-12 10:53:11 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-08-30 16:28:02 -0700 |
commit | 90da8bf5477cb65b9f2e5148c05ef621a09b704f (patch) | |
tree | 8968fcdd24299f783560053059a38c743ccf0fcc | |
parent | 0f87c54d1c6ae022c9884283052a7de9d6eec710 (diff) |
glsl: Generate code for constant ir_binop_ldexp expressions
ldexp is weird because its two operands have different types. Add
support for directly specifying the exact signatures of all the possible
variations of an operation.
v2: Use tuple() instead of () for clarity. Suggested by Dylan.
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Acked-by: Dylan Baker <[email protected]>
-rw-r--r-- | src/compiler/glsl/ir_expression_operation.py | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py index 394626b503f..b3f60a47c7f 100644 --- a/src/compiler/glsl/ir_expression_operation.py +++ b/src/compiler/glsl/ir_expression_operation.py @@ -202,7 +202,7 @@ types_identical_operation = "identical" non_assign_operation = "nonassign" class operation(object): - def __init__(self, name, num_operands, printable_name = None, source_types = None, dest_type = None, c_expression = None, flags = None): + def __init__(self, name, num_operands, printable_name = None, source_types = None, dest_type = None, c_expression = None, flags = None, all_signatures = None): self.name = name self.num_operands = num_operands @@ -211,7 +211,13 @@ class operation(object): else: self.printable_name = printable_name - self.source_types = source_types + self.all_signatures = all_signatures + + if source_types is None: + self.source_types = tuple() + else: + self.source_types = source_types + self.dest_type = dest_type if c_expression is None: @@ -261,6 +267,8 @@ class operation(object): return constant_template0.render(op=self) elif self.dest_type is not None: return constant_template5.render(op=self) + else: + return constant_template3.render(op=self) return None @@ -276,7 +284,10 @@ class operation(object): def signatures(self): - return type_signature_iter(self.dest_type, self.source_types, self.num_operands) + if self.all_signatures is not None: + return self.all_signatures + else: + return type_signature_iter(self.dest_type, self.source_types, self.num_operands) ir_expression_operation = [ @@ -469,7 +480,11 @@ ir_expression_operation = [ operation("ubo_load", 2), # Multiplies a number by two to a power, part of ARB_gpu_shader5. - operation("ldexp", 2), + operation("ldexp", 2, + all_signatures=((float_type, (float_type, int_type)), + (double_type, (double_type, int_type))), + c_expression={'f': "ldexpf_flush_subnormal({src0}, {src1})", + 'd': "ldexp_flush_subnormal({src0}, {src1})"}), # Extract a scalar from a vector # |