nir: Conditionalize the POW reconstruction on shader compiler options.
authorEric Anholt <eric@anholt.net>
Wed, 28 Jan 2015 00:22:54 +0000 (16:22 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 18 Feb 2015 22:47:50 +0000 (14:47 -0800)
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)
src/glsl/nir/glsl_to_nir.cpp
src/glsl/nir/nir.h
src/glsl/nir/nir_opt_algebraic.py

index bc43a7563dc4d500c84f21d9c789c1280389dc8c..544d0d93282191872deee22afe3fc51c60177e37 100644 (file)
@@ -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;
       }
index d5253c42c1966d5f7f57ced42bc63e82fc4f7095..bcc51e88ac8e89ebbc18e6a79a91d4dce3c42818 100644 (file)
@@ -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 {
index 83223f768cd3397cea92148b2d800d3e962dca8a..76917f53a4606e1b4ea3a83dc538ab821dfa1a8f 100644 (file)
@@ -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)),