glsl: propagate pragma info down into compiler from preprocessor
authorBrian Paul <brianp@vmware.com>
Wed, 14 Jan 2009 19:16:00 +0000 (12:16 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 14 Jan 2009 19:16:00 +0000 (12:16 -0700)
src/mesa/main/mtypes.h
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_codegen.h
src/mesa/shader/slang/slang_compile.c
src/mesa/shader/slang/slang_emit.c
src/mesa/shader/slang/slang_emit.h
src/mesa/shader/slang/slang_preprocess.c
src/mesa/shader/slang/slang_preprocess.h

index 3eca8a85f95515ab4db0bebb17eca5f0e0cedc71..2014745a7a805ca3dc1015f9769633ebe5db3735 100644 (file)
@@ -2094,6 +2094,13 @@ struct gl_query_state
 };
 
 
+/** Set by #pragma directives */
+struct gl_sl_pragmas
+{
+   GLboolean Optimize;  /**< defaults on */
+   GLboolean Debug;     /**< defaults off */
+};
+
 
 /**
  * A GLSL vertex or fragment shader object.
@@ -2104,12 +2111,12 @@ struct gl_shader
    GLuint Name;  /**< AKA the handle */
    GLint RefCount;  /**< Reference count */
    GLboolean DeletePending;
-
-   const GLchar *Source;  /**< Source code string */
    GLboolean CompileStatus;
+   GLboolean Main;  /**< shader defines main() */
+   const GLchar *Source;  /**< Source code string */
    struct gl_program *Program;  /**< Post-compile assembly code */
    GLchar *InfoLog;
-   GLboolean Main;  /**< shader defines main() */
+   struct gl_sl_pragmas Pragmas;
 };
 
 
index 211260449a076ae4b76c2661d50bbee12dd13000..51eb4c9c1123e9c59cba8dbf8d5ece9b21509b48 100644 (file)
@@ -4493,7 +4493,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
       n = _slang_gen_var_decl(A, var, var->initializer);
 
       /* emit GPU instructions */
-      success = _slang_emit_code(n, A->vartable, A->program, GL_FALSE, A->log);
+      success = _slang_emit_code(n, A->vartable, A->program, A->pragmas, GL_FALSE, A->log);
 
       _slang_free_ir_tree(n);
    }
@@ -4603,7 +4603,7 @@ _slang_codegen_function(slang_assemble_ctx * A, slang_function * fun)
 #endif
 
    /* Emit program instructions */
-   success = _slang_emit_code(n, A->vartable, A->program, GL_TRUE, A->log);
+   success = _slang_emit_code(n, A->vartable, A->program, A->pragmas, GL_TRUE, A->log);
    _slang_free_ir_tree(n);
 
    /* free codegen context */
index 9489033d7b82bd2028d7411a0ac27a2658be583a..f2daa034e4fb36501d01a24230f9a73183b8b84e 100644 (file)
@@ -36,6 +36,7 @@ typedef struct slang_assemble_ctx_
    slang_atom_pool *atoms;
    slang_name_space space;
    struct gl_program *program;
+   struct gl_sl_pragmas *pragmas;
    slang_var_table *vartable;
    slang_info_log *log;
    struct slang_label_ *curFuncEndLabel;
index ec27fc69dffd043aaedb48e5f3faafffa1d1e03d..04fa2e0f9318e936a5b1e97ec96d14d076da23d4 100644 (file)
@@ -144,6 +144,7 @@ typedef struct slang_output_ctx_
    slang_function_scope *funs;
    slang_struct_scope *structs;
    struct gl_program *program;
+   struct gl_sl_pragmas *pragmas;
    slang_var_table *vartable;
    GLuint default_precision[TYPE_SPECIFIER_COUNT];
    GLboolean allow_precision;
@@ -2059,6 +2060,7 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
       A.space.structs = O->structs;
       A.space.vars = O->vars;
       A.program = O->program;
+      A.pragmas = O->pragmas;
       A.vartable = O->vartable;
       A.log = C->L;
       A.curFuncEndLabel = NULL;
@@ -2349,6 +2351,7 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
    o.structs = &unit->structs;
    o.vars = &unit->vars;
    o.program = shader ? shader->Program : NULL;
+   o.pragmas = shader ? &shader->Pragmas : NULL;
    o.vartable = _slang_new_var_table(maxRegs);
    _slang_push_var_table(o.vartable);
 
