diff options
| -rw-r--r-- | src/mesa/main/mtypes.h | 13 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 4 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_codegen.h | 1 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_compile.c | 16 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_emit.c | 16 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_emit.h | 4 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_preprocess.c | 53 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_preprocess.h | 7 | 
8 files changed, 90 insertions, 24 deletions
| diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 3eca8a85f9..2014745a7a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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;  }; diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 211260449a..51eb4c9c11 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -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 */ diff --git a/src/mesa/shader/slang/slang_codegen.h b/src/mesa/shader/slang/slang_codegen.h index 9489033d7b..f2daa034e4 100644 --- a/src/mesa/shader/slang/slang_codegen.h +++ b/src/mesa/shader/slang/slang_codegen.h @@ -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; diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c index ec27fc69df..04fa2e0f93 100644 --- a/src/mesa/shader/slang/slang_compile.c +++ b/src/mesa/shader/slang/slang_compile.c @@ -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) diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index 414d3e639b..6b744d72c8 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -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) { diff --git a/src/mesa/shader/slang/slang_emit.h b/src/mesa/shader/slang/slang_emit.h index 59fb2fa890..8ff52bf605 100644 --- a/src/mesa/shader/slang/slang_emit.h +++ b/src/mesa/shader/slang/slang_emit.h @@ -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); diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c index 244a09171c..cd79c8b94a 100644 --- a/src/mesa/shader/slang/slang_preprocess.c +++ b/src/mesa/shader/slang/slang_preprocess.c @@ -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; diff --git a/src/mesa/shader/slang/slang_preprocess.h b/src/mesa/shader/slang/slang_preprocess.h index dd996a6314..f344820dae 100644 --- a/src/mesa/shader/slang/slang_preprocess.h +++ b/src/mesa/shader/slang/slang_preprocess.h @@ -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 */ | 
