Mesa (master): nir: Add a nir_shader_compiler_options struct pointed to by the shaders.

Eric Anholt anholt at kemper.freedesktop.org
Wed Feb 18 22:57:22 UTC 2015


Module: Mesa
Branch: master
Commit: f90bb54734bf03be6c736812226e3f65f2e11519
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f90bb54734bf03be6c736812226e3f65f2e11519

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Feb  2 16:13:49 2015 -0800

nir: Add a nir_shader_compiler_options struct pointed to by the shaders.

This will be used to give the optimization passes a chance to customize
behavior for the particular target device.

v2: Rebase to master (no TGSI->NIR present)

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org> (v1)

---

 src/glsl/nir/glsl_to_nir.cpp |   23 ++++++++++++++++++++++-
 src/glsl/nir/nir.c           |    4 +++-
 src/glsl/nir/nir.h           |   15 +++++++++++++--
 src/mesa/main/mtypes.h       |    2 ++
 4 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
index 92cfab3..bc43a75 100644
--- a/src/glsl/nir/glsl_to_nir.cpp
+++ b/src/glsl/nir/glsl_to_nir.cpp
@@ -124,11 +124,32 @@ private:
 
 }; /* end of anonymous namespace */
 
+static const nir_shader_compiler_options default_options = {
+};
+
 nir_shader *
 glsl_to_nir(exec_list *ir, _mesa_glsl_parse_state *state,
             bool native_integers)
 {
-   nir_shader *shader = nir_shader_create(NULL);
+   const nir_shader_compiler_options *options;
+
+   if (state) {
+      struct gl_context *ctx = state->ctx;
+      struct gl_shader_compiler_options *gl_options =
+         &ctx->Const.ShaderCompilerOptions[state->stage];
+
+      if (!gl_options->NirOptions) {
+         nir_shader_compiler_options *new_options =
+            rzalloc(ctx, nir_shader_compiler_options);
+         options = gl_options->NirOptions = new_options;
+      } else {
+         options = gl_options->NirOptions;
+      }
+   } else {
+      options = &default_options;
+   }
+
+   nir_shader *shader = nir_shader_create(NULL, options);
 
    if (state) {
       shader->num_user_structures = state->num_user_structures;
diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
index b46fd30..0d8c80a 100644
--- a/src/glsl/nir/nir.c
+++ b/src/glsl/nir/nir.c
@@ -29,7 +29,7 @@
 #include <assert.h>
 
 nir_shader *
-nir_shader_create(void *mem_ctx)
+nir_shader_create(void *mem_ctx, const nir_shader_compiler_options *options)
 {
    nir_shader *shader = ralloc(mem_ctx, nir_shader);
 
@@ -40,6 +40,8 @@ nir_shader_create(void *mem_ctx)
    shader->outputs = _mesa_hash_table_create(shader, _mesa_key_hash_string,
                                              _mesa_key_string_equal);
 
+   shader->options = options;
+
    shader->num_user_structures = 0;
    shader->user_structures = NULL;
 
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index ceda977..d5253c4 100644
--- a/src/glsl/nir/nir.h
+++ b/src/glsl/nir/nir.h
@@ -1326,6 +1326,9 @@ typedef struct nir_function {
    exec_node_data(nir_function_overload, \
                   exec_list_get_head(&(func)->overload_list), node)
 
+typedef struct nir_shader_compiler_options {
+} nir_shader_compiler_options;
+
 typedef struct nir_shader {
    /** hash table of name -> uniform nir_variable */
    struct hash_table *uniforms;
@@ -1336,6 +1339,13 @@ typedef struct nir_shader {
    /** hash table of name -> output nir_variable */
    struct hash_table *outputs;
 
+   /** Set of driver-specific options for the shader.
+    *
+    * The memory for the options is expected to be kept in a single static
+    * copy by the driver.
+    */
+   const struct nir_shader_compiler_options *options;
+
    /** list of global variables in the shader */
    struct exec_list globals;
 
@@ -1361,12 +1371,13 @@ typedef struct nir_shader {
    unsigned num_inputs, num_uniforms, num_outputs;
 } nir_shader;
 
-#define nir_foreach_overload(shader, overload) \
+#define nir_foreach_overload(shader, overload)                        \
    foreach_list_typed(nir_function, func, node, &(shader)->functions) \
       foreach_list_typed(nir_function_overload, overload, node, \
                          &(func)->overload_list)
 
-nir_shader *nir_shader_create(void *mem_ctx);
+nir_shader *nir_shader_create(void *mem_ctx,
+                              const nir_shader_compiler_options *options);
 
 /** creates a register, including assigning it an index and adding it to the list */
 nir_register *nir_global_reg_create(nir_shader *shader);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 05e9575..8d2bd74 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3034,6 +3034,8 @@ struct gl_shader_compiler_options
    GLboolean OptimizeForAOS;
 
    struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */
+
+   struct nir_shader_compiler_options *NirOptions;
 };
 
 




More information about the mesa-commit mailing list