From: Jason Ekstrand Date: Thu, 29 Jan 2015 00:42:20 +0000 (-0800) Subject: nir/algebraic: Support specifying variable as constant or by type X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=70273c5cd56aa109c2870de0843f75aeeb687394;p=mesa.git nir/algebraic: Support specifying variable as constant or by type Reviewed-by: Kenneth Graunke --- 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#)?(?P\w+)(?:@(?P\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 is either an expression or a value. An expression is # defined as a tuple of the form (, , , , ) # 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 = [