@@ -2417,6 +2420,7 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
       A.space.structs = o.structs;
       A.space.vars = o.vars;
       A.program = o.program;
+      A.pragmas = &shader->Pragmas;
       A.vartable = o.vartable;
       A.log = C->L;
 
@@ -2475,7 +2479,8 @@ compile_with_grammar(grammar id, const char *source, slang_code_unit * unit,
                      slang_unit_type type, slang_info_log * infolog,
                      slang_code_unit * builtin,
                      struct gl_shader *shader,
-                     const struct gl_extensions *extensions)
+                     const struct gl_extensions *extensions,
+                     struct gl_sl_pragmas *pragmas)
 {
    byte *prod;
    GLuint size, start, version;
@@ -2504,7 +2509,7 @@ compile_with_grammar(grammar id, const char *source, slang_code_unit * unit,
    /* Now preprocess the source string. */
    slang_string_init(&preprocessed);
    if (!_slang_preprocess_directives(&preprocessed, &source[start],
-                                     infolog, extensions)) {
+                                     infolog, extensions, pragmas)) {
       slang_string_free(&preprocessed);
       slang_info_log_error(infolog, "failed to preprocess the source.");
       return GL_FALSE;
@@ -2578,7 +2583,8 @@ static GLboolean
 compile_object(grammar * id, const char *source, slang_code_object * object,
                slang_unit_type type, slang_info_log * infolog,
                struct gl_shader *shader,
-               const struct gl_extensions *extensions)
+               const struct gl_extensions *extensions,
+               struct gl_sl_pragmas *pragmas)
 {
    slang_code_unit *builtins = NULL;
    GLuint base_version = 110;
@@ -2677,7 +2683,7 @@ compile_object(grammar * id, const char *source, slang_code_object * object,
 
    /* compile the actual shader - pass-in built-in library for external shader */
    return compile_with_grammar(*id, source, &object->unit, type, infolog,
-                               builtins, shader, extensions);
+                               builtins, shader, extensions, pragmas);
 }
 
 
@@ -2701,7 +2707,7 @@ compile_shader(GLcontext *ctx, slang_code_object * object,
    _slang_code_object_ctr(object);
 
    success = compile_object(&id, shader->Source, object, type, infolog, shader,
-                            &ctx->Extensions);
+                            &ctx->Extensions, &shader->Pragmas);
    if (id != 0)
       grammar_destroy(id);
    if (!success)
index 414d3e639bf7608605868ea789fbaf5f352521c4..6b744d72c82ab86a1329eb5faedb9e2a95a5db90 100644 (file)
@@ -2377,10 +2377,20 @@ _slang_resolve_subroutines(slang_emit_info *emitInfo)
 
 
 
-
+/**
+ * Convert the IR tree into GPU instructions.
+ * \param n  root of IR tree
+ * \param vt  variable table
+ * \param prog  program to put GPU instructions into
+ * \param pragmas  controls codegen options
+ * \param withEnd  if true, emit END opcode at end
+ * \param log  log for emitting errors/warnings/info
+ */
 GLboolean
 _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
-                 struct gl_program *prog, GLboolean withEnd,
+                 struct gl_program *prog,
+                 const struct gl_sl_pragmas *pragmas,
+                 GLboolean withEnd,
                  slang_info_log *log)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -2397,7 +2407,7 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
 
    emitInfo.EmitHighLevelInstructions = ctx->Shader.EmitHighLevelInstructions;
    emitInfo.EmitCondCodes = ctx->Shader.EmitCondCodes;
-   emitInfo.EmitComments = ctx->Shader.EmitComments;
+   emitInfo.EmitComments = ctx->Shader.EmitComments || pragmas->Debug;
    emitInfo.EmitBeginEndSub = GL_TRUE;
 
    if (!emitInfo.EmitCondCodes) {
index 59fb2fa890d8d148c1fa91e8c6252c36562a31bc..8ff52bf605d650b1436378e8f0ec730ad6cd4c9a 100644 (file)
@@ -46,7 +46,9 @@ _slang_var_swizzle(GLint size, GLint comp);
 
 extern GLboolean
 _slang_emit_code(slang_ir_node *n, slang_var_table *vartable,
-                 struct gl_program *prog, GLboolean withEnd,
+                 struct gl_program *prog,
+                 const struct gl_sl_pragmas *pragmas,
+                 GLboolean withEnd,
                  slang_info_log *log);
 
 
index 244a09171c7db8f85d90d0c80e84c6df5454321a..cd79c8b94a669e159693d54082099322803cd5e6 100644 (file)
@@ -531,17 +531,53 @@ pp_ext_set(pp_ext *self, const char *name, GLboolean enable)
 }
 
 
