}; /* 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;
#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);
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;
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;
/** 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;
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);