Mesa has a shader compiler struct flagging whether GLSL IR's opt_algebraic and other passes should try and generate certain types of opcodes or patterns. Extend that to NIR by defining our own struct, which is automatically generated from the Mesa struct in glsl_to_nir and provided directly by the driver in TGSI-to-NIR. v2: Split out the previous two prep patches. v3: Rebase to master (no TGSI->NIR present) Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> (v2)tags/10.6-branchpoint
@@ -142,6 +142,9 @@ glsl_to_nir(exec_list *ir, _mesa_glsl_parse_state *state, | |||
nir_shader_compiler_options *new_options = | |||
rzalloc(ctx, nir_shader_compiler_options); | |||
options = gl_options->NirOptions = new_options; | |||
if (gl_options->EmitNoPow) | |||
new_options->lower_fpow = true; | |||
} else { | |||
options = gl_options->NirOptions; | |||
} |
@@ -1327,6 +1327,7 @@ typedef struct nir_function { | |||
exec_list_get_head(&(func)->overload_list), node) | |||
typedef struct nir_shader_compiler_options { | |||
bool lower_fpow; | |||
} nir_shader_compiler_options; | |||
typedef struct nir_shader { |
@@ -118,8 +118,8 @@ optimizations = [ | |||
(('fexp', ('flog', a)), a), # e^ln(a) = a | |||
(('flog2', ('fexp2', a)), a), # lg2(2^a) = a | |||
(('flog', ('fexp', a)), a), # ln(e^a) = a | |||
(('fexp2', ('fmul', ('flog2', a), b)), ('fpow', a, b)), # 2^(lg2(a)*b) = a^b | |||
(('fexp', ('fmul', ('flog', a), b)), ('fpow', a, b)), # e^(ln(a)*b) = a^b | |||
(('fexp2', ('fmul', ('flog2', a), b)), ('fpow', a, b), '!options->lower_fpow'), # 2^(lg2(a)*b) = a^b | |||
(('fexp', ('fmul', ('flog', a), b)), ('fpow', a, b), '!options->lower_fpow'), # e^(ln(a)*b) = a^b | |||
(('fpow', a, 1.0), a), | |||
(('fpow', a, 2.0), ('fmul', a, a)), | |||
(('fpow', 2.0, a), ('fexp2', a)), |