nir/algebraic: Support specifying variable as constant or by type
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 29 Jan 2015 00:42:20 +0000 (16:42 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 30 Jan 2015 01:07:45 +0000 (17:07 -0800)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/nir/nir_algebraic.py
src/glsl/nir/nir_opt_algebraic.py

index 75436f42ccc4c824e7e89bf6ac9cdb99c0bbf149..ea7f5fc65f91bfa9fd7148cac36c53a5b458c1f4 100644 (file)
@@ -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):
index 122555bb4f668227e238ce6f9221d0f9328420f7..210c40dd15882c247d57ec4777e8d7ab4b41cf28 100644 (file)
@@ -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 = [