<p dir="ltr">Acked-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>></p>
<div class="gmail_quote">On Mar 6, 2015 2:18 AM, "Kenneth Graunke" <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The code in glsl_to_nir is entirely dead, as we translate from GLSL to<br>
NIR at link time, when there isn't a _mesa_glsl_parse_state to pass,<br>
so every caller passes NULL.<br>
<br>
glsl_to_nir seems like the wrong place to try and create the shader<br>
compiler options structure anyway - tgsi_to_nir, prog_to_nir, and other<br>
translators all would have to duplicate that code.  The driver should<br>
set this up once with whatever settings it wants, and pass it in.<br>
<br>
Eric also added a NirOptions field to ctx->Const.ShaderCompilerOptions[]<br>
and left a comment saying: "The memory for the options is expected to be<br>
kept in a single static copy by the driver."  This suggests the plan was<br>
to do exactly that.  That pointer was not marked const, however, and the<br>
dead code used a mix of static structures and ralloced ones.<br>
<br>
This patch deletes the dead code in glsl_to_nir, instead making it take<br>
the shader compiler options as a mandatory argument.  It creates an<br>
(empty) options struct in the i965 driver, and makes NirOptions point<br>
to that.  It marks the pointer const so that we can actually do so<br>
without generating "discards const qualifier" compiler warnings.<br>
<br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
Cc: Eric Anholt <<a href="mailto:eric@anholt.net">eric@anholt.net</a>><br>
---<br>
 src/glsl/nir/glsl_to_nir.cpp             | 28 ++--------------------------<br>
 src/glsl/nir/glsl_to_nir.h               |  4 ++--<br>
 src/mesa/drivers/dri/i965/brw_context.c  |  5 +++++<br>
 src/mesa/drivers/dri/i965/brw_fs_nir.cpp |  5 ++++-<br>
 src/mesa/main/mtypes.h                   |  2 +-<br>
 5 files changed, 14 insertions(+), 30 deletions(-)<br>
<br>
Eric, does this look reasonable to you?<br>
<br>
diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp<br>
index b82e5c7..7e40ef4 100644<br>
--- a/src/glsl/nir/glsl_to_nir.cpp<br>
+++ b/src/glsl/nir/glsl_to_nir.cpp<br>
@@ -124,34 +124,10 @@ private:<br>
<br>
 }; /* end of anonymous namespace */<br>
<br>
-static const nir_shader_compiler_options default_options = {<br>
-};<br>
-<br>
 nir_shader *<br>
-glsl_to_nir(exec_list *ir, _mesa_glsl_parse_state *state,<br>
-            bool native_integers)<br>
+glsl_to_nir(exec_list *ir, bool native_integers,<br>
+            const nir_shader_compiler_options *options)<br>
 {<br>
-   const nir_shader_compiler_options *options;<br>
-<br>
-   if (state) {<br>
-      struct gl_context *ctx = state->ctx;<br>
-      struct gl_shader_compiler_options *gl_options =<br>
-         &ctx->Const.ShaderCompilerOptions[state->stage];<br>
-<br>
-      if (!gl_options->NirOptions) {<br>
-         nir_shader_compiler_options *new_options =<br>
-            rzalloc(ctx, nir_shader_compiler_options);<br>
-         options = gl_options->NirOptions = new_options;<br>
-<br>
-         if (gl_options->EmitNoPow)<br>
-            new_options->lower_fpow = true;<br>
-      } else {<br>
-         options = gl_options->NirOptions;<br>
-      }<br>
-   } else {<br>
-      options = &default_options;<br>
-   }<br>
-<br>
    nir_shader *shader = nir_shader_create(NULL, options);<br>
<br>
    nir_visitor v1(shader, native_integers);<br>
diff --git a/src/glsl/nir/glsl_to_nir.h b/src/glsl/nir/glsl_to_nir.h<br>
index 58b2cee..7300945 100644<br>
--- a/src/glsl/nir/glsl_to_nir.h<br>
+++ b/src/glsl/nir/glsl_to_nir.h<br>
@@ -32,8 +32,8 @@<br>
 extern "C" {<br>
 #endif<br>
<br>
-nir_shader *glsl_to_nir(exec_list * ir, _mesa_glsl_parse_state *state,<br>
-                        bool native_integers);<br>
+nir_shader *glsl_to_nir(exec_list *ir, bool native_integers,<br>
+                        const nir_shader_compiler_options *options);<br>
<br>
 #ifdef __cplusplus<br>
 }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c<br>
index 786e6f5..892d4ca 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_context.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_context.c<br>
@@ -68,6 +68,8 @@<br>
 #include "tnl/t_pipeline.h"<br>
 #include "util/ralloc.h"<br>
<br>
+#include "glsl/nir/nir.h"<br>
+<br>
 /***************************************<br>
  * Mesa's Driver Functions<br>
  ***************************************/<br>
@@ -549,6 +551,8 @@ brw_initialize_context_constants(struct brw_context *brw)<br>
       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 128;<br>
    }<br>
<br>
+   static const nir_shader_compiler_options nir_options = {};<br>
+<br>
    /* We want the GLSL compiler to emit code that uses condition codes */<br>
    for (int i = 0; i < MESA_SHADER_STAGES; i++) {<br>
       ctx->Const.ShaderCompilerOptions[i].MaxIfDepth = brw->gen < 6 ? 16 : UINT_MAX;<br>
@@ -562,6 +566,7 @@ brw_initialize_context_constants(struct brw_context *brw)<br>
         (i == MESA_SHADER_FRAGMENT);<br>
       ctx->Const.ShaderCompilerOptions[i].EmitNoIndirectUniform = false;<br>
       ctx->Const.ShaderCompilerOptions[i].LowerClipDistance = true;<br>
+      ctx->Const.ShaderCompilerOptions[i].NirOptions = &nir_options;<br>
    }<br>
<br>
    ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].OptimizeForAOS = true;<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
index a0300aa..e24bf92 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
@@ -82,9 +82,12 @@ count_nir_instrs(nir_shader *nir)<br>
 void<br>
 fs_visitor::emit_nir_code()<br>
 {<br>
+   const nir_shader_compiler_options *options =<br>
+      ctx->Const.ShaderCompilerOptions[stage].NirOptions;<br>
+<br>
    /* first, lower the GLSL IR shader to NIR */<br>
    lower_output_reads(shader-><a href="http://base.ir" target="_blank">base.ir</a>);<br>
-   nir_shader *nir = glsl_to_nir(shader-><a href="http://base.ir" target="_blank">base.ir</a>, NULL, true);<br>
+   nir_shader *nir = glsl_to_nir(shader-><a href="http://base.ir" target="_blank">base.ir</a>, true, options);<br>
    nir_validate_shader(nir);<br>
<br>
    nir_lower_global_vars_to_local(nir);<br>
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h<br>
index efeee8b..c43c6ac 100644<br>
--- a/src/mesa/main/mtypes.h<br>
+++ b/src/mesa/main/mtypes.h<br>
@@ -3036,7 +3036,7 @@ struct gl_shader_compiler_options<br>
<br>
    struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */<br>
<br>
-   struct nir_shader_compiler_options *NirOptions;<br>
+   const struct nir_shader_compiler_options *NirOptions;<br>
 };<br>
<br>
<br>
--<br>
2.2.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>