diff options
author | Jason Ekstrand <[email protected]> | 2015-01-28 16:42:20 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2015-01-29 17:07:45 -0800 |
commit | 70273c5cd56aa109c2870de0843f75aeeb687394 (patch) | |
tree | 5ee77cbdd3bdc15aa3f65efd8aca53ece44c12e3 /src | |
parent | 81f77e4f3a070ef9041c50495fd010e56c08cc6a (diff) |
nir/algebraic: Support specifying variable as constant or by type
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/nir/nir_algebraic.py | 20 | ||||
-rw-r--r-- | src/glsl/nir/nir_opt_algebraic.py | 12 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/glsl/nir/nir_algebraic.py b/src/glsl/nir/nir_algebraic.py index 75436f42ccc..ea7f5fc65f9 100644 --- a/src/glsl/nir/nir_algebraic.py +++ b/src/glsl/nir/nir_algebraic.py @@ -28,6 +28,7 @@ import itertools import struct import sys import mako.template +import re # Represents a set of variables, each with a unique id class VarSet(object): @@ -65,6 +66,8 @@ static const ${val.c_type} ${val.name} = { { ${hex(val)} /* ${val.value} */ }, % elif isinstance(val, Variable): ${val.index}, /* ${val.var_name} */ + ${'true' if val.is_constant else 'false'}, + nir_type_${ val.required_type or 'invalid' }, % elif isinstance(val, Expression): nir_op_${val.opcode}, { ${', '.join(src.c_ptr for src in val.sources)} }, @@ -111,12 +114,23 @@ class Constant(Value): else: assert False +_var_name_re = re.compile(r"(?P<const>#)?(?P<name>\w+)(?:@(?P<type>\w+))?") + class Variable(Value): def __init__(self, val, name, varset): Value.__init__(self, name, "variable") - self.var_name = val - self.index = varset[val] - self.name = name + + m = _var_name_re.match(val) + assert m and m.group('name') is not None + + self.var_name = m.group('name') + self.is_constant = m.group('const') is not None + self.required_type = m.group('type') + + if self.required_type is not None: + assert self.required_type in ('float', 'bool', 'int', 'unsigned') + + self.index = varset[self.var_name] class Expression(Value): def __init__(self, expr, name_base, varset): diff --git a/src/glsl/nir/nir_opt_algebraic.py b/src/glsl/nir/nir_opt_algebraic.py index 122555bb4f6..210c40dd158 100644 --- a/src/glsl/nir/nir_opt_algebraic.py +++ b/src/glsl/nir/nir_opt_algebraic.py @@ -36,9 +36,15 @@ d = 'd' # and <replace> is either an expression or a value. An expression is # defined as a tuple of the form (<op>, <src0>, <src1>, <src2>, <src3>) # where each source is either an expression or a value. A value can be -# either a numeric constant or a string representing a variable name. For -# constants, you have to be careful to make sure that it is the right type -# because python is unaware of the source and destination types of the +# either a numeric constant or a string representing a variable name. +# +# Variable names are specified as "[#]name[@type]" where "#" inicates that +# the given variable will only match constants and the type indicates that +# the given variable will only match values from ALU instructions with the +# given output type. +# +# For constants, you have to be careful to make sure that it is the right +# type because python is unaware of the source and destination types of the # opcodes. optimizations = [ |