+static void
+pp_pragmas_init(struct gl_sl_pragmas *pragmas)
+{
+   pragmas->Optimize = GL_TRUE;
+   pragmas->Debug = GL_FALSE;
+}
+
+
 /**
  * Called in response to #pragma.  For example, "#pragma debug(on)" would
  * call this function as pp_pragma("debug", "on").
- * At this time, pragmas are silently ignored.
+ * \return GL_TRUE if pragma is valid, GL_FALSE if invalid
  */
-static void
-pp_pragma(const char *pragma, const char *param)
+static GLboolean
+pp_pragma(struct gl_sl_pragmas *pragmas, const char *pragma, const char *param)
 {
 #if 0
    printf("#pragma %s %s\n", pragma, param);
 #endif
+   if (_mesa_strcmp(pragma, "optimize") == 0) {
+      if (!param)
+         return GL_FALSE; /* missing required param */
+      if (_mesa_strcmp(param, "on") == 0) {
+         pragmas->Optimize = GL_TRUE;
+      }
+      else if (_mesa_strcmp(param, "off") == 0) {
+         pragmas->Optimize = GL_FALSE;
+      }
+      else {
+         return GL_FALSE; /* invalid param */
+      }
+   }
+   else if (_mesa_strcmp(pragma, "debug") == 0) {
+      if (!param)
+         return GL_FALSE; /* missing required param */
+      if (_mesa_strcmp(param, "on") == 0) {
+         pragmas->Debug = GL_TRUE;
+      }
+      else if (_mesa_strcmp(param, "off") == 0) {
+         pragmas->Debug = GL_FALSE;
+      }
+      else {
+         return GL_FALSE; /* invalid param */
+      }
+   }
+   /* all other pragmas are silently ignored */
+   return GL_TRUE;
 }
 
 
@@ -887,7 +923,8 @@ static GLboolean
 preprocess_source (slang_string *output, const char *source,
                    grammar pid, grammar eid,
                    slang_info_log *elog,
-                   const struct gl_extensions *extensions)
+                   const struct gl_extensions *extensions,
+                   struct gl_sl_pragmas *pragmas)
 {
    static const char *predefined[] = {
       "__FILE__",
@@ -909,6 +946,7 @@ preprocess_source (slang_string *output, const char *source,
    }
 
    pp_state_init (&state, elog, extensions);
+   pp_pragmas_init (pragmas);
 
    /* add the predefined symbols to the symbol table */
    for (i = 0; predefined[i]; i++) {
@@ -1197,7 +1235,7 @@ preprocess_source (slang_string *output, const char *source,
                else {
                   param = NULL;
                }
-               pp_pragma(pragma, param);
+               pp_pragma(pragmas, pragma, param);
             }
             break;
 
@@ -1265,7 +1303,8 @@ GLboolean
 _slang_preprocess_directives(slang_string *output,
                              const char *input,
                              slang_info_log *elog,
-                             const struct gl_extensions *extensions)
+                             const struct gl_extensions *extensions,
+                             struct gl_sl_pragmas *pragmas)
 {
    grammar pid, eid;
    GLboolean success;
@@ -1281,7 +1320,7 @@ _slang_preprocess_directives(slang_string *output,
       grammar_destroy (pid);
       return GL_FALSE;
    }
-   success = preprocess_source (output, input, pid, eid, elog, extensions);
+   success = preprocess_source (output, input, pid, eid, elog, extensions, pragmas);
    grammar_destroy (eid);
    grammar_destroy (pid);
    return success;
index dd996a6314be851c7776e47c60194c1c2c134f29..f344820daefcbeb33dd8ef99f326136caa376790 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5.3
  *
- * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2005-2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009 VMware, Inc.   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -35,6 +35,7 @@ _slang_preprocess_version (const char *, GLuint *, GLuint *, slang_info_log *);
 extern GLboolean
 _slang_preprocess_directives(slang_string *output, const char *input,
                              slang_info_log *,
-                             const struct gl_extensions *extensions);
+                             const struct gl_extensions *extensions,
+                             struct gl_sl_pragmas *pragmas);
 
 #endif /* SLANG_PREPROCESS_